背景信息
Nginx Ingress Controller因其開源特性和廣泛應用而受到業界的青睞。在處理大型集群環境時,用戶往往希望在同一集群內部署多個Nginx Ingress Controller實例,以便對不同流量進行有效管理。例如,某些服務可能需要通過公共網絡對外提供服務,而另一些服務則僅供內部使用,不允許通過互聯網訪問。為了適應這種需求,可以通過設置兩組獨立的Nginx Ingress Controller,并分別與不同的ELB實例綁定,從而實現流量的精確控制和隔離。這種方法不僅提升了服務的安全性,還增強了流量管理的靈活性。
前提條件
已創建Kubernetes集群
已創建ELB實例,具體操作請參考創建負載均衡
部署新的Nginx Ingress Controller
在開通Kubernetes集群的時候,您可以選擇為集群安裝Ingress Controller組件,并為Ingress Controller綁定公網ELB實例。您可以通過以下步驟在Kubernetes集群再部署一套完全獨立的Nginx Ingress Controller服務。
獲取Nginx Ingress Controller模板包
前往,選擇合適版本的HelmChart包并下載,本文以ingress-nginx-4.7.5.tgz為例。
上傳模板包
登錄云容器引擎控制臺,進入“模板市場”,點擊“我的模板”->“上傳模板”。然后選擇命名空間,點擊“上傳文件”,選擇要上傳的模板包,點擊提交。
發布模板實例
上傳完模板包之后,在“我的模板”中選擇剛上傳的模板(ingress-nginx),然后選擇版本(4.7.5),然后點擊發布。
填寫“實例名稱”,選擇“集群名稱”和“命名空間”。
在發布yaml文本中導入以下配置,根據說明填寫相關參數(參數說明見下表“YAML參數說明”),其他未指定的參數會使用默認配置。controller: image: registry: "registry-vpc-crs-xxx.cnsp-internal.daliqc.cn" #容器鏡像倉庫地址,請根據集群所在區域進行替換 image: "library/nginx-ingress-controller" tag: "v1.1.2" #Nginx Ingress Controller鏡像版本 digest: "" ingressClassResource: name: ingressdemo #同一個集群中不同套Nginx Ingress Controller名稱必須唯一,且不能設置為nginx-ingress-controller或elb controllerValue: "k8s.io/nginx-ingress-demo" #同一個集群中不同套Nginx Ingress Controller的監聽標識必須唯一,且不能設置為k8s.io/ingress-nginx ingressClass: ingressdemo #同一個集群中不同套Nginx Ingress Controller名稱必須唯一,且不能設置為nginx-ingress-controller或elb service: annotations: service.beta.kubernetes.io/ctyun-loadbalancer-id: lb-fhqivj5xjm #ELB實例ID admissionWebhooks: # 關閉webhook驗證開關 enabled: false patch: enabled: false resources: # 設定Nginx Ingress Controller的資源限制,可根據需要自行決定 requests: cpu: 500m memory: 512Mi點擊“確認”,之后可以在“模板實例”頁面查看實例安裝情況。
YAML參數說明
| 參數 | 描述 |
|---|---|
| controller.image.registry | 容器鏡像倉庫地址,如registry-vpc-crs-huabei1.cnsp-internal.daliqc.cn。 |
| controller.image.image | Nginx Ingress Controller鏡像名稱。 |
| controller.image.tag | Nginx Ingress Controller鏡像版本,一般與集群插件Nginx Ingress Controller的版本一致即可,也可自定義。 |
| controller.ingressClassResource.name | Nginx Ingress Controller對應的IngressClass名稱。 注意 同一個集群中不同套Nginx Ingress Controller名稱必須唯一,且不能設置為nginx-ingress-controller或elb。 |
| controller.ingressClassResource.controllerValue | Nginx Ingress Controller對應的Controller Class。 注意 同一個集群中不同套Nginx Ingress Controller的監聽標識必須唯一,且不能設置為k8s.io/ingress-nginx。 |
| controller.ingressClass | Nginx Ingress Controller對應的IngressClass名稱,需與controller.ingressClassResource.name一致。 |
| controller.service.annotations | 配置Nginx Ingress Controller通過LoadBalancer Service暴露到ELB,其中可通過注解service.beta.kubernetes.io/ctyun-loadbalancer-id指定已有ELB實例,更多注解配置請參考通過Annotation配置負載均衡類型的服務。 |
| controller.resources.requests.cpu | Nginx Ingress Controller的CPU資源限制,可根據需要自行決定。 |
| controller.resources.requests.memory | Nginx Ingress Controller的內存資源限制,可根據需要自行決定。 |
訪問驗證
創建一個nginx工作負載
進入集群,在菜單欄選中“工作負載”->“無狀態”,然后點擊“創建Deployment”按鈕,如下示例創建nginx工作負載。創建Ingress,通過新部署的Nginx Ingress Controller提供網絡訪問
在菜單欄選中“網絡”->“路由”,然后點擊“新增YAML”,填寫以下內容,然后點擊“保存”。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx namespace: ingress-demo annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: ingressdemo #新創建的Nginx Ingress Controller的ingressClass rules: - host: nginx.demo.com #訪問的Host地址 http: paths: - path: / pathType: Prefix backend: service: name: nginx #目標服務nginx port: number: 80 #目標服務nginx端口通過新部署的Nginx Ingress Controller來訪問該應用
在菜單欄選中“網絡”->“服務”,找到新部署的Nginx Ingress Controller對應的服務,如下圖:
其中集群外地址為Nginx Ingress Controller對應的ELB地址,通過該地址訪問應用,可以看到返回正確的nginx頁面。通過集群的Ingress Controller組件來訪問該應用
找到Ingress Controller組件對應的服務,如下圖:
通過其對應的ELB地址訪問nginx應用,可以看到返回404錯誤。
常見使用問題
| 問題現象 | 解決方案 |
|---|---|
| 安裝模板報錯:IngressClass.networking.k8s.io "nginx-ingress-xxx" is invalid: spec.controller: Invalid value: "nginx-ingress-xxx": must be a domain-prefixed path (such as "acme.io/foo")。 | YAML配置中填寫的controller.ingressClassResource.controllerValue不對,值需要以域名為前綴,如k8s.io/ingress-nginx-demo。 |
| 創建Ingress路由后,Ingress同時被模板部署的Nginx Ingress Controller和集群插件Nginx Ingress Controller識別并生效。 | 檢查安裝模板后生成的IngressClass資源,確認spec.controller的值是否為k8s.io/ingress-nginx,如果是,需重裝模板實例,為controller.ingressClassResource.controllerValue指定不同于“k8s.io/ingress-nginx”的值。 |