全部產品
Search
文件中心

Server Load Balancer:如何通過自建Kubernetes叢集使用ALB Ingress

更新時間:Nov 26, 2024

本文指導您如何在阿里雲雲上自建的Kubernetes叢集中通過ALB Ingress,來使用阿里雲應用型負載平衡ALB(Application Load Balancer)產品。

情境樣本

本文以下圖情境為例。您已依託阿里雲雲上資源自建Kubernetes叢集,並希望該叢集可以通過ALB Ingress轉寄請求。

您可以通過在自建Kubernetes叢集中部署alb-ingress-controller,並建立Ingress和Service資源;alb-ingress-controller會根據Kubernetes叢集內的服務配置,將Ingress以轉寄規則的形式同步到ALB上,同時會通過監聽叢集的APIServer來觀察Ingress的後續變更,並將相應的變化同步到ALB上。ALB感知到變化會動態地將相應流量轉寄到叢集內對應的Pod上。更多資訊,請參見ALB Ingress概述

ALB Ingress情境樣本

注意事項

  • 如果您使用的是Overlay類型的網路外掛程式,如Flannel,則ALB Ingress後端Service服務僅支援NodePort和LoadBalancer類型。

  • AlbConfig、Namespace、Ingress和Service這些資源的名稱不能以aliyun開頭。

前提條件

  • 您已擁有阿里雲雲上自建Kubernetes v1.20版本以上叢集,並可通過kubectl工具串連該叢集。關於如何下載和安裝kubectl工具,請參見安裝和設定kubectl

  • 您已為雲上自建叢集開啟SNAT公網訪問能力。具體操作,請參見使用公網NAT GatewaySNAT功能訪問互連網

  • 雲上自建的叢集使用controller鏡像時,請注意:

配置步驟

配置步驟

以下步驟涉及檔案修改,請您瞭解對應的檔案名稱和用途。

步驟

檔案名稱

檔案用途

步驟一:部署alb-ingress-controller

load-balancer-controller.yaml

基於模板修改

用於部署alb-ingress-controller

步驟二:建立AlbConfig及IngressClass資源

alb.yaml

自建並修改

用於建立albconfig及ingressClass資源,並同步完成ALB執行個體的建立

步驟三:部署測試應用

test-service.yaml

自建並修改

用於部署測試服務

步驟四:建立Ingress

test-ingress.yaml

自建並修改

用於建立Ingress

步驟一:部署alb-ingress-controller

說明

受電訊廠商網路的影響,拉取Deployment鏡像可能出現拉取失敗的情況。為此,您可以使用私人鏡像,根據開來源文件如何從源碼進行controller的部署自行編譯上傳。

本文中alb-ingress-controller使用InCluster模式啟動,通過配置監聽Service、Endpoint、Node等資源的許可權,使用load-balancer-controller.yaml檔案部署alb-ingress-controller,相關的ServiceAccount、Deployment、ConfigMap已經預置,您只需要針對實際情況執行以下修改。

  1. 修改load-balancer-controller.yaml檔案,將Deployment對應的鏡像修改為可用的鏡像地址。

    load-balancer-controller.yaml檔案用於部署alb-ingress-controller。

    修改前:

    image: ${path/to/your/image/registry}

    修改後:

    image: alibabacloudslb/alibaba-load-balancer-controller:v1.2.0  #已完成x86編譯的鏡像
  2. 修改load-balancer-controller.yaml檔案,在ConfigMap中配置AccessKey ID與AccessKey Secret。

    說明

    您可以使用需要建立ALB執行個體的阿里雲帳號登入RAM控制台,然後在AccessKey頁面查看AccessKey ID與AccessKey Secret。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: load-balancer-config
      namespace: kube-system
    data:
      cloud-config.conf: |-
           {
               "Global": {
                   "AccessKeyID": "VndV***", # 需要base64編碼
                   "AccessKeySecret": "UWU0NnUyTFdhcG***" # 需要base64編碼
               }
           }
                            
  3. 通過kubectl串連叢集,執行以下命令,提交修改後的load-balancer-controller.yaml檔案進行部署。

    kubectl apply -f load-balancer-controller.yaml

    預期輸出:

    clusterrole.rbac.authorization.k8s.io/system:load-balancer-controller created
    serviceaccount/load-balancer-controller created
    clusterrolebinding.rbac.authorization.k8s.io/system:load-controller-manager created
    configmap/load-balancer-config created
    deployment.apps/load-balancer-controller created
  4. 執行以下命令驗證alb-ingress-controller部署結果。

    kubectl -n kube-system get all | grep load-balancer

    如下圖所示,pod運行狀態為Running,表示部署成功。

    alb-ingress-controller部署驗證

步驟二:建立AlbConfig及IngressClass資源

