Nginx Ingress Controller可配置為同時支援公網與私網訪問、僅公網訪問及僅私網訪問三種模式,滿足不同網路環境中用戶端的訪問需求。
工作原理
在叢集中,Server Load Balancer執行個體接收用戶端請求並轉寄到Nginx Ingress Controller工作負載,工作負載會將請求轉寄到其他Service。
配置同時支援公網與私網Nginx Ingress
為Nginx Ingress Controller的後端Pod同時部署兩個Service,分別關聯公網和私網類型的Server Load Balancer執行個體,即可實現同時支援公網與私網訪問。
查看當前負載平衡網路類型。
kubectl describe service -n kube-system nginx-ingress-lb | grep "service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"如果輸出包含
intranet,則當前為私網類型;否則為公網類型。建立一個Service,確保同時存在公網與私網兩種網路類型的Service。
建立並儲存名為
nginx-ingress-lb-new.yaml的檔案,執行kubectl apply -f nginx-ingress-lb-new.yaml建立Service。新增私網類型的Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-intranet namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # 指明Server Load Balancer執行個體地址類型為私網類型。 spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx新增公網類型的Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb-internet namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx將下方命令中的
<service-name>替換為建立Service名稱,然後執行命令。如果返回200則表明建立Service工作正常。curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system <service-name> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')將
<service-name>替換為建立Service名稱後,執行kubectl get service <service-name>,記錄Service的External IP,然後根據建立Service類型配置DNS:建立私網Service
登入Alibaba Cloud DNS-內網網域名稱解析,在頁簽下單擊添加網域名稱(Zone),如果已添加網域名稱,請執行步驟c。
在內網權威網域名稱 (Zone)中填入網域名稱,其他選項保持預設,然後單擊確定。
單擊目標網域名稱,在解析記錄頁簽,點擊添加記錄,參照下方表格中的值填寫表單,其餘配置項保持預設,然後單擊確定。
配置項
填入值
記錄類型
A
主機記錄
根據需要填入子網域名稱首碼
記錄值
建立Service的IP地址。
回到使用者網域名稱列表,在目標網域名稱右側的操作列選擇生效範圍設定,在生效於阿里雲VPC內網選項中選擇ACK叢集所在的VPC,然後單擊確定。
建立公網Service
登入Alibaba Cloud DNS-公網權威解析單擊目標網域名稱進入到解析設定頁面。單擊添加記錄按鈕。
參照下方表格中的值填寫表單,其餘配置項保持預設,然後單擊確定。
配置項
填入值
記錄類型
A。
主機記錄
根據需要填入子網域名稱首碼。
記錄值
建立Service的IP地址。
變更網路類型
此操作需要刪除並重建Service替換Server Load Balancer執行個體,會導致Nginx Ingress暫時中斷,被刪除的Server Load Balancer執行個體及其對應的IP無法恢複。
確認現有Server Load Balancer執行個體沒有流量:
登入Container Service管理主控台。單擊目的地組群,然後在左側頁面中,找到處於
kube-system命名空間的nginx-ingress-lb,記錄該Service的外部 IP 位址(External IP)。登入傳統型負載平衡CLB控制台,在上方選擇與叢集相同的地區後,找到服務地址與上一步中擷取的IP地址相同的CLB執行個體。單擊該CLB執行個體,在監控頁簽查看Server Load Balancer執行個體狀態,確認串連數為0,然後再執行後續操作。
刪除當前Nginx Ingress Controller使用的Service。
kubectl delete svc -n kube-system nginx-ingress-lb建立並儲存名為
nginx-ingress-lb.yaml的檔案,然後使用kubectl apply -f nginx-ingress-lb.yaml建立Service。重要建立Service名稱必須為
nginx-ingress-lb。私網類型的Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # 指明Server Load Balancer執行個體地址類型為私網類型。 spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx公網類型的Service
apiVersion: v1 kind: Service metadata: name: nginx-ingress-lb namespace: kube-system labels: app: nginx-ingress-lb spec: type: LoadBalancer externalTrafficPolicy: "Cluster" ports: - port: 80 name: http targetPort: 80 - port: 443 name: https targetPort: 443 selector: app: ingress-nginx測試建立Service狀態,如果返回
200則表明建立Service工作正常。curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system nginx-ingress-lb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')執行
kubectl get service nginx-ingress-lb,記錄Service的External IP,然後根據建立Service類型配置DNS:建立私網Service
登入Alibaba Cloud DNS-內網網域名稱解析,在頁簽下單擊添加網域名稱(Zone),如果已添加網域名稱,請執行步驟c。
在內網權威網域名稱 (Zone)中填入網域名稱,其他選項保持預設,然後單擊確定。
單擊目標網域名稱,在解析記錄頁簽,點擊添加記錄,參照下方表格中的值填寫表單,其餘配置項保持預設,然後單擊確定。
配置項
填入值
記錄類型
A
主機記錄
根據需要填入子網域名稱首碼
記錄值
建立Service的IP地址。
回到使用者網域名稱列表,在目標網域名稱右側的操作列選擇生效範圍設定,在生效於阿里雲VPC內網選項中選擇ACK叢集所在的VPC,然後單擊確定。
建立公網Service
登入Alibaba Cloud DNS-公網權威解析單擊目標網域名稱進入到解析設定頁面。單擊添加記錄按鈕。
參照下方表格中的值填寫表單,其餘配置項保持預設,然後單擊確定。
配置項
填入值
記錄類型
A。
主機記錄
根據需要填入子網域名稱首碼。
記錄值
建立Service的IP地址。
常見問題
為什麼不能先建立後刪除Service?
變更Nginx Ingress Controller的網路類型時,無法使用建立Service後再刪除舊Service的切換方式,只能在刪除舊Service後建立新Service。原因是Nginx Ingress Controller組件升級時,工作負載需要使用Service預設名稱(nginx-ingress-lb)進行匹配。而Service無法重名,採取建立Service後再刪除舊Service的方式會導致工作負載無法匹配Server Load Balancer執行個體,從而升級失敗。
為什麼用戶端訪問的IP與控制台上顯示的端點不一致?
控制台Ingress頁面顯示的端點是指名稱為nginx-ingress-lb的Service所屬Server Load Balancer執行個體IP地址。當配置多個LoadBalancer類型Service時,Nginx Ingress仍可正常轉寄所有請求,但控制台不會展示其他Service所屬負載平衡IP。用戶端實際訪問的IP取決於所使用的Server Load Balancer執行個體(可通過網域名稱解析測試確認),因此可能與控制台顯示的端點不一致。
如果刪除了nginx-ingress-lb再重新建立同名的Service,對應的Ingress顯示的端點需要更新Ingress資源後才能觸發重新整理。變更類型操作失誤後如何復原?
請按順序儘快執行:
刪除建立的Service,避免因同名導致組件無法建立預設Service。
通過控制台卸載並重新安裝Nginx Ingress Controller組件,這將在叢集中建立一個預設Service,以恢複Nginx Ingress的入口。
配置DNS,為新的預設Service(
nginx-ingress-lb)添加網域名稱解析,然後測試轉寄是否正常。
相關文檔
關於配置已有的Server Load Balancer執行個體注釋,詳情請參見使用已有的負載平衡。