全部產品
Search
文件中心

:部署高可靠Ingress Controller

更新時間:Jun 19, 2024

在Kubernetes叢集中,Ingress是授權入站串連到達叢集服務的規則集合,可以為您提供七層負載平衡能力,您可以通過Ingress配置提供外部可訪問的URL、負載平衡、SSL、基於名稱的虛擬機器主機等。作為叢集流量接入層,Ingress的高可靠性顯得尤為重要,本文介紹如何部署一套高效能、高可靠的Ingress接入層。

前提條件

高可靠部署架構

高可靠性首先要解決的就是單點故障問題,通常系統採用多副本部署的方式,在Kubernetes叢集中部署高可靠Ingress接入層同樣採用多節點部署架構,同時由於Ingress作為叢集流量接入口,建議系統採用一個Ingress服務獨佔一個Ingress節點的方式,以避免業務應用與Ingress服務發生資源搶佔。

如上述部署架構圖,由多個獨佔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.XX.XX   118.XX.XX.XX   80:32XXX/TCP,443:31XXX/TCP   21d

部署高可靠的Ingress接入層

隨著叢集業務規模的逐漸擴大,系統需要擴容Ingress接入層,以保證叢集接入層的高效能高可用,可通過以下兩種方法完成。

  • 方法一:增加Pod副本數量

    通過調整Nginx Ingress Controller Deployment的Pod副本數量,可以快速增加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"

      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節點添加標籤。

    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
    4. 執行以下命令,查看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>