全部產品
Search
文件中心

Container Service for Kubernetes:建立ALB Ingress

更新時間:Jan 24, 2025

使用ALB Ingress時,您需要在叢集中建立多種資源以配置由ALB Ingress到後端Pod的完整轉寄路徑。您可以參考本文快速部署樣本後端應用,並建立ALB Ingress以對外提供服務。

注意事項

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

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

  • 低版本Nginx Ingress Controller無法識別Ingress資源中的spec:ingressClassName欄位。如果叢集中同時存在Nginx Ingress和ALB Ingress,會存在ALB Ingress被低版本Nginx Ingress Controller調諧的風險。因此,請及時升級Nginx Ingress Controller版本,或通過Annotation註解項指定ALB Ingress對應的ingressClass。具體操作,請參見升級Nginx Ingress Controller組件ALB Ingress服務進階用法

使用說明

在您開始建立ALB Ingress之前,建議先通過ALB Ingress管理,瞭解它的原理和要求。確保滿足以下資源條件:

說明

ACK專有叢集中使用ALB Ingress,需要為ALB Ingress Controller授權。相關操作請參見為ACK專有叢集授予ALB Ingress Controller存取權限

  • 在安裝ALB Ingress組件時,您可以選擇不同的ALB雲原生網關執行個體來源,這將影響操作結果:

    • (推薦)選擇建立使用已有

      Controller會自動建立名為alb的AlbConfig和相應的IngressClass資源。在AlbConfig中,預設配置一個監聽連接埠為80、協議為HTTP的監聽。

    • 選擇暫不建立

      在建立ALB Ingress之前,您需要先手動建立AlbConfigIngressClass,因為Controller不會自動建立這些資源。

  • AlbConfig和IngressClass

    • AlbConfig:

      用於管理ALB執行個體,其參數決定了ALB執行個體的配置。一個AlbConfig對應一個ALB執行個體。更多配置請參見通過AlbConfig配置ALB執行個體

    • IngressClass:

      需要關聯一個AlbConfig,從而實現與一個ALB執行個體的關聯。在建立ALB Ingress時可以通過指定該IngressClass來引用相應的AlbConfig配置,從而實現特定的應用路由配置和負載平衡策略。

  • 建立樣本應用和Service

    Service:為具有相同功能的Pod提供了一個穩定、統一的入口。在建立ALB Ingress時需要配置路由規則將外部流量轉寄到對應的Service。

本文樣本介紹安裝ALB Ingress組件時ALB雲原生網關執行個體將選擇建立。然後將部署名為coffeetea的應用及對應Service,並為其建立一個網域名稱為demo.domain.ingress.top的ALB Ingress。在完成DNS網域名稱解析後,您將能夠訪問該應用。

安裝組件

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

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

  3. 組件管理頁面,單擊網路頁簽,在網路組件地區,在ALB Ingress Controller組件卡片的右下角單擊安裝

  4. 安裝組件 ALB Ingress Controller對話方塊,在ALB 雲原生網關執行個體來源中根據情況選擇建立,然後單擊確定

    執行個體來源

    描述

    結果說明

    建立

    • 網路類型:根據需要可選擇建立公網私網的ALB執行個體,計費詳情請參見ALB計費規則

    • 專用網路:預設值,與叢集中專用網路相同。

    • 虛擬交換器:展示此專用網路下ALB支援的可用性區域對應的虛擬交換器。需要指定2個不同可用性區域的交換器,若不指定,則自動挑選2個可用交換器。您也可以通過單擊建立虛擬交換器建立新的交換器。

    Controller會自動建立名為alb的AlbConfig和相應的IngressClass資源。在AlbConfig中,預設配置一個監聽連接埠為80、協議為HTTP的監聽。關於監聽擴充請參見建立HTTPS監聽

    使用已有

    您可以從下拉式功能表中選擇已有的ALB執行個體進行複用。不支援使用基礎版ALB執行個體。詳情請參見複用已有ALB執行個體

    暫不建立

    暫時不建立ALB執行個體,僅安裝ALB Ingress Controller組件。

    Controller將不會建立相應資源,您需手動建立AlbConfig建立IngressClass

建立樣本應用和Service

控制台

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

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

  3. 單擊使用YAML建立資源

    1. 樣本模板:選擇自訂

    2. 模板:輸入YAML設定檔代碼。該設定檔用於部署兩個名稱分別為coffeetea的Deployment,以及兩個名稱分別為coffee-svctea-svc的Service。

      展開查看YAML配置

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: coffee
      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
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: coffee
        type: NodePort
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tea
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: tea
        template:
          metadata:
            labels:
              app: tea
          spec:
            containers:
            - name: tea
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: tea-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: tea
        type: NodePort
  4. 配置完成後單擊建立,頁面將提示建立成功

  5. 檢查Deployment和Service建立成功:

    1. 在左側導覽列,選擇工作負載 > 無狀態。可查看到名稱為coffee和tea的Deployment已部署。

    2. 在左側導覽列,選擇網路 > 服務。可查看到名稱為coffee-svc和tea-svc的Service已部署。

kubectl

  1. 建立並拷貝以下內容到cafe-service.yaml檔案中,用於部署兩個名稱分別為coffeetea的Deployment,以及兩個名稱分別為coffee-svctea-svc的Service。

    展開查看詳細YAML配置

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
    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
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: coffee
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tea
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: tea
      template:
        metadata:
          labels:
            app: tea
        spec:
          containers:
          - name: tea
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tea-svc
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: tea
      type: NodePort
  2. 執行以下命令,部署兩個Deployment和兩個Service。

    kubectl apply -f cafe-service.yaml

    預期輸出:

    deployment "coffee" created
    service "coffee-svc" created
    deployment "tea" created
    service "tea-svc" created
  3. 執行以下命令,查看應用和服務的狀態。

    1. 執行以下命令,查看應用的狀態。

      kubectl get deployment

      預期輸出:

      NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
      coffee                           1/2     2            1           2m26s
      tea                              1/1     1            1           2m26s
    2. 執行以下命令,查看服務的狀態。

      kubectl get svc

      預期輸出:

      NAME                          TYPE           CLUSTER-IP       EXTERNAL-IP           PORT(S)                 AGE
      coffee-svc                    NodePort       172.16.XX.XX     <none>                80:32056/TCP            9m38s
      tea-svc                       NodePort       172.16.XX.XX     <none>                80:31696/TCP            9m38s

建立ALB Ingress

控制台

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇網路 > 路由

  3. 路由頁面,單擊建立 Ingress,在建立 Ingress對話方塊配置路由。

    配置項

    說明

    樣本值

    網關類型

    可按需選擇ALB IngressMSE IngressNginx Ingress三種網關類型。

    關於三種網關的差異,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比

    ALB Ingress

    名稱

    自訂路由名稱。

    cafe-ingress

    Ingress Class

    選擇關聯AlbConfig的資源類。

    alb

    規則

    單擊+ 添加規則可新增多個路由規則。

    • 網域名稱:自訂網域名。

    • 路徑映射:配置如下配置項。

      • 路徑:指定服務訪問的URL路徑。

      • 匹配規則

        • 首碼匹配(Prefix):匹配請求URL路徑的首碼部分。

        • 完整匹配(Exact):完全符合請求URL路徑。

        • 預設(ImplementationSpecific):由Ingress控制器實現的具體邏輯決定。

        更多詳情請參見基於URL路徑轉寄請求

      • 服務名稱:選擇目標服務,即K8s內的Service。

      • 連接埠:選擇服務需要暴露的連接埠。

    • Ingress支援同一個網域名稱下配置多條路徑。單擊+ 添加路徑新增路徑。

    • 網域名稱:demo.domain.ingress.top

    • 路徑映射

      • 路徑:/tea

      • 匹配規則:首碼匹配(Prefix)

      • 服務名稱:tea-svc

      • 連接埠:80

    • 路徑映射

      • 路徑:/coffee

      • 匹配規則:首碼匹配(Prefix)

      • 服務名稱:coffee-svc

      • 連接埠:80

    其他配置保持預設,參數詳情請參見配置擴充

  4. 配置完成,在建立Ingress頁面的左下角,單擊確定。

  5. 檢查Ingress建立成功並複製端點:

    1. 在左側導覽列,選擇網路 > 路由。可查看到名稱為cafe-ingress的Ingress已部署。

    2. cafe-ingress端點列,複製其對應的ALB DNS端點名稱。

kubectl

  1. 建立並拷貝以下內容到cafe-ingress.yaml檔案中,用於建立Ingress。

    YAML設定檔參考

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: cafe-ingress 
    spec:
      ingressClassName: alb
      rules:
       - host: demo.domain.ingress.top
         http:
          paths:
          # 配置Context Path
          - path: /tea
            pathType: ImplementationSpecific
            backend:
              service:
                name: tea-svc
                port:
                  number: 80
          # 配置Context Path
          - path: /coffee
            pathType: ImplementationSpecific
            backend:
              service:
                name: coffee-svc
                port: 
                  number: 80

    可調整參數說明如下:

    參數

    是否必填

    說明

    metadata.name

    Ingress的名稱。

    說明

    Ingress的名稱在叢集中必須是唯一的。因此,在建立Ingress時,您需要確保Ingress名稱的唯一性,以避免命名衝突。

    spec.ingressClassName

    關聯的IngressClass的名稱。

    spec.rules.host

    HTTP頭部host欄位網域名稱資訊,需要配置為您的自有網域名稱。

    當您在瀏覽器中訪問您的自有網域名稱時,例如“http://demo.domain.ingress.top”,瀏覽器會在發送HTTP請求時自動添加一個“Host: demo.domain.ingress.top”的頭部欄位。這樣,伺服器就可以根據該頭部欄位來識別請求的目標主機名稱。在Kubernetes中,Ingress規則中的host欄位會與來自請求的Host頭部欄位進行匹配。當匹配成功時,Ingress規則就會將請求路由到相應的後端服務進行處理。

    說明
    • 此處如果配置了自有網域名稱,需要確保該自有網域名稱完成備案,否則可能訪問時無法解析。具體操作,請參見ICP備案流程

    • 此處如果未配置,那麼該Ingress規則將匹配所有到達Ingress Controller的請求。

    spec.rules.http.paths.path

    轉寄路徑URL。

    spec.rules.http.paths.pathType

    URL匹配規則。詳情可參考基於URL路徑轉寄請求

    spec.rules.http.paths.backend.service.name

    填寫您此前建立的Service名稱。

    spec.rules.http.paths.backend.service.port.number

    填寫您此前建立的Service的服務連接埠號碼。

    這個連接埠號碼的設定非常重要,因為它決定了在路由到後端服務時使用的連接埠。確保連接埠號碼正確設定,以確保請求可以正確路由到後端服務並被處理。

  2. 執行以下命令,配置coffeetea服務對外暴露的網域名稱和path路徑。

    kubectl apply -f cafe-ingress.yaml

    預期輸出:

    ingress.networking.k8s.io/cafe-ingress created
  3. (可選)執行以下命令擷取ALB執行個體DNS地址。

    kubectl get ingress

    預期輸出:

    NAME           CLASS    HOSTS                         ADDRESS                                               PORTS   AGE
    cafe-ingress   alb      demo.domain.ingress.top       alb-m551oo2zn63yov****.cn-hangzhou.alb.aliyuncs.com   80      50s

佈建網域名解析

  1. 登入網域名稱解析控制台

  2. 權威網域名稱解析頁面單擊添加網域名稱

  3. 添加網域名稱對話方塊中輸入您的網域名稱,然後單擊確認

    重要

    您的主機網域名稱需已完成TXT記錄驗證。

  4. 在目標網域名稱的操作列單擊解析設定

  5. 解析設定頁面單擊添加記錄

  6. 添加記錄面板配置以下資訊完成CNAME解析配置,然後單擊確認

    配置項

    說明

    記錄類型

    在下拉欄中選擇CNAME

    主機記錄

    您的網域名稱的首碼,例如www

    解析請求來源

    選擇預設。

    記錄值

    輸入欄位名對應的CNAME地址,即您複製的ALB DNS端點。

    TTL

    全稱Time To Live,表示DNS記錄在DNS伺服器上的緩衝時間,本文使用預設值。

測試流量轉寄

在瀏覽器中輸入“測試網域名稱+URL路徑”,測試流量轉寄是否正確。

測試網域名稱以demo.domain.ingress.top為例

  1. 在瀏覽器中輸入demo.domain.ingress.top/coffee,將返回coffee-svc對應的後端服務介面。 image

  2. 在瀏覽器中輸入demo.domain.ingress.top/tea,將返回tea-svc對應的後端服務介面。image

(可選)配置擴充

配置項

參數說明

相關文檔

TLS配置

開啟TLS配置開關,配置安全的路由服務。

  • 網域名稱:自訂網域名。

  • 保密字典:根據需要選擇對應的保密字典。

    如果您需要建立Secret,請執行如下操作。

    1. 保密字典右側,單擊建立

    2. 建立 Secret對話方塊,自訂保密字典的名稱CertKey,然後單擊確定

    3. 保密字典的下拉框,選擇已建立的Secret。

單擊+ 新增TLS配置,可配置多條TLS。

更多配置

展開查看詳細說明

  • 灰階發布:開啟灰階發布開關。灰階規則可按照要求標頭、Cookie 、權重三個維度進行設定。

    說明

    要求標頭、Cookie 、權重可以只設定一種,若同時設定生效規則按要求標頭、Cookie、權重順序匹配。

    • 按要求標頭:基於Request Header的流量切分,設定後會添加註解alb.ingress.kubernetes.io/canary-by-headeralb.ingress.kubernetes.io/canary-by-header-value

    • 按Cookie:基於Cookie的流量切分,設定後會添加註解alb.ingress.kubernetes.io/canary-by-cookie

    • 按權重:佈建要求到指定服務的百分比(值為0~100的整數),設定後會添加註解alb.ingress.kubernetes.io/canary-weight

  • 協議:指定後端服務的協議,設定後會添加註解alb.ingress.kubernetes.io/backend-protocol

    支援HTTP、HTTPS、gRPC三種服務合約。

  • 重寫路徑:將用戶端請求中的路徑重寫後發送到後端服務,設定後會添加註解alb.ingress.kubernetes.io/rewrite-target

自訂轉寄規則

展開查看詳細說明

開啟自訂轉寄規則,可精細化管理入站流量。

說明

轉寄規則的條件條目上限為10個。

  • 轉寄條件下拉框中選擇:

    • 網域名稱

      匹配請求網域名稱,如果設定了多個網域名稱,則網域名稱之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.host-example

    • 路徑

      匹配請求路徑,如果設定了多個路徑,則路徑之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.path-example

    • HTTP標題

      以索引值對形式匹配請求的頭部資訊。例如,鍵是headername值是headervalue1。如果設定了多個Header值,則Header之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.http-header-example

  • 轉寄動作下拉框中選擇:

    • 轉寄至

      轉寄到後端多伺服器組。在服務名稱中,請選擇目標服務。在連接埠中,選擇目標連接埠號碼。然後自訂配置權重值。

      說明

    • 返回固定響應

      設定通過ALB給用戶端返回固定響應內容,可以設定響應狀態代碼,本文內容和本文類型。按需求配置響應狀態代碼響應本文類型(可選)、響應本文(可選)

      響應本文類型:

      • text/plain:表示無格式的內容類型。

      • text/css:表示XML格式的內容。

      • text/html:表示HTML格式的內容。

      • application/javascript:表示JavaScript格式的內容。

      • application/json:表示JSON格式內容類型。

自訂ALB Ingress的轉寄規則

常見問題

如果遇到問題,您可以對ALB Ingress異常問題進行排查,以下是常見問題。

  • AlbConfig資源報錯listener is not exist in alb, port: xxx?

    預設的AlbConfig只配置了連接埠80的監聽,需要建立其他監聽請參見建立監聽

  • 配置AlbConfig的HTTP和HTTPS監聽後,如何在Ingress資源中同時監聽HTTP和HTTPS協議的監聽?

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 使用多個監聽時需要添加annotation使ALB Ingress正常工作。
    spec:
      #...