建立albconfig及ingressClass資源成功後,即可同步完成ALB執行個體的建立。

  1. 建立alb.yaml檔案並複製以下內容到該檔案中。

    alb.yaml用於建立AlbConfig及IngressClass資源。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb-demo
    spec:
      config:
        name: alb-test             #alb-test為ALB執行個體名稱
        addressType: Internet      #Intranet表示私網,Internet表示公網 。
        zoneMappings:
        - vSwitchId: vsw-wz9e2usil7e5an1xi****    #ALB需要至少兩個可用性區域的交換器ID
        - vSwitchId: vsw-wz92lvykqj1siwvif****
      listeners:
        - port: 80
          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: alb-demo   #指定的AlbConfig資源
    說明

    請關注以下兩個參數的配置:

    • albconfig.spec.config.addressType:表示執行個體網路類型。取值:

      • Internet(預設值):表示公網。每個可用性區域提供一個公網IP和一個私網IP。公網ALB通過Elastic IP Address(Elastic IP Address,簡稱EIP)提供公網能力,選擇公網將會收取Elastic IP Address的執行個體費、頻寬或流量費用。

        • Elastic IP Address對外提供服務,支援通過互連網訪問ALB

        • 私網IP,支援雲上VPC內的ECS訪問ALB

      • Intranet:表示私網。每個可用性區域提供一個私網IP,只能通過阿里雲內部網路訪問ALB,無法從互連網訪問。

    • spec.config.zoneMappings:用於設定ALB Ingress交換器ID,您需要至少指定兩個不同可用性區域交換器ID,指定的交換器必須在ALB當前所支援的可用性區域內。關於ALB支援的地區與可用性區域,請參見支援的地區與可用性區域

  2. 通過kubectl串連叢集,執行以下命令,提交alb.yaml檔案進行部署。

    kubectl apply -f alb.yaml

    預期輸出:

    AlbConfig.alibabacloud.com/alb-demo create
    ingressclass.networking.k8s.io/alb created
  3. 查看ALB執行個體建立結果。

步驟三:部署測試應用

本文使用測試鏡像來建立Deployment資源,並使用該Deployment資源部署測試應用。

  1. 建立test-service.yaml檔案並複製以下內容到該檔案中。

    test-service.yaml用於部署兩個名稱分別為test01和test02的Deployment,以及兩個名稱分別為test01和test02的Service。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test01
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: test01
      template:
        metadata:
          labels:
            app: test01
        spec:
          containers:
          - name: test01
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: test01-service
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: test01
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test02
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test02
      template:
        metadata:
          labels:
            app: test02
        spec:
          containers:
          - name: test02
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: test02-service
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: test02
      type: NodePort
  2. 通過kubectl串連叢集,執行以下命令,提交test-service.yaml檔案進行部署。

    kubectl apply -f test-service.yaml

    預期輸出:

    deployment "test01" created
    service "test01-service" created
    deployment "test02" created
    service "test02-service" created
  3. 執行以下命令,驗證測試服務是否部署成功。

    kubectl get svc,deploy  

    如果收到以下回複,代表測試服務部署成功。部署測試服務

步驟四:建立Ingress

Ingress對應ALB執行個體中的轉寄規則。本文使用基於路徑的轉寄功能進行配置,更多進階功能請參見ALB Ingress的詳細使用手冊

  1. 建立test-ingress.yaml檔案並複製以下內容到該檔案中。

    test-ingress.yaml檔案用於建立Ingress。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-ingress
    spec:
      ingressClassName: alb
      rules:
       - host: demo.domain.ingress.top
         http:
          paths:
          - path: /test01
            pathType: Prefix
            backend:
              service:
                name: test01-service
                port:
                  number: 80
          - path: /test02
            pathType: Prefix
            backend:
              service:
                name: test02-service
                port:
                  number: 80
  2. 通過kubectl串連叢集,執行以下命令,提交test-ingress.yaml檔案進行部署。

    kubectl apply -f test-ingress.yaml

    預期輸出:

    ingress "test-ingress" created
  3. 執行以下命令,驗證test-ingress資源建立結果。

    kubectl get ingress

    如果收到以下回複,代表test-ingress資源建立成功。image

步驟五:結果驗證

通過網域名稱解析訪問

  1. 將您的常用網域名稱通過CNAME方式解析到已建立ALB執行個體的DNS名稱上。具體操作,請參見為ALB添加CNAME記錄

    本樣本中假設您將自訂網域名demo.domain.ingress.top解析到ALB執行個體的公網服務網域名稱。

  2. 執行以下命令,使用ALB執行個體訪問test01服務。

    curl http://demo.domain.ingress.top/test01

    結果驗證1

  3. 執行以下命令,使用ALB執行個體訪問test02服務。

    curl http://demo.domain.ingress.top/test02

    結果驗證2

如果您在使用過程中有任何疑問,請加入釘群ALB客戶交流群(釘群號:31945843)諮詢。

相關文檔

ALB Ingress概述及功能介紹: