全部產品
Search
文件中心

:部署高可靠的Nginx Ingress Controller

更新時間:Jan 27, 2025

在使用Nginx Ingress Controller時,Controller所屬的Pod作為流量的實際入口和轉寄服務的提供者,它們的可靠性決定了Controller的可靠性。Nginx Ingress Controller在安裝後預設使用兩個Pod,在大多數情境中已經足夠可靠。如果您有進一步提高可靠性的需求,可通過控制Pod的數量和調度方式來達成。

前提條件

查看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          3h

Nginx Ingress Controller的高可靠部署方式

重要

Nginx Ingress Controller預設使用親和性配置,使每個節點只能部署一個Controller所屬的Pod。請勿使Pod數量超過叢集中節點的數量。

增加Controller所屬的Pod數量

增加Controller所屬的Pod數量,可以預防單個Pod失敗的情況。

  1. 執行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
  2. 執行以下命令,查看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效能下降或被驅逐的情況。

  1. 執行以下命令查看當前叢集的資源佔用情況。

    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和記憶體資源。請選擇其中有較多富餘資源的節點進行調度。

  2. 執行以下命令,在節點上添加node-role.kubernetes.io/ingress="true"標籤。以下樣本中是在富餘CPU資源更多的cn-shanghai.********.226cn-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
  3. 執行以下命令,更新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
  4. 執行以下命令,查看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