在單個叢集中,除通過組件管理部署的預設Nginx Ingress Controller外,還可通過Helm應用安裝多套獨立的Controller,以便為不同業務或環境劃分專屬流量入口、通過獨立的公私網SLB分離流量,或為特殊應用提供差異化的Controller配置與版本。與單個Controller管理公網和/或私網流量的模式不同,此方式能夠實現徹底的故障與配置隔離。
工作原理
每個Controller通過唯一的IngressClass名稱進行標識。建立Ingress資源時,可通過spec.ingressClassName欄位聲明由哪個Controller處理。僅與IngressClass名稱匹配的Controller才會監聽並應用對應的Ingress規則,形成流量隔離。
下圖以公、私網隔離情境為例。
適用範圍
叢集版本為 1.22 及以上。
1.20及以下版本叢集使用的組件版本已停止維護,詳見【產品公告】關於停止維護Nginx Ingress Controller v1.2及以下版本的公告。如需升級叢集,請參見手動升級叢集。
通過Helm應用部署新的Ingress Controller
在ACK叢集列表頁面,單擊目的地組群名稱,在叢集詳情頁左側導覽列,選擇。
單擊建立,按照頁面提示完成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需設定為false,controller.service.internal.enabled為true。重要部署多套 Controller 時,需確保叢集內controller.ingressClassResource.name和controller.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. 部署測試應用
建立
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部署樣本應用。
kubectl apply -f nginx.yaml
2. 建立Ingress規則綁定新Controller
建立
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建立Ingress規則。
kubectl apply -f ingress.yaml
3. 測試訪問
擷取各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"
通過私網Controller訪問應用(預期成功)。
登入VPC內終端,執行以下命令,如返回
200,表明私網Controller已成功代理流量。# 替換為實際私網IP curl -o /dev/null -s -w "%{http_code}\n" -H "Host: foo.bar.com" http://$INTERNAL_IP通過公網Controller訪問應用(預期失敗)。
執行
curl命令,如返回404 Not Found,表明公網Controller沒有處理該Ingress規則,流量隔離生效。# 替換為實際公網IP curl -H "Host: foo.bar.com" http://$PUBLIC_IP
應用於生產環境
資源規劃:為保障高可用,關注組件Chart中的如下配置:
配置多副本:
controller.replicaCount設定合理的資源請求和限制:
controller.resources.requests和controller.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"
版本維護:
關注Nginx Ingress Controller組件發布記錄,及時修複安全性漏洞。
使用Network Policy限制不同Ingress Controller可訪問的後端服務涵蓋範圍,增強隔離性。
附錄:組件主要參數說明
參數 | 描述 |
| Nginx Ingress Controller鏡像地址。 |
| Nginx Ingress Controller的鏡像版本。 |
| IngressClass資源名稱。叢集範圍內保持唯一,且不能為 |
| 設定此Ingress Controller的Controller Class。叢集範圍內保持唯一,且不能為 |
| Ingress Controller Pod副本數。建議配置為2或以上以實現高可用。 |
| 是否為Controller建立LoadBalancer類型(公網或私網)的Service以暴露服務。 |
|
|
|
|
| Ingress Controller的部署形態: |
| 控制器副本間選主時使用的標識符。僅Leader可更新Ingress資源狀態。 當在同一命名空間部署多套Ingress Controller時,此值需保持唯一。 |
|
|
|
建議在 |
| 建立公網Service時使用的Server Load Balancer執行個體類型。 |
| 建立私網Service時使用的Server Load Balancer執行個體類型。 |