本文介紹如何在阿里云容器服務Kubernetes集群中同時部署多套獨立的Nginx Ingress Controller對外提供不同的服務訪問。
前提條件
已創建Kubernetes集群。具體操作,請參見創建Kubernetes托管版集群。
已通過kubectl連接kubernetes集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
背景信息
您可以通過調整阿里云容器服務Kubernetes集群中默認的Nginx Ingress Controller配置,使用私網SLB實例。更多信息,請參見部署Ingress Controller使用私網SLB,文中提到的兩種模式可以滿足大部分需求場景。但對于一些特殊場景,例如,集群內有部分公網服務需要通過公網Ingress方式來對外暴露提供訪問,但是又有部分私網服務僅僅只希望對同VPC內非Kubernetes集群內的服務提供訪問,而又不允許能被公網訪問到,您可以通過部署兩套獨立的Nginx Ingress Controller服務,其前端綁定不同網絡類型的SLB實例來滿足這類需求場景。
部署新的Nginx Ingress Controller服務
當您成功創建一個ACK集群后,默認情況下,集群內部已經部署了一套擁有2個Pod副本的Nginx Ingress Controller服務,其前端掛載在一個公網SLB實例上。
您可以通過以下步驟在ACK集群中再部署一套完全獨立的Nginx Ingress Controller服務。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在Helm頁面,單擊創建。參考如下信息完成基礎信息配置。
參數
示例值
應用名
ack-ingress-nginx
命名空間
kube-system
來源
默認為應用市場
Chart
應用場景:選擇全部。
支持架構:選擇amd64。
搜索框:搜索ack-ingress-nginx。
1.20及以下集群選中ack-ingress-nginx。
1.22及以上集群選中ack-ingress-nginx-v1。
選擇集群版本對應的Chart名稱,單擊下一步。
在參數配置頁面,選擇Chart 版本,然后單擊確定。
說明Chart版本4.0.17(對應組件版本v1.8.0-aliyun.1)及以上的ack-ingress-nginx-v1僅支持1.22及以上版本集群。若您的集群版本為1.20,需要選擇4.0.16版本(對應組件版本v1.2.1-aliyun.1)進行部署。
ack-ingress-nginx-v1主要參數如下表。
參數
描述
controller.image.repository
ingress-nginx鏡像地址。
controller.image.tag
ingress-nginx鏡像版本,請參見Nginx Ingress Controller。
controller.ingressClassResource.name
設置Ingress Controller所對應的IngressClass的名稱。
重要該參數作為1.22以下版本模板中controller.ingressClass參數的替代,可以在kubernetes.io/ingress.class注解中正常使用。同一個集群中不同套Ingress Controller創建的IngressClass名稱必須唯一,且不能設置為nginx關鍵字(nginx是集群默認Ingress Controller的監聽標識)。
controller.ingressClassResource.controllerValue
設置Ingress Controller所對應的Controller Class。
重要同一個集群中不同套Ingress Controller創建的Controller Class必須唯一,且不能設置為k8s.io/ingress-nginx關鍵字(k8s.io/ingress-nginx是集群默認Ingress Controller的監聽標識)。
controller.replicaCount
設置該Ingress Controller Pod的副本數。
controller.service.enabled
是否啟用SLB訪問(包括公網和私網)。
controller.service.external.enabled
是否開啟公網SLB訪問,不需要開啟則設置為false。
controller.service.internal.enabled
是否開啟私網SLB訪問,需要開啟則設置為true。
controller.kind
設置IngressController部署形態,可選值:Deployment和DaemonSet。
controller.electionID
選主時使用的ID,用于更新Ingress端點狀態。
重要若通過應用市場部署多套Nginx Ingress Controller至同一命名空間下,需要將electionID設置為不同的值,避免選主沖突。
controller.metrics.enabled
是否開啟ingress-nginx的metrics。
controller.metrics.serviceMonitor.enabled
是否開啟serviceMonitor,配置抓取規則。
說明建議開啟ingress-nginx的metrics后,同時開啟此選項,以此來自動配置Prometheus的抓取規則。
查看部署的Nginx Ingress Controller服務。
返回在Helm頁面,可以看到新的Nginx Ingress Controller服務已經成功部署。
訪問測試
本文部署一個測試應用,并配置通過新部署的Nginx Ingress Controller來對外暴露提供服務訪問。
部署一個Nginx測試應用。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - image: nginx 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
通過Ingress來對外暴露提供服務訪問。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx annotations: # 注意這里要設置為您前面配置的INGRESS_CLASS。 kubernetes.io/ingress.class: "<YOUR_INGRESS_CLASS>" spec: rules: - host: foo.bar.com http: paths: - path: / backend: service: name: nginx port: number: 80 pathType: ImplementationSpecific
說明您需要配置注釋
kubernetes.io/ingress.class
。在完成部署應用后,執行以下操作,查看該Ingress資源對應的端點IP地址與新部署的Nginx Ingress Controller服務的IP地址。
執行以下命令查看集群默認部署的nginx-ingress-lb服務對應的公網SLB地址。
kubectl -n kube-system get svc nginx-ingress-lb
預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-lb LoadBalancer 172.19.XX.XX 192.0.XX.XX 80:31429/TCP,443:32553/TCP 2d
執行以下命令查看新部署的nginx-ingress-lb服務對應的公網SLB地址。
kubectl -n <YOUR_NAMESPACE> get svc nginx-ingress-lb
預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-lb LoadBalancer 172.19.XX.XX 198.51.XX.XX 80:30969/TCP,443:31325/TCP 39m
執行以下命令查看該應用的Ingress配置。
kubectl get ing
預期輸出:
NAME HOSTS ADDRESS PORTS AGE nginx foo.bar.com 198.51.XX.XX 80 5m
通過以上預期輸出可得,該Ingress資源對應的端點IP地址與新部署的Nginx Ingress Controller服務的一致。
分別通過集群默認的Nginx Ingress Controller服務和新部署的Nginx Ingress Controller服務來訪問該應用。
# 通過集群默認的Nginx Ingress Controller服務訪問該應用(預期返回404)。 curl -H "Host: foo.bar.com" http://192.0.2.0 default backend - 404 # 通過新部署的Nginx Ingress Controller服務訪問該應用(預期返回nginx頁面)。 curl -H "Host: foo.bar.com" http://198.51.XX.XX <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a >nginx.org</a>.<br/> Commercial support is available at <a >nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
從上文測試訪問情況可以看到,通過不同的Nginx Ingress Controller暴露的服務彼此完全是獨立的,這特別適用于同一集群內部分服務需要提供公網訪問能力,但又有部分服務僅僅只希望為同VPC內非Kubernetes集群的其他服務提供訪問的場景。