全部產品
Search
文件中心

Container Service for Kubernetes:建立並使用ALB Ingress對外暴露服務

更新時間:Nov 13, 2025

ACK叢集中的服務預設與外部網路隔離。ALB Ingress通過使用具備網域名稱路由、安全防護和高可用能力的應用型負載平衡 ALB作為外部流量入口,以滿足將叢集內部服務暴露給使用者訪問的需求。

工作原理

  1. 資源關聯

    AlbConfig資來源物件定義了ALB執行個體的具體配置(如功能版本、監聽等),與ALB執行個體為一對一的關聯關係。Ingress中定義的路徑映射和關聯的Service,將自動轉化為ALB執行個體的路由規則和伺服器組配置。

  2. 動態同步

    ALB Ingress Controller通過API Server動態地擷取Ingress和AlbConfig資源的變化,然後動態更新ALB執行個體。

  3. 流量轉寄

    與Nginx Ingress Controller不同,ALB Ingress Controller是託管組件,作為ALB執行個體的控制面,不直接處理使用者請求流量,使用者流量的轉寄由ALB執行個體來處理,並最終轉寄到Service所代理的後端Pod上。

Service類型限制

當使用flannel網路外掛程式時,ALB Ingress後端Service僅支援NodePortLoadBalancer類型。

安裝ALB Ingress Controller組件

建立叢集時安裝

  1. 登入Container Service管理主控台,單擊建立叢集

  2. 組件配置階段的Ingress配置地區,選擇安裝ALB Ingress

  3. 以建立ALB執行個體為例,然後按照頁面提示建立叢集。

    ALB 應用型Server Load Balancer執行個體

    說明

    建立

    自動建立ALB執行個體、AlbConfig和IngressClass。

    • ALB執行個體:在叢集VPC內自動建立一個標準版、隨用隨付的公網/私網ALB執行個體,並配置HTTP:80監聽。

    • AlbConfig和IngressClass:在叢集中自動建立與ALB執行個體關聯的AlbConfig和IngressClass資來源物件。

    使用已有

    僅當叢集網路設定為使用已有專用網路時可選

    使用一個已有的ALB執行個體,並自動建立AlbConfig和IngressClass。該ALB執行個體的功能版本需為標準版或WAF增強版,網路類型需為與叢集同VPC的公網/私網類型,且未被其他叢集關聯。

    暫不建立

    僅安裝ALB Ingress Controller組件,後續需手動建立AlbConfig和IngressClass,適用於需要自訂ALB執行個體配置的情境。

為已有叢集安裝

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  3. 通過搜尋欄或者網路頁簽找到組件,在ALB Ingress Controller組件卡片的右下角,單擊安裝

  4. 以建立ALB執行個體為例,然後單擊確認

    ALB 應用型Server Load Balancer執行個體

    說明

    建立

    自動建立ALB執行個體、AlbConfig和IngressClass。

    • ALB執行個體:在叢集VPC內自動建立一個標準版、隨用隨付的公網/私網ALB執行個體,並配置HTTP:80監聽。

    • AlbConfig和IngressClass:在叢集中自動建立與ALB執行個體關聯的AlbConfig和IngressClass資來源物件。

    使用已有

    使用一個已有的ALB執行個體,並自動建立AlbConfig和IngressClass。該ALB執行個體的功能版本需為標準版或WAF增強版,網路類型需為與叢集同VPC的公網/私網類型,且未被其他叢集關聯。

    暫不建立

    僅安裝ALB Ingress Controller組件,後續需手動建立AlbConfig和IngressClass,適用於需要自訂ALB執行個體配置的情境。

建立樣本應用

樣本應用將部署一個名稱為coffee的無狀態工作負載(Deployment)以及對應的coffee-svc服務(Service)。

控制台

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  2. 單擊使用YAML建立資源樣本模板選擇自訂。然後將以下內容複寫到模板地區,單擊建立

    樣本應用YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: coffee
      template:
        metadata:
          labels:
            app: coffee
        spec:
          containers:
          - name: coffee
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: coffee-svc
      namespace: default
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: coffee
      type: ClusterIP
  3. 在彈窗提示中單擊查看,確認Pod狀態為Running。 

