在Kubernetes叢集中,Ingress是授權入站串連到達叢集服務的規則集合,可以為您提供七層負載平衡能力,您可以通過Ingress配置提供外部可訪問的URL、負載平衡、SSL、基於名稱的虛擬機器主機等。作為叢集流量接入層,Ingress的高可靠性顯得尤為重要,本文介紹如何部署一套高效能、高可靠的Ingress接入層。
前提條件
高可靠部署架構
高可靠性首先要解決的就是單點故障問題,通常系統採用多副本部署的方式,在Kubernetes叢集中部署高可靠Ingress接入層同樣採用多節點部署架構,同時由於Ingress作為叢集流量接入口,建議系統採用一個Ingress服務獨佔一個Ingress節點的方式,以避免業務應用與Ingress服務發生資源搶佔。
如上述部署架構圖,由多個獨佔Ingress執行個體組成統一接入層來承載叢集入口流量,同時可依據後端業務流量水平擴縮容Ingress節點。若您前期的叢集規模並不大,也可以採用將Ingress服務與業務應用混部的方式,但注意進行資源限制和隔離。
查看叢集預設部署的Pod副本及公網地址
當您成功建立一個叢集後,預設情況下,叢集內部已經部署了一套擁有2個Pod副本的Nginx Ingress Controller服務,其前端掛載在一個公網SLB執行個體上。
執行以下命令查看部署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-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.XX.XX 118.XX.XX.XX 80:32XXX/TCP,443:31XXX/TCP 21d
部署高可靠的Ingress接入層
隨著叢集業務規模的逐漸擴大,系統需要擴容Ingress接入層,以保證叢集接入層的高效能高可用,可通過以下兩種方法完成。
方法一:增加Pod副本數量
通過調整Nginx Ingress Controller Deployment的Pod副本數量,可以快速增加Ingress接入層的規模。
執行以下命令,將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-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僅運行在指定的一些高配置節點上,可以通過給節點添加標籤來完成。
執行以下命令查看當前叢集的節點情況。
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
執行以下命令,給Ingress Node節點
cn-hangzhou.i-bp12h6biv9bg24lmdc2o
和cn-hangzhou.i-bp12h6biv9bg24lmdc2p
添加標籤node-role.kubernetes.io/ingress="true"
。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
說明添加標籤的節點數量要大於等於叢集Pod副本數,從而避免多個Pod運行在同一個節點上。
查詢結果中,若ROLES的值顯示為none,則表示為Worker節點。
建議您不要將Ingress服務部署到Master節點上,盡量選擇Worker節點添加標籤。
執行以下命令,更新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.XX.XX cn-hangzhou.i-bp**** <none> nginx-ingress-controller-8648ddc696-jvbs9 1/1 Running 0 3h 172.16.XX.XX cn-hangzhou.i-bp**** <none>