在使用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 3h
Nginx 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