kubectl

  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 使用以下內容建立coffee-deployment-service.yaml檔案。

    樣本應用YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: coffee
      template:
        metadata:
          labels:
            app: coffee
        spec:
          containers:
          - name: coffee
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: coffee-svc
      namespace: default
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: coffee
      type: ClusterIP
  3. 建立樣本應用的Deployment和Service。

    kubectl apply -f coffee-deployment-service.yaml
  4. 確認Pod狀態為Running

     kubectl get pod -l app=coffee

    預期輸出:

    NAME                      READY   STATUS    RESTARTS   AGE
    coffee-84bd6*****-*****   1/1     Running   0          4m22s
    coffee-84bd6*****-*****   1/1     Running   0          4m22s

建立ALB Ingress

通過配置ALB Ingress的網域名稱和路徑映射,實現訪問ingress-demo.com/coffee網域名稱即可路由至叢集內部coffee-svc服務的功能。

ACK專有叢集中使用ALB Ingress,需要授予ALB Ingress Controller存取權限

控制台

  1. 在左側導覽列,選擇網路 > 路由。選擇default命名空間,單擊建立 Ingress

  2. 添加以下Ingress配置,單擊確定

    • 名稱coffee-ingress

    • 網域名稱ingress-demo.com

    • 路徑映射路徑/coffee匹配規則首碼匹配(Prefix)服務名稱coffee-svc連接埠80

      匹配規則(pathType)

      說明

      首碼匹配(Prefix)

      匹配請求URL路徑的首碼部分。例如,可匹配/coffee/1/coffee/buy/1路徑,但不能匹配/cof/coffeebuy/1

      完整匹配(Exact)

      完全符合請求URL路徑。僅/coffee路徑可匹配。

      預設(ImplementationSpecific)

      由Ingress Controller實現的具體邏輯決定。在ALB Ingress Controller中為完整匹配(Exact)。

  3. 擷取端點地址。

    ALB Ingress生效過程耗時約10秒,可稍後單擊重新整理按鈕擷取端點資訊。若長時間未更新端點資訊,可單擊路由名稱,進入事件頁簽,進行異常問題排查

    image

  4. 測試訪問網域名稱和端點地址,若HTTP狀態代碼為200即表示ALB Ingress已建立成功。

    curl -H "Host:ingress-demo.com" http://<端點地址>/coffee -s -o /dev/null -w "%{http_code}\n"

kubectl

  1. 建立ALB Ingress。將以下YAML內容儲存為coffee-ingress.yaml檔案,然後執行kubectl apply -f coffee-ingress.yaml命令。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: coffee-ingress
      namespace: default
    spec:
      ingressClassName: alb
      rules:
      - host: ingress-demo.com
        http:
          paths:
          - path: /coffee
            backend:
              service: 
                name: coffee-svc
                port:
                  number: 80
            pathType: Prefix

    匹配規則(pathType)

    說明

    首碼匹配(Prefix)

    匹配請求URL路徑的首碼部分。例如,可匹配/coffee/1/coffee/buy/1路徑,但不能匹配/cof/coffeebuy/1

    完整匹配(Exact)

    完全符合請求URL路徑。僅/coffee路徑可匹配。

    預設(ImplementationSpecific)

    由Ingress Controller實現的具體邏輯決定。在ALB Ingress Controller中為完整匹配(Exact)。

  2. 查看Ingress並擷取ADDRESS欄位中的端點地址。

    kubectl get ingress coffee-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'

    預期輸出:

    alb-******************.cn-wulanchabu.alb.aliyuncsslb.com
  3. 測試訪問網域名稱和端點地址,若HTTP狀態代碼為200即表示ALB Ingress已建立成功。

    curl -H "Host:ingress-demo.com" http://<端點地址>/coffee -s -o /dev/null -w "%{http_code}\n"

計費說明

  • ALB Ingress Controller組件:該組件為ACK託管組件,不涉及使用者側的資源使用和計費。

  • ALB執行個體:每個AlbConfig資來源物件會建立一個對應的ALB執行個體,ALB執行個體的計費規則為隨用隨付

