在使用Nginx Ingress Controller時,Controller所屬的Pod作為流量的實際入口和轉寄服務的提供者,它們的可靠性決定了Controller的可靠性。Nginx Ingress Controller在安裝後預設使用兩個Pod,在大多數情境中已經足夠可靠。如果您有進一步提高可靠性的需求,可通過控制Pod的數量和調度方式來達成。
前提條件
已安裝Nginx Ingress Controller組件。具體操作,請參見管理Nginx Ingress Controller組件。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
查看Nginx Ingress Controller預設部署的Pod
當您安裝Nginx Ingress Controller組件後,叢集內部已經部署了一個擁有2個Pod的Nginx Ingress Controller服務。
執行以下命令查看Nginx Ingress Controller所屬的Pod。
kubectl -n kube-system get pod | grep nginx-ingress-controller預期輸出:
nginx-ingress-controller-*****nxs 1/1 Running 0 3h
nginx-ingress-controller-*****9pm 1/1 Running 0 3hNginx Ingress Controller的高可靠部署方式
Nginx Ingress Controller預設使用親和性配置,使每個節點只能部署一個Controller所屬的Pod。請勿使Pod數量超過叢集中節點的數量。
增加Controller所屬的Pod數量
增加Controller所屬的Pod數量,可以預防單個Pod失敗的情況。
執行
kubectl scale命令,對Nginx Ingress Controller的Deployment進行擴容。下面的樣本命令中是將Pod數量增加到3個。kubectl -n kube-system scale --replicas=3 deployment/nginx-ingress-controller預期輸出:
deployment.extensions/nginx-ingress-controller scaled執行以下命令,查看Nginx Ingress Controller的Pod。
kubectl -n kube-system get pod | grep nginx-ingress-controller預期輸出:
nginx-ingress-controller-******** 1/1 Running 0 3h nginx-ingress-controller-******** 1/1 Running 0 3h nginx-ingress-controller-******** 1/1 Running 0 33s
將Pod調度到高規格節點上
將Pod調度到高規格節點上,可以預防節點資源不足而導致的Pod效能下降或被驅逐的情況。
執行以下命令查看當前叢集的資源佔用情況。
kubectl top nodes預期輸出:
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-shanghai.********.230 71m 1% 1712Mi 31% cn-shanghai.********.226 63m 1% 1669Mi 30% cn-shanghai.********.229 125m 3% 2545Mi 46% cn-shanghai.********.253 152m 3% 3804Mi 69%輸出展示了各節點已經使用的CPU和記憶體資源。請選擇其中有較多富餘資源的節點進行調度。
執行以下命令,在節點上添加
node-role.kubernetes.io/ingress="true"標籤。以下樣本中是在富餘CPU資源更多的cn-shanghai.********.226和cn-shanghai.********.230節點上添加。重要添加標籤的節點數量需要大於或等於Pod的數量。如果擁有標籤的節點少於Controller所屬的Pod數量,可能會導致部分Pod部署失敗。
如果您正在使用ACK專有版叢集,請勿在Master節點上添加標籤。
kubectl label nodes cn-shanghai.********.226 cn-shanghai.********.230 node-role.kubernetes.io/ingress="true"預期輸出:
node/cn-shanghai.********.226 labeled node/cn-shanghai.********.230 labeled執行以下命令,更新Nginx Ingress Controller所使用的Deployment,增加nodeSelector配置,使Controller所屬的Pod只能部署到擁有
node-role.kubernetes.io/ingress="true"標籤的節點。kubectl -n kube-system patch deployment nginx-ingress-controller -p '{"spec": {"template": {"spec": {"nodeSelector": {"node-role.kubernetes.io/ingress": "true"}}}}}'預期輸出:
deployment.extensions/nginx-ingress-controller patched執行以下命令,查看Ingress Pod已部署在添加了標籤
node-role.kubernetes.io/ingress="true"的叢集節點上。kubectl -n kube-system get pod -o wide | grep nginx-ingress-controller預期輸出:
nginx-ingress-controller-*****nxs 1/1 Running 0 74m 10.1.117.186 cn-shanghai.********.230 nginx-ingress-controller-*****9pm 1/1 Running 0 74m 10.1.117.172 cn-shanghai.********.226