全部產品
Search
文件中心

Container Service for Kubernetes:部署多個Ingress Controller實現流量隔離

更新時間:Dec 10, 2025

在單個叢集中,除通過組件管理部署的預設Nginx Ingress Controller外,還可通過Helm應用安裝多套獨立的Controller,以便為不同業務或環境劃分專屬流量入口、通過獨立的公私網SLB分離流量,或為特殊應用提供差異化的Controller配置與版本。與單個Controller管理公網和/或私網流量的模式不同,此方式能夠實現徹底的故障與配置隔離。

重要

通過Helm應用安裝的Controller與通過組件管理部署的Controller存在以下關鍵差異:

  • 產品化能力:組件管理Controller提供更多產品化能力,如灰階升級日誌與監控叢集巡檢等。

  • 責任歸屬:Helm應用Controller需自我維護其生命週期,包括版本升級、配置變更、故障排查等。

工作原理

每個Controller通過唯一的IngressClass名稱進行標識。建立Ingress資源時,可通過spec.ingressClassName欄位聲明由哪個Controller處理。僅與IngressClass名稱匹配的Controller才會監聽並應用對應的Ingress規則,形成流量隔離。

下圖以公、私網隔離情境為例。

適用範圍

叢集版本為 1.22 及以上。

1.20及以下版本叢集使用的組件版本已停止維護,詳見【產品公告】關於停止維護Nginx Ingress Controller v1.2及以下版本的公告。如需升級叢集,請參見手動升級叢集

通過Helm應用部署新的Ingress Controller

  1. ACK叢集列表頁面,單擊目的地組群名稱,在叢集詳情頁左側導覽列,選擇应用 > Helm

  2. 單擊建立,按照頁面提示完成ack-ingress-nginx-v1的安裝。

    關鍵配置如下,其餘保持預設即可。

    配置項

    說明

    應用程式名稱

    名稱需在叢集範圍內保持唯一。

    重要

    此名稱將作為首碼產生Service資源,Service名為<應用程式名稱>-ack-ingress-nginx-v1-controller(私網LoadBalancer類型的Service格式為<應用程式名稱>-ack-ingress-nginx-v1-controller-internal)。總長度不可超過63個字元,否則資源會建立失敗。

    Chart

    搜尋並選擇ack-ingress-nginx-v1。

    ack-ingress-nginx已停止維護。

    Chart 版本

    • 1.24及以上版本的叢集:支援4.0.22及以上版本。

    • 1.22版本的叢集:支援4.0.16及以上至4.0.22以下版本。

    Chart參數

    預設以  Deployment 形式部署一個 2 副本的 Nginx Ingress Controller。該 Controller 會自動建立一個公網 LoadBalancer 類型的Service,並綁定CLB執行個體作為流量入口。

    可參見ack-ingress-nginx-v1參數說明按需調整預設配置。

    本樣本部署一個私網Controller,供後續步驟驗證使用。部署時,需配置controller.service.external.enabled需設定為falsecontroller.service.internal.enabledtrue
    重要

    部署多套 Controller 時,需確保叢集內controller.ingressClassResource.namecontroller.ingressClassResource.controllerValue的取值唯一,以避免IngressClass名稱衝突。

    建立後,可在Helm頁面查看新Controller資訊。在基本資料地區,記錄其命名空間等資訊,在資源地區,記錄其IngressClass名稱、Service名稱等資訊,供後續驗證使用。

驗證流量隔離

下文類比一個公私網分離情境來驗證流量隔離:

  • 預設Controller:叢集中已存在通過組件管理頁面部署的Nginx ingress Controller,並綁定了公網Server Load Balancer執行個體,負責暴露公網訪問入口。

    如未配置,請參見建立並使用Nginx Ingress對外暴露服務
  • 新Controller:按前文建立的新Controller,綁定私網Server Load Balancer執行個體,僅在VPC內提供服務。

下文部署一個樣本應用,讓其 Ingress 規則僅由新 Controller處理,以檢驗隔離是否生效。

1. 部署測試應用

  1. 建立nginx.yaml

    以下樣本部署了一個Nginx應用及其Service。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: nginx
      template:
        metadata:
          labels:
            run: nginx
        spec:
          containers:
          - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            imagePullPolicy: Always
            name: nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      sessionAffinity: None
      type: NodePort
  2. 部署樣本應用。

    kubectl apply -f nginx.yaml

2. 建立Ingress規則綁定新Controller

  1. 建立ingress.yaml

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx
    spec:
      # 修改為此前配置的IngressClass名稱(controller.ingressClassResource.name)
      ingressClassName: "<YOUR_INGRESS_CLASS>"
      rules:
      # 下方網域名稱供臨時測試用,生產環境中請替換為真實網域名稱
      - host: foo.bar.com
        http:
          paths:
          - path: /
            backend:
              service: 
                name: nginx
                port:
                  number: 80
            pathType: ImplementationSpecific
  2. 建立Ingress規則。

    kubectl apply -f ingress.yaml

3. 測試訪問

  1. 擷取各Controller的SLB IP地址。

    • 預設公網Controller的SLB IP:

      PUBLIC_IP=$(kubectl get svc -n kube-system nginx-ingress-lb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      echo "Public Ingress IP: $PUBLIC_IP"
    • 建立私網Controller的SLB IP:

      # 將<YourNamespace>替換為新Controller的命名空間 (如default)
      # 將<YourChartName>替換為新Controller的應用程式名稱,即發布名稱
      INTERNAL_IP=$(kubectl get svc -n <YourNamespace> <YourChartName>-ack-ingress-nginx-v1-controller-internal -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      echo "Internal Ingress IP: $INTERNAL_IP"
  2. 通過私網Controller訪問應用(預期成功)。

    登入VPC內終端,執行以下命令,如返回200,表明私網Controller已成功代理流量。

    # 替換為實際私網IP
    curl -o /dev/null -s -w "%{http_code}\n" -H "Host: foo.bar.com" http://$INTERNAL_IP
  3. 通過公網Controller訪問應用(預期失敗)。

    執行curl命令,如返回404 Not Found,表明公網Controller沒有處理該Ingress規則,流量隔離生效。

    # 替換為實際公網IP
    curl -H "Host: foo.bar.com" http://$PUBLIC_IP

應用於生產環境

  • 資源規劃:為保障高可用,關注組件Chart中的如下配置:

    • 配置多副本:controller.replicaCount

    • 設定合理的資源請求和限制:controller.resources.requestscontroller.resources.limits

    • 配置Pod反親和性:在controller.affinity欄位下添加podAntiAffinity規則,將Pod調度到不同節點

  • 監控警示:開啟Metrics (controller.metrics.enabled: true) 和 ServiceMonitor (controller.metrics.serviceMonitor.enabled: true),將其接入Prometheus監控系統。重點關注請求延遲、錯誤率(HTTP 4xx/5xx)等指標,並配置警示規則

  • 效能最佳化:對於高效能、低延遲情境,建議在Service配置中使用NLB

    • 私網Service:controller.service.internal.loadBalancerClass: "alibabacloud.com/nlb"

    • 公網Service:controller.service.loadBalancerClass: "alibabacloud.com/nlb"

  • 版本維護:

附錄:組件主要參數說明

參數

描述

controller.image.repository

Nginx Ingress Controller鏡像地址。

controller.image.tag

Nginx Ingress Controller的鏡像版本

controller.ingressClassResource.name

IngressClass資源名稱。叢集範圍內保持唯一,且不能為nginx(叢集預設Ingress Controller的監聽標識)。

controller.ingressClassResource.controllerValue

設定此Ingress Controller的Controller Class。叢集範圍內保持唯一,且不能為k8s.io/ingress-nginx(叢集預設Ingress Controller的監聽標識)。

controller.replicaCount

Ingress Controller Pod副本數。建議配置為2或以上以實現高可用。

controller.service.enabled

是否為Controller建立LoadBalancer類型(公網或私網)的Service以暴露服務。

controller.service.external.enabled

true則建立公網SLB Service,暴露公網訪問入口。

controller.service.internal.enabled

true則建立私網SLB Service,僅在VPC內提供服務。

controller.kind

Ingress Controller的部署形態:DeploymentDaemonSet

controller.electionID

控制器副本間選主時使用的標識符。僅Leader可更新Ingress資源狀態。

當在同一命名空間部署多套Ingress Controller時,此值需保持唯一。

controller.metrics.enabled

true則為Ingress Controller開啟Prometheus Metrics監控指標介面。

controller.metrics.serviceMonitor.enabled

true則建立ServiceMonitor資源,以便Prometheus能夠自動探索並採集指標。

建議在controller.metrics.enabledtrue時同步開啟此項。

controller.service.loadBalancerClass

建立公網Service時使用的Server Load Balancer執行個體類型。

  • "alibabacloud.com/clb"(預設):使用CLB

  • "alibabacloud.com/nlb":使用NLB

controller.service.internal.loadBalancerClass

建立私網Service時使用的Server Load Balancer執行個體類型。

  • "alibabacloud.com/clb"(預設):使用CLB

  • "alibabacloud.com/nlb":使用NLB