應用於生產環境

  • 佈建網域名解析:將業務網域名稱通過CNAME記錄解析至ALB執行個體提供的公網訪問地址,以解耦網域名稱與ALB執行個體訪問地址,確保服務入口的高可用與靈活配置。

  • 配置HTTPS安全加密:在數位憑證管理服務中統一管理憑證,並在Ingress資源的tls欄位中聲明式地引用該認證,從而實現服務流量的HTTPS安全加密。

配額與限制

常見問題

為什麼訪問Ingress網域名稱返回了503、502、404等HTTP錯誤碼

問題原因

  • 503(Service Temporarily Unavailable)錯誤

    • 路由規則未匹配:請求路徑與Ingress實際配置的路由規則不符。

    • 後端無存活Pod:Service關聯的Pod全部未就緒或不存在,導致Endpoints對象為空白。

  • 502(Bad Gateway)錯誤

    HTTP或HTTPS監聽接收到用戶端串連請求後,ALB由於無法正常將請求轉寄至Pod或無法從Pod收到響應,則會向用戶端發送HTTP 502 Bad Gateway狀態代碼。

  • 404(Not Found)錯誤

    通常原因為已匹配Ingress中定義的路由規則,但與Pod中應用實際提供服務的URL不匹配。

更多HTTP錯誤碼說明,請參見ALB狀態代碼說明

解決方案

  1. 檢查Ingress狀態:執行kubectl describe ingress <ingress-name> -n <namespace>命令,查看Events部分是否有錯誤資訊。如出現類似listener is not exist in alb的事件,請在AlbConfig中建立Ingress資源所需的監聽

    ...
    Events:
      Type     Reason                  Age     From     Message
      ----     ------                  ----    ----     -------
      Warning  FailedBuildModel        ****    ingress  listener is not exist in alb, port: 443, protocol: HTTPS
      Warning  FailedBuildModel        ****    ingress  listener not found for (443/HTTPS), with ingresses 1
    ...
  2. 檢查後端Endpoints:執行kubectl get endpoints <service-name> -n <namespace>命令,確認ENDPOINTS欄位下有至少一個健康的Pod IP和連接埠。若為空白,則排查Service的selector是否與Pod的labels匹配,以及Pod是否處於Running狀態。

  3. 檢查Pod狀態與日誌:先執行kubectl get pod -l <app=your-app> -n <namespace>命令,查看Pod運行狀態。擷取Pod名稱之後執行kubectl logs <pod-name> -n <namespace>命令,查看應用日誌是否有啟動失敗或處理請求的錯誤資訊。

  4. 網路連通性測試:在Pod內或節點上嘗試curl後端Service的ClusterIP或Pod IP,驗證叢集內部服務是否可達。

配置Ingress TLS後,為什麼HTTPS還是無法訪問?

問題原因

  • ALB執行個體未監聽443連接埠:只配置了Ingress的TLS安全加密,但沒有建立對應的HTTPS:443監聽。

  • 認證配置錯誤:Secret類型不是kubernetes.io/tlsIngressTLS,或者data中的tls.crttls.key內容不正確或不匹配。

  • 認證更新不生效:在阿里雲認證中心更新了認證,但未更新AlbConfig中指定的認證ID,或未觸發自動探索認證調諧,導致ALB執行個體仍引用舊認證。

解決方案

  1. 檢查監聽連接埠:執行kubectl describe albconfig <alb-name> -n <namespace>命令,檢查是否缺少spec.listeners.port: 443spec.listeners.protocol: HTTPS配置。

  2. 檢查Ingress配置:檢查Ingress的配置中是否缺少註解alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}],該註解將Ingress關聯到HTTP和HTTPS監聽上。

  3. 檢查Secret配置:檢查Ingress的配置中spec.tlssecretName欄位,確認引用了正確的Secret。執行kubectl get secret <secret-name> -n <namespace> -o yaml命令,確認Secret類型和資料完整性。

如何為Ingress佈建網域名解析?

  1. 註冊網域名稱

  2. 添加CNAME解析記錄

    以添加一個記錄類型為CNAME、主機記錄為@(表示直接解析主網域名稱,如ingress-demo.com)、記錄值為Ingress端點地址的解析記錄為例
  3. 在瀏覽器中訪問http://ingress-demo.com/coffee,驗證網域名稱解析生效。

    image

    請替換為實際註冊網域名稱進行驗證。如發現解析不生效,請參考解析不生效問題快速排查

如何為Ingress配置HTTPS安全加密?

  1. 購買正式認證,並完成申請認證,確認待使用的認證處於已簽發狀態。

  2. 下載SSL認證

    以下載ingress-demo.com網域名稱、伺服器類型為其他的PEM格式認證檔案為例。
  3. 建立Secret儲存認證檔案。

    1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇組態管理 > 保密字典

    2. 保密字典頁面,選擇default命名空間,單擊左側建立添加以下配置,單擊確定

      • 名稱ingress-tls

      • 類型TLS認證

      • 認證:已下載並解壓的認證檔案(.pem)中的完整內容

      • 密鑰:已下載並解壓的認證私密金鑰檔案(.key)中的完整內容

      image

  4. 更新AlbConfig,為ALB執行個體新增HTTPS:443監聽。

    1. 在左側導覽列,選擇工作負載 > 自訂資源。在資來源物件瀏覽器頁簽中,搜尋AlbConfig,然後單擊搜尋結果。

    2. 在AlbConfig資來源物件列表中,找到目標資源alb,單擊其右側操作列下的YAML編輯

    3. 新增spec.listeners.port: 443spec.listeners.protocol: HTTPS欄位,然後單擊確定

      image

  5. 更新Ingress,添加TLS配置並關聯HTTPS:443監聽。

    1. 在左側導覽列,選擇網路 > 路由。在目標路由右側操作欄中,單擊更新

    2. 添加以下配置,單擊確定

      • TLS配置:開啟

      • 網域名稱ingress-demo.com

      • 保密字典ingress-tls

      • 註解alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]

  6. 在瀏覽器中訪問https://ingress-demo.com/coffee,驗證HTTPS加密訪問。

    image

    請替換為實際註冊網域名稱進行驗證。

更多HTTPS認證的配置方式,請參見配置HTTPS認證以實現加密通訊

如何手動建立AlbConfig和IngressClass?

建立AlbConfig

  1. 登入專用網路管理主控台,記錄集群所在VPC中至少兩個處於不同可用性區域的虛擬交換器ID。

    配置的虛擬交換器所屬可用性區域需滿足ALB支援的地區與可用性區域
  2. 將下方代碼中zoneMappings.vSwitchId替換為上一步中得到的交換器ID。建立並儲存名為albconfig.yaml的檔案,執行kubectl apply -f albconfig.yaml建立AlbConfig。

    更詳細的操作步驟,請參見建立AlbConfig
    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb # 請勿建立同名的AlbConfig資源
    spec:
      config:
        name: alb-test
        addressType: Internet
        zoneMappings:
        - vSwitchId: vsw-****cg2a9g71hx8go**** # 替換為實際虛擬交換器ID
        - vSwitchId: vsw-****un9tql5t8nh15**** # 替換為實際虛擬交換器ID
      listeners:
        - port: 80
          protocol: HTTP

建立IngressClass

IngressClass關聯了AlbConfig和Ingress資源,在Ingress中填入ingressclassName: alb即可通過名為alb的IngressClass使用AlbConfig。

建立並儲存名為IngressClass.yaml的檔案,然後執行kubectl apply -f IngressClass.yaml建立IngressClass。

spec.parameters.name中需填入AlbConfig的名稱。安裝組件時預設建立的AlbConfig名稱為alb。更詳細的操作說明,請參見使用IngressClass關聯AlbConfig與Ingress
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: alb
spec:
  controller: ingress.k8s.alibabacloud/alb
  parameters:
    apiGroup: alibabacloud.com
    kind: AlbConfig
    name: alb # 與AlbConfig的名稱對應

相關文檔

ALB Ingress服務進階用法

自訂ALB Ingress的轉寄規則

通過ALB Ingress實現灰階發布