全部產品
Search
文件中心

Container Service for Kubernetes:管理南北流量

更新時間:Nov 09, 2024

ACK One ALB多叢集網關是ALB Ingress的多叢集模式,可以快速實現同城應用多活容災、流量多叢集負載平衡、基於Header路由流量到指定叢集等能力。本文介紹如何通過ALB Ingress管理多叢集應用的南北流量。

前提條件

步驟一:在艦隊中通過kubectl建立ALB多叢集網關

通過在ACK One艦隊中建立AlbConfig對象來建立一個ACK One ALB多叢集網關,並將ALB多叢集網關添加至關聯集群。

  1. 從ACK One艦隊所在VPC,擷取兩個虛擬交換器ID。

  2. 使用以下內容,建立gateway.yaml檔案。

    說明
    • 請將${vsw-id1}${vsw-id2}替換為您上一步擷取的交換器ID,${cluster1}${cluster2}替換為您待添加的關聯集群ID。

    • 子叢集${cluster1}${cluster2}的安全性群組的入方向需要允許該交換器網段的IP和所有連接埠通過。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: ackone-gateway-demo
      annotations:
        # 添加要處理流量的關聯集群到ALB多叢集執行個體。
        alb.ingress.kubernetes.io/remote-clusters: ${cluster1},${cluster2}
    spec:
      config:
        name: one-alb-demo
        addressType: Internet
        addressAllocatedMode: Fixed
        zoneMappings:
        - vSwitchId: ${vsw-id1}
        - vSwitchId: ${vsw-id2}
      listeners:
      - port: 8001
        protocol: HTTP
    ---
    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: alb
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: ackone-gateway-demo

    需要同步的參數及其說明如下表所示:

    參數

    是否必填

    說明

    metadata.name

    AlbConfig的名稱。

    metadata.annotations:

    alb.ingress.kubernetes.io/remote-clusters

    表示待添加到ALB多叢集網關的關聯集群列表。此處所填的是已經關聯到艦隊執行個體的叢集ID。

    spec.config.name

    ALB執行個體的名稱。

    spec.config.addressType

    ALB執行個體的網路類型。取值如下:

    • Internet(預設值):公網類型。面向公網提供應用型負載平衡服務,公網可訪問。

      說明

      應用型負載平衡通過綁定Elastic IP Address進行公網服務,使用公網類型ALB執行個體將收取Elastic IP Address的執行個體費與頻寬、流量費用,詳情參見隨用隨付

      Intranet:私網類型。面向VPC內部提供應用型負載平衡服務,公網不可訪問。

    spec.config.zoneMappings

    設定ALB交換器ID。建立交換器具體操作請參見建立和管理交換器

    說明
    • 指定的交換器必須在ALB當前所支援的可用性區域內,且與叢集處於同一VPC。關於ALB支援的地區與可用性區域,請參見ALB支援的地區與可用性區域

    • 應用型負載平衡支援多可用性區域部署,若當前地區支援2個及以上可用性區域,為保障業務高可用,請至少選擇2個或以上不同可用性區域的交換器。

    spec.listeners

    配置ALB的監聽連接埠和協議。本文配置樣本為連接埠8001的HTTP監聽。

    監聽定義了流量進入負載平衡的方式和規則,此處建議保留該配置,否則您需要另行建立監聽才可使用ALB Ingress。

  3. 執行以下命令,部署gateway.yaml,建立ALB多叢集網關和IngressClass。

    kubectl apply -f gateway.yaml
  4. 執行以下命令,查看ALB多叢集網關是否建立成功(1~3min)。

    kubectl get albconfig ackone-gateway-demo

    預期輸出如下:

    NAME      		      ALBID      DNSNAME                               PORT&PROTOCOL   CERTID   AGE
    ackone-gateway-demo           alb-xxxx   alb-xxxx.<regionid>.alb.aliyuncs.com                           4d9h
  5. 確認關聯集群是否添加成功,執行以下命令查看狀態。

    kubectl get albconfig ackone-gateway-demo -ojsonpath='{.status.loadBalancer.subClusters}'

    預期輸出為叢集ID列表。

步驟二:通過Ingress實現不同情境下的調度流量

通過在Ingress中指定IngressClass來使用ALB Ingress,可以使用不同的Annotation實現不同的流量管理能力。ALB Ingress可以支援常用的Nginx-Ingress註解,還有針對ALB自身模型的強化功能。ALB Ingress的全量配置可以參考 ALB Ingress配置詞典。下文以部分典型的多叢集流量管理情境為例說明。

樣本1:預設負載平衡到所有服務後端

不同叢集按照副本數分配流量。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
  name: alb-ingress
  namespace: demo
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

樣本2:流量僅路由到指定叢集

通過alb.ingress.kubernetes.io/cluster-weight.{clusterID} 動態註解指定叢集,若指定的叢集不存在,則會被自動跳過。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
    alb.ingress.kubernetes.io/cluster-weight.c63a55242bdb342ed9cbd3ab3b1a9904c: "100"
  name: alb-ingress
  namespace: demo
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

樣本3:根據Header將流量路由到指定叢集

  • 通過alb.ingress.kubernetes.io/cluster-weight.{clusterID}動態註解指定叢集,若指定的叢集不存在,則會被自動跳過。

  • 通過alb.ingress.kubernetes.io/condition.{backend.service.name}動態註解來注入要求標頭參數,您可以根據請求的頭部資訊來控制流程量的路由。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
    alb.ingress.kubernetes.io/conditions.service1: |
     [{
       "type": "Header",
       "headerConfig": {
          "key":"stage",
           "values": [
              "gray"
           ]
       }
      }]
    alb.ingress.kubernetes.io/cluster-weight.c63a55242bdb342ed9cbd3ab3b1a9904c: "100"
  name: alb-ingress
  namespace: demo
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80

樣本4:根據權重進行流量路由

通過alb.ingress.kubernetes.io/cluster-weight註解對多後端服務進行流量分配,權重之和必須等於100。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
    alb.ingress.kubernetes.io/cluster-weight.c63a55242bdb342ed9cbd3ab3b1a9904c: "60"
    alb.ingress.kubernetes.io/cluster-weight.cd174e5d9394b4b4a8728f08d16203793: "40"
  name: alb-ingress
  namespace: demo
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 80