全部產品
Search
文件中心

Container Service for Kubernetes:通過MSE Ingress訪問Container Service

更新時間:Jun 19, 2024

MSE Ingress是基於阿里雲MSE雲原生網關構建的Ingress服務,相容Nginx Ingress以及Nginx Ingress Annotation,支援多服務版本同時灰階發布、靈活的服務治理能力以及全方位的安全防護保障,能夠滿足大規模雲原生分布式應用的流量治理訴求。本文介紹如何通過MSE Ingress訪問Container Service。

前提條件

背景資訊

在Container Service領域,您可以通過定義Ingress資源來管理對外暴露的內部服務。Ingress是允許訪問叢集內Service的規則集合,您可以在目標Container Service叢集定義Ingress資源來配置轉寄規則,實現不同URL訪問叢集內不同的Service。

Ingress指流量治理規則,而Ingress Controller是Ingress資源的實施者,其中Nginx Ingress Controller較為常見。但Nginx Ingress Controller無法滿足雲原生應用服務對複雜業務路由、多種應用程式層協議(例如Dubbo和QUIC)、大規模七層流量能力的需求。

MSE Ingress是阿里雲推出的下一代網關,具備低成本、安全、高整合和高可用的產品優勢。關於MSE Ingress的介紹和工作原理,請參見MSE Ingress概覽

步驟一:通過MseIngressConfig配置MSE雲原生網關執行個體

MseIngressConfig是由MSE Ingress Controller提供的CRD資源,MSE Ingress Controller使用MseIngressConfig來管理MSE雲原生網關執行個體的生命週期以及全域配置。

重要
  • 一個MseIngressConfig對應一個MSE雲原生網關執行個體,如果您需要使用多個MSE雲原生網關執行個體,需要建立多MseIngressConfig配置。

  • 複用情境外,刪除MseIngressConfig配置,會串聯刪除對應的MSE雲原生網關執行個體。

執行以下命令,建立一個執行個體名稱為mse-ingress,該執行個體包含3個2c4g副本,且交換器、SLB和安全性群組等其他資訊會取預設值。更多關於MseIngressConfig的配置資訊,請參見MseIngressConfig說明

說明
  1. 交換器若未設定時,則預設取MSE Ingress Controller被調度到的K8s Node節點所在的交換器,導致被建立的MSE雲原生網關執行個體處於單交換器模式,生產環境建議手動設定兩個交換器。

  2. SLB未設定時,則預設為MSE雲原生網關建立一個slb.s2.small規格的公網SLB。

  3. 安全性群組未設定時,則預設為MSE雲原生網關建立普通類型的安全性群組。

cat << EOF | kubectl apply -f -
apiVersion: mse.alibabacloud.com/v1alpha1
kind: MseIngressConfig
metadata:
  name: test
spec:
  name: mse-ingress
  common:
    instance:
      spec: 2c4g
      replicas: 3
EOF

以上Spec中出現的配置項說明如下:

參數

說明

是否可選

樣本值

spec.name

MSE雲原生網關執行個體名稱。

可選

mse-ingress

spec.common.instance.spec

MSE雲原生網關執行個體的規格。預設為4c8g。

可選

2c4g

spec.common.instance.replicas

MSE雲原生網關執行個體的副本數。預設為3個。

可選

3

步驟二:配置IngressClass

目前,MSE Ingress支援兩種方式配置IngressClass,您可以根據實際的業務情境選擇對應的方式。

  • 通過K8s IngressClass資源方式

    通過標準的K8s IngressClass資源為MSE Ingress配置IngressClass,該方式適用於新業務接入MSE Ingress的情境。

  • 通過MseIngressConfig資源方式

    通過MseIngressConfig中Ingress相關的配置為MSE Ingress配置IngressClass,該方式適用於從其他Ingress(如Nginx Ingress)遷移至MSE Ingress的情境。因為一個K8s叢集中只能有一個同名的IngressClass資源,而遷移時需要Nginx Ingress和MSE Ingress同時監聽相同的IngressClass,所以MSE Ingress額外提供了通過MseIngressConfig資源方式配置IngressClass。

通過K8s IngressClass資源方式

IngressClass是Ingress處理器的描述,用於在K8s叢集中聲明一個Ingress處理器實現,關聯該IngressClass的Ingress資源會被該Ingress處理器解析。此外,需要通過IngressClass的Parameter欄位關聯一個MseIngressConfig(MSE雲原生網關),用於實施被解析的Ingress資源描述的流量管理規則。

執行以下命令,建立IngressClass資源,並在spec.parameters中關聯步驟一:通過MseIngressConfig配置MSE雲原生網關執行個體建立的MseIngressConfig配置。

1.19之前版本叢集

cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: mse
spec:
  controller: mse.alibabacloud.com/ingress
  parameters:
    apiGroup: mse.alibabacloud.com
    kind: MseIngressConfig
    name: test
EOF

1.19及之後版本叢集

cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: mse
spec:
  controller: mse.alibabacloud.com/ingress
  parameters:
    apiGroup: mse.alibabacloud.com
    kind: MseIngressConfig
    name: test
EOF

通過MseIngressConfig資源方式

主要適用於遷移的情境,或者是無法建立IngressClass資源的情境。您可以通過MseIngressConfig中Ingress相關的配置,為MSE Ingress配置IngressClass。

比如,修改步驟一建立的MseIngressConfig配置,配置IngressClass為mse。

apiVersion: mse.alibabacloud.com/v1alpha1
kind: MseIngressConfig
metadata:
  name: test
spec:
  name: mse-ingress
  common:
    instance:
      spec: 2c4g
      replicas: 3
  ingress:
    local:
      ingressClass: mse

參數

說明

ingress

ingress的監聽配置。

ingress.local

為雲原生網關配置當前Container Service叢集的Ingress的監聽配置。

ingress.local.ingressClass

雲原生網關監聽叢集中具體IngressClass下的Ingress資源,可選值如下所示。

  • 未配置:不監聽任何Ingress資源。

  • 配置為mse:監聽IngressClass為mse的Ingress資源。

  • 配置為空白"":監聽所有Ingress資源。

  • 配置為nginx:監聽IngressClass為nginx或者未關聯任何IngressClass的Ingress資源。

  • 配置為其他值:監聽IngressClass為指定值的Ingress資源。

說明

該配置的優先順序低於使用者通過IngressClass資源關聯MseIngressConfig的方式。

驗證IngressClass配置成功

執行以下命令,查詢MseIngressConfig的狀態。當狀態顯示為 Listening時,表示雲原生網關建立成功並且處於運行狀態。並自動監聽叢集中IngressClass為mse的Ingress資源。

kubectl get MseIngressConfig test

預期結果為:

NAME   STATUS      AGE
test   Listening   3m15s
說明

MseIngressConfig會按照Pending >Running > Listening的狀態依次變化。各狀態說明如下:

  • Pending :表示雲原生網關正在建立中,需等待3min左右。

  • Running :表示雲原生網關建立成功,並處於運行狀態。

  • Listening:表示雲原生處於運行狀態,並監聽叢集中Ingress資源。

  • Failed:表示雲原生網關處於非法狀態,可以查看Status欄位中Message來進一步明確原因。

步驟三:通過MSE Ingress訪問Container Service

  1. 執行以下命令,部署以下後端服務go-httpbin。

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: go-httpbin
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: go-httpbin
      template:
        metadata:
          labels:
            app: go-httpbin
            version: v1
        spec:
          containers:
            - image: specialyang/go-httpbin:v3
              args:
                - "--port=8090"
                - "--version=v1"
              imagePullPolicy: Always
              name: go-httpbin
              ports:
                - containerPort: 8090
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: go-httpbin
      namespace: default
    spec:
      ports:
        - port: 80
          targetPort: 8090
          protocol: TCP
      selector:
        app: go-httpbin
    EOF
  2. 執行以下命令,建立Ingress資源。代碼中網域名稱example.com下的/version路由規則暴露後端服務go-httpbin。

    1.19之前版本叢集

    cat << EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress
      namespace: default
    spec:
      ingressClassName: mse
      rules:
       - host: example.com
         http:
          paths:
          - path: /version
            backend:
              serviceName: go-httpbin
              servicePort: 80
    EOF

    1.19及之後版本叢集

    cat << EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress
      namespace: default
    spec:
      ingressClassName: mse
      rules:
      - host: example.com 
        http:
          paths:
          - backend:
              service:
                name: go-httpbin
                port:
                  number: 80
            path: /version
            pathType: Prefix
    EOF
  3. 查看目標Ingress的IP地址。

    kubectl get ingress ingress

    預期輸出:

    NAME      CLASS   HOSTS            ADDRESS         PORTS   AGE
    ingress   mse     example.com      114.55.XX.XX   80      12m
  4. 執行以下命令,進行訪問測試。

    curl -H "host: example.com" 114.55.XX.XX/version

    預期輸出:

    version:v1