全部產品
Search
文件中心

:部署多個Ingress Controller

更新時間:Jun 19, 2024

本文介紹如何在阿里雲Container ServiceKubernetes叢集中同時部署多套獨立的Nginx Ingress Controller對外提供不同的服務訪問。

前提條件

背景資訊

您可以通過調整阿里雲Container ServiceKubernetes叢集中預設的Nginx Ingress Controller配置,使用私網SLB執行個體。更多資訊,請參見部署Ingress Controller使用私網SLB,文中提到的兩種模式可以滿足大部分需求情境。但對於一些特殊情境,例如,叢集內有部分公網服務需要通過公網Ingress方式來對外暴露提供訪問,但是又有部分私網服務僅僅只希望對同VPC內非Kubernetes叢集內的服務提供訪問,而又不允許能被公網訪問到,您可以通過部署兩套獨立的Nginx Ingress Controller服務,其前端綁定不同網路類型的SLB執行個體來滿足這類需求情境。

部署新的Nginx Ingress Controller服務

當您成功建立一個ACK叢集後,預設情況下,叢集內部已經部署了一套擁有2個Pod副本的Nginx Ingress Controller服務,其前端掛載在一個公網SLB執行個體上。

您可以通過以下步驟在ACK叢集中再部署一套完全獨立的Nginx Ingress Controller服務。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

  3. Helm頁面,單擊建立。參考如下資訊完成基礎資訊配置。

    參數

    樣本值

    應用程式名稱

    ack-ingress-nginx

    命名空間

    kube-system

    來源

    預設為應用市場

    Chart

    • 應用情境:選擇全部

    • 支援架構:選擇amd64

    • 搜尋方塊:搜尋ack-ingress-nginx

      • 1.20及以下叢集選中ack-ingress-nginx

      • 1.22及以上叢集選中ack-ingress-nginx-v1

    選擇叢集版本對應的Chart名稱,單擊下一步

  4. 參數配置頁面,選擇Chart 版本,然後單擊確定

    說明

    Chart版本4.0.17(對應組件版本v1.8.0-aliyun.1)及以上的ack-ingress-nginx-v1僅支援1.22及以上版本叢集。若您的叢集版本為1.20,需要選擇4.0.16版本(對應組件版本v1.2.1-aliyun.1)進行部署。

    ack-ingress-nginx-v1主要參數如下表。

    參數

    描述

    controller.image.repository

    ingress-nginx鏡像地址。

    controller.image.tag

    ingress-nginx鏡像版本,請參見Nginx Ingress Controller

    controller.ingressClassResource.name

    設定Ingress Controller所對應的IngressClass的名稱。

    重要

    該參數作為1.22以下版本模板中controller.ingressClass參數的替代,可以在kubernetes.io/ingress.class註解中正常使用。同一個叢集中不同套Ingress Controller建立的IngressClass名稱必須唯一,且不能設定為nginx關鍵字(nginx是叢集預設Ingress Controller的監聽標識)。

    controller.ingressClassResource.controllerValue

    設定Ingress Controller所對應的Controller Class。

    重要

    同一個叢集中不同套Ingress Controller建立的Controller Class必須唯一,且不能設定為k8s.io/ingress-nginx關鍵字(k8s.io/ingress-nginx是叢集預設Ingress Controller的監聽標識)。

    controller.replicaCount

    設定該Ingress Controller Pod的副本數。

    controller.service.enabled

    是否啟用SLB訪問(包括公網和私網)。

    controller.service.external.enabled

    是否開啟公網SLB訪問,不需要開啟則設定為false

    controller.service.internal.enabled

    是否開啟私網SLB訪問,需要開啟則設定為true

    controller.kind

    設定IngressController部署形態,可選值:DeploymentDaemonSet

    controller.electionID

    選主時使用的ID,用於更新Ingress端點狀態。

    重要

    若通過應用市場部署多套Nginx Ingress Controller至同一命名空間下,需要將electionID設定為不同的值,避免選主衝突。

    controller.metrics.enabled

    是否開啟ingress-nginx的metrics。

    controller.metrics.serviceMonitor.enabled

    是否開啟serviceMonitor,配置抓取規則。

    說明

    建議開啟ingress-nginx的metrics後,同時開啟此選項,以此來自動設定Prometheus的抓取規則。

  5. 查看部署的Nginx Ingress Controller服務。

    返回在Helm頁面,可以看到新的Nginx Ingress Controller服務已經成功部署。

訪問測試

本文部署一個測試應用,並配置通過新部署的Nginx Ingress Controller來對外暴露提供服務訪問。

  1. 部署一個Nginx測試應用。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: nginx
      template:
        metadata:
          labels:
            run: nginx
        spec:
          containers:
          - image: nginx
            imagePullPolicy: Always
            name: nginx
            ports:
            - containerPort: 80
              protocol: TCP
          restartPolicy: Always
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      sessionAffinity: None
      type: NodePort
  2. 通過Ingress來對外暴露提供服務訪問。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx
      annotations:
        # 注意這裡要設定為您前面配置的INGRESS_CLASS。
        kubernetes.io/ingress.class: "<YOUR_INGRESS_CLASS>"
    spec:
      rules:
      - host: foo.bar.com
        http:
          paths:
          - path: /
            backend:
              service: 
                name: nginx
                port:
                  number: 80
            pathType: ImplementationSpecific
    說明

    您需要配置注釋kubernetes.io/ingress.class

    在完成部署應用後,執行以下操作,查看該Ingress資源對應的端點IP地址與新部署的Nginx Ingress Controller服務的IP地址。

    • 執行以下命令查看叢集預設部署的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.19.XX.XX   192.0.XX.XX   80:31429/TCP,443:32553/TCP   2d
    • 執行以下命令查看新部署的nginx-ingress-lb服務對應的公網SLB地址。

      kubectl -n <YOUR_NAMESPACE> get svc nginx-ingress-lb

      預期輸出:

      NAME               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
      nginx-ingress-lb   LoadBalancer   172.19.XX.XX   198.51.XX.XX   80:30969/TCP,443:31325/TCP   39m
    • 執行以下命令查看該應用的Ingress配置。

      kubectl get ing

      預期輸出:

      NAME      HOSTS         ADDRESS         PORTS     AGE
      nginx     foo.bar.com   198.51.XX.XX   80        5m

    通過以上預期輸出可得,該Ingress資源對應的端點IP地址與新部署的Nginx Ingress Controller服務的一致。

  3. 分別通過叢集預設的Nginx Ingress Controller服務和新部署的Nginx Ingress Controller服務來訪問該應用。

     # 通過叢集預設的Nginx Ingress Controller服務訪問該應用(預期返回404)。
      curl -H "Host: foo.bar.com" http://192.0.2.0
    default backend - 404                                                                                                                                                                                        
      # 通過新部署的Nginx Ingress Controller服務訪問該應用(預期返回nginx頁面)。
      curl -H "Host: foo.bar.com" http://198.51.XX.XX
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>

從上文測試訪問情況可以看到,通過不同的Nginx Ingress Controller暴露的服務彼此完全是獨立的,這特別適用於同一叢集內部分服務需要提供公網訪問能力,但又有部分服務僅僅只希望為同VPC內非Kubernetes叢集的其他服務提供訪問的情境。