全部產品
Search
文件中心

Container Service for Kubernetes:配置Nginx Ingress Controller的網路類型

更新時間:Nov 08, 2025

Nginx Ingress Controller可配置為同時支援公網與私網訪問、僅公網訪問及僅私網訪問三種模式,滿足不同網路環境中用戶端的訪問需求。

工作原理

在叢集中,Server Load Balancer執行個體接收用戶端請求並轉寄到Nginx Ingress Controller工作負載,工作負載會將請求轉寄到其他Service。

配置同時支援公網與私網Nginx Ingress

為Nginx Ingress Controller的後端Pod同時部署兩個Service,分別關聯公網和私網類型的Server Load Balancer執行個體,即可實現同時支援公網與私網訪問。

  1. 查看當前負載平衡網路類型。

    kubectl describe service -n kube-system nginx-ingress-lb | grep "service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"

    如果輸出包含intranet,則當前為私網類型;否則為公網類型。

  2. 建立一個Service,確保同時存在公網與私網兩種網路類型的Service。

    建立並儲存名為nginx-ingress-lb-new.yaml的檔案,執行kubectl apply -f nginx-ingress-lb-new.yaml建立Service。

    新增私網類型的Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb-intranet
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # 指明Server Load Balancer執行個體地址類型為私網類型。
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        app: ingress-nginx

    新增公網類型的Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb-internet
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        app: ingress-nginx
  3. 將下方命令中的<service-name>替換為建立Service名稱,然後執行命令。如果返回200則表明建立Service工作正常。

    curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system <service-name> -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  4. <service-name>替換為建立Service名稱後,執行kubectl get service <service-name>,記錄Service的External IP,然後根據建立Service類型配置DNS:

    建立私網Service

    1. 登入Alibaba Cloud DNS-內網網域名稱解析,在內網權威 > 使用者網域名稱頁簽下單擊添加網域名稱(Zone),如果已添加網域名稱,請執行步驟c。

    2. 內網權威網域名稱 (Zone)中填入網域名稱,其他選項保持預設,然後單擊確定

    3. 單擊目標網域名稱,在解析記錄頁簽,點擊添加記錄,參照下方表格中的值填寫表單,其餘配置項保持預設,然後單擊確定

      配置項

      填入值

      記錄類型

      A

      主機記錄

      根據需要填入子網域名稱首碼

      記錄值

      建立Service的IP地址。

    4. 回到使用者網域名稱列表,在目標網域名稱右側的操作列選擇生效範圍設定,在生效於阿里雲VPC內網選項中選擇ACK叢集所在的VPC,然後單擊確定

    建立公網Service

    1. 登入Alibaba Cloud DNS-公網權威解析單擊目標網域名稱進入到解析設定頁面。單擊添加記錄按鈕

    2. 參照下方表格中的值填寫表單,其餘配置項保持預設,然後單擊確定

      配置項

      填入值

      記錄類型

      A

      主機記錄

      根據需要填入子網域名稱首碼。

      記錄值

      建立Service的IP地址。

變更網路類型

重要

此操作需要刪除並重建Service替換Server Load Balancer執行個體,會導致Nginx Ingress暫時中斷,被刪除的Server Load Balancer執行個體及其對應的IP無法恢複。

  1. 確認現有Server Load Balancer執行個體沒有流量:

    1. 登入Container Service管理主控台。單擊目的地組群,然後在左側網路 > 服務頁面中,找到處於kube-system命名空間的nginx-ingress-lb,記錄該Service的外部 IP 位址(External IP)

    2. 登入傳統型負載平衡CLB控制台,在上方選擇與叢集相同的地區後,找到服務地址與上一步中擷取的IP地址相同的CLB執行個體。單擊該CLB執行個體,在監控頁簽查看Server Load Balancer執行個體狀態,確認串連數為0,然後再執行後續操作。

  2. 刪除當前Nginx Ingress Controller使用的Service。

    kubectl delete svc -n kube-system nginx-ingress-lb
  3. 建立並儲存名為nginx-ingress-lb.yaml的檔案,然後使用kubectl apply -f nginx-ingress-lb.yaml建立Service。

    重要

    建立Service名稱必須為nginx-ingress-lb

    私網類型的Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet # 指明Server Load Balancer執行個體地址類型為私網類型。
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        app: ingress-nginx

    公網類型的Service

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-ingress-lb
      namespace: kube-system
      labels:
        app: nginx-ingress-lb
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
      - port: 80
        name: http
        targetPort: 80
      - port: 443
        name: https
        targetPort: 443
      selector:
        app: ingress-nginx
  4. 測試建立Service狀態,如果返回200則表明建立Service工作正常。

    curl -s -o /dev/null -w "%{http_code}\n" http://$(kubectl get service -n kube-system nginx-ingress-lb -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  5. 執行kubectl get service nginx-ingress-lb,記錄Service的External IP,然後根據建立Service類型配置DNS:

    建立私網Service

    1. 登入Alibaba Cloud DNS-內網網域名稱解析,在內網權威 > 使用者網域名稱頁簽下單擊添加網域名稱(Zone),如果已添加網域名稱,請執行步驟c。

    2. 內網權威網域名稱 (Zone)中填入網域名稱,其他選項保持預設,然後單擊確定

    3. 單擊目標網域名稱,在解析記錄頁簽,點擊添加記錄,參照下方表格中的值填寫表單,其餘配置項保持預設,然後單擊確定

      配置項

      填入值

      記錄類型

      A

      主機記錄

      根據需要填入子網域名稱首碼

      記錄值

      建立Service的IP地址。

    4. 回到使用者網域名稱列表,在目標網域名稱右側的操作列選擇生效範圍設定,在生效於阿里雲VPC內網選項中選擇ACK叢集所在的VPC,然後單擊確定

    建立公網Service

    1. 登入Alibaba Cloud DNS-公網權威解析單擊目標網域名稱進入到解析設定頁面。單擊添加記錄按鈕

    2. 參照下方表格中的值填寫表單,其餘配置項保持預設,然後單擊確定

      配置項

      填入值

      記錄類型

      A

      主機記錄

      根據需要填入子網域名稱首碼。

      記錄值

      建立Service的IP地址。

常見問題

為什麼不能先建立後刪除Service

變更Nginx Ingress Controller的網路類型時,無法使用建立Service後再刪除舊Service的切換方式,只能在刪除舊Service後建立新Service。原因是Nginx Ingress Controller組件升級時,工作負載需要使用Service預設名稱(nginx-ingress-lb)進行匹配。而Service無法重名,採取建立Service後再刪除舊Service的方式會導致工作負載無法匹配Server Load Balancer執行個體,從而升級失敗。

為什麼用戶端訪問的IP與控制台上顯示的端點不一致?

控制台Ingress頁面顯示的端點是指名稱為nginx-ingress-lb的Service所屬Server Load Balancer執行個體IP地址。當配置多個LoadBalancer類型Service時,Nginx Ingress仍可正常轉寄所有請求,但控制台不會展示其他Service所屬負載平衡IP。用戶端實際訪問的IP取決於所使用的Server Load Balancer執行個體(可通過網域名稱解析測試確認),因此可能與控制台顯示的端點不一致。

如果刪除了nginx-ingress-lb再重新建立同名的Service,對應的Ingress顯示的端點需要更新Ingress資源後才能觸發重新整理。

變更類型操作失誤後如何復原?

請按順序儘快執行:

  1. 刪除建立的Service,避免因同名導致組件無法建立預設Service。

  2. 通過控制台卸載並重新安裝Nginx Ingress Controller組件,這將在叢集中建立一個預設Service,以恢複Nginx Ingress的入口。

  3. 配置DNS,為新的預設Service(nginx-ingress-lb)添加網域名稱解析,然後測試轉寄是否正常。

相關文檔

關於配置已有的Server Load Balancer執行個體注釋,詳情請參見使用已有的負載平衡