作为集群流量接入层,Ingress 的高可靠性显得尤为重要,本文探讨如何部署一套高性能高可靠的 Ingress 接入层。

前提条件

  • 您已成功创建一个 Kubernetes 集群,参见创建Kubernetes 集群。
  • SSH 连接到 Master 节点,参见SSH访问Kubernetes集群。

背景信息

在 Kubernetes 集群中,Ingress 是授权入站连接到达集群服务的规则集合,为您提供七层负载均衡能力,您可以通过 Ingress 配置提供外部可访问的
URL、负载均衡、SSL、基于名称的虚拟主机等。

高可靠部署架构

高可靠性首先要解决的就是单点故障问题,通常采用多副本部署的方式,在 Kubernetes 集群中部署高可靠 Ingress 接入层同样采用多节点部署架构,同时由于
Ingress 作为集群流量接入口,建议采用独占 Ingress 节点的方式,以避免业务应用与 Ingress 服务发生资源争抢。

%title插图%num

如上述部署架构图,由多个独占 Ingress 实例组成统一接入层承载集群入口流量,同时可依据后端业务流量水平扩缩容 Ingress 节点。当然如果您前期的集群规模并不大,也可以采用将
Ingress 服务与业务应用混部的方式,但建议进行资源限制和隔离。

查看集群默认部署的Pod副本及公网地址

当您成功创建一个集群后,默认情况下,集群内部已经部署了一套拥有2个Pod副本的Nginx Ingress Controller服务,其前端挂载在一个公网SLB实例上。

  1. 执行以下命令查看部署Nginx Ingress Controller服务的Pod。
    kubectl -n kube-system get pod | grep nginx-ingress-controller
    
    nginx-ingress-controller-8648ddc696-2bshk                    1/1     Running   0          3h
    nginx-ingress-controller-8648ddc696-jvbs9                    1/1     Running   0          3h

  2. 执行以下命令查看nginx-ingress-lb服务对应的公网SLB地址。
    kubectl -n kube-system get svc nginx-ingress-lb
    
    NAME               TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                      AGE
    nginx-ingress-lb   LoadBalancer   172.xx.x.xx   118.xxx.xxx.xx   80:32457/TCP,443:31370/TCP   21d

随着集群业务规模的逐渐扩大,我们需要同时扩容Ingress接入层,以保证集群接入层的高性能高可用,可通过以下两种方法完成。

方法一 增加Replica数量

我们可以通过简单地调整Nginx Ingress Controller Deployment的Replica数量来快速增加Ingress接入层的规模。

  1. 执行以下命令,将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-8648ddc696-2bshk                    1/1     Running   0          3h
    nginx-ingress-controller-8648ddc696-jvbs9                    1/1     Running   0          3h
    nginx-ingress-controller-8648ddc696-xqmfn                    1/1     Running   0          33s

方法二 在指定节点部署Ingress服务

如果你需要Nginx Ingress Controller仅运行在指定的一些高配置节点上,可以通过给节点添加标签来完成。

  1. 执行以下命令查看当前集群的节点情况。
    kubectl get node
    
    NAME                                 STATUS   ROLES    AGE   VERSION
    cn-hangzhou.i-bp11bcmsna8d4bp****   Ready    master   21d   v1.11.5
    cn-hangzhou.i-bp12h6biv9bg24l****   Ready    <none>   21d   v1.11.5
    cn-hangzhou.i-bp12h6biv9bg24l****   Ready    <none>   21d   v1.11.5
    cn-hangzhou.i-bp12h6biv9bg24l****   Ready    <none>   21d   v1.11.5
    cn-hangzhou.i-bp181pofzyyksie****   Ready    master   21d   v1.11.5
    cn-hangzhou.i-bp1cbsg6rf3580z****   Ready    master   21d   v1.11.5

  2. 执行以下命令,给Ingress Node节点cn-hangzhou.i-bp12h6biv9bg24lmdc2ocn-hangzhou.i-bp12h6biv9bg24lmdc2p添加标签node-role.kubernetes.io/ingress="true"
    说明

    • 添加标签的节点数量要大于等于集群Pod副本数,从而避免多个Pod运行在同一个节点上。
    • 不建议将Ingress服务部署到master节点上,尽量选择worker节点添加标签。

      查询结果中,ROLES的值显示为none,表示为Worker节点

    kubectl label nodes cn-hangzhou.i-bp12h6biv9bg24lmdc2o node-role.kubernetes.io/ingress="true"
    node/cn-hangzhou.i-bp12h6biv9bg24lmdc2o labeled
    kubectl label nodes cn-hangzhou.i-bp12h6biv9bg24lmdc2p node-role.kubernetes.io/ingress="true"
    node/cn-hangzhou.i-bp12h6biv9bg24lmdc2p labeled

  3. 执行以下命令,更新deployment,增加nodeSelector配置。
    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-8648ddc696-2bshk                    1/1     Running   0          3h    172.16.2.15     cn-hangzhou.i-bp12h6biv9bg24lmdc2p   <none>
nginx-ingress-controller-8648ddc696-jvbs9                    1/1     Running   0          3h    172.16.2.145    cn-hangzhou.i-bp12h6biv9bg24lmdc2o   <none>