部署高可靠的Nginx Ingress Controller

在使用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失败的情况。

image
  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性能下降或被驱逐的情况。

image

  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