跳至內容

如何在 Amazon EKS 中設定及疑難排解 Ingress NGINX 控制器?

4 分的閱讀內容
0

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集上設定 Kubernetes 的 Ingress NGINX 控制器。我想要對相關問題進行疑難排解。

簡短說明

Ingress NGINX 控制器會部署、設定並管理包含 NGINX 執行個體的 Pod,而 NGINX 是一個開放原始碼的 HTTP 與反向 Proxy 伺服器。這些 Pod 會透過控制器的服務資源公開。該服務資源會接收由 Kubernetes 輸入與服務資源所代表的相關應用程式流量。如需更多資訊,請參閱 GitHub 網站上的 Ingress NGINX 控制器,及 NGINX 網站上的 NGINX

解決方法

選用: 安裝 Helm。如需更多資訊,請參閱 Helm 網站上的安裝 Helm。當您使用 YAML 資訊清單來安裝 Ingress NGINX 控制器時,無需安裝 Helm。

選用: 安裝 AWS Load Balancer 控制器。您需要使用此控制器,才能將 Network Load Balancer 目標群組的目標類型設定為 IP 目標類型。IP 目標類型會將 Ingress NGINX 控制器 Pod 的 IP 註冊到目標群組。執行個體目標類型則使用 Ingress NGINX 控制器在 NodePort 上的服務來註冊執行個體。

安裝 Ingress NGINX 控制器

使用以下其中一種方法,在 Kubernetes 叢集中安裝 Ingress NGINX 控制器:

使用定義所有不同元件的 YAML 資訊清單檔案。使用 kubectl 來建立資訊清單中的資源。

-或-

使用 Helm 透過專案的儲存庫圖表部署 Ingress NGINX 控制器。

您可以透過 AWS Classic Load Balancer 或 AWS Network Load Balancer 將 Ingress NGINX 控制器對外公開。預設情況下,兩種方法皆會透過面向網際網路的 Classic Load Balancer 對外公開控制器。

使用 Helm 部署 Ingress NGINX 控制器

使用適用的命令來設定並公開控制器:

面向網際網路的 Classic Load Balancer

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
ingress-nginx

內部 Classic Load Balancer

您必須在公開 Ingress NGINX 控制器的 Kubernetes 服務上新增以下註解:

service.beta.kubernetes.io/aws-load-balancer-internal: true

範例:

面向網際網路的 Network Load Balancer

若要將 Load Balancer 從 Classic 變更為 Network,請新增以下註解:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

範例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
ingress-nginx

內部 Network Load Balancer

若要佈建內部 Network Load Balancer,請新增以下註解:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

service.beta.kubernetes.io/aws-load-balancer-internal: true

範例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="nlb" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-internal"="true" \
ingress-nginx

透過 AWS Load Balancer 控制器以 IP 模式運作的 Network Load Balancer

叢集必須已安裝 AWS Load Balancer 控制器。如需更多資訊,請參閱 GitHub 網站上的 AWS Load Balancer 控制器

使用以下註解可確保 AWS Load Balancer 控制器接管 Network Load Balancer 的佈建作業:

service.beta.kubernetes.io/aws-load-balancer-type: external

預設情況下,系統會建立內部 Network Load Balancer。不過,您可以新增以下註解,以建立面向網際網路且具有 IP 目標群組目標類型的 Network Load Balancer:

service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing

範例:

helm upgrade --install ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-type"="external" \
--set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-scheme"="internet-facing" \
ingress-nginx

使用 kubectl 和 YAML 資訊清單檔案

下載 YAML 資訊清單檔案。以下命令會下載 Ingress NGINX 控制器版本 1.11.2:

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

**注意:**您可以將該值替換為其他控制器版本。如需更多資訊,請參閱 GitHub 網站上的標籤。在某些情況下,您必須為 ingress-nginx-controller Kubernetes Load Balancer 服務新增註解,以變更系統所佈建之 Load Balancer 的類型與屬性。

範例:

curl -Lo ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/cloud/deploy.yaml

面向網際網路的 Classic Load Balancer

您可以直接將該資訊清單套用至叢集,無需任何修改。請執行以下命令:

kubectl apply -f ingress-nginx.yaml

內部 Classic Load Balancer

請完成下列步驟:

  1. 修改 YAML 資訊清單,新增註解區段,並指定以下註解:
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    範例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. 執行以下命令,將該資訊清單套用至您的叢集:

    kubectl apply -f ingress-nginx.yaml

面向網際網路的 Network Load Balancer

  1. 使用以下註解以建立 Network Load Balancer:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    範例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
      ...
    type: LoadBalancer
    ...
  2. 執行以下命令,將該資訊清單套用至您的叢集:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    範例:

    kubectl apply -f ingress-nginx.yaml

內部 Network Load Balancer

  1. 同時使用以下註解以建立內部 Network Load Balancer:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
    service.beta.kubernetes.io/aws-load-balancer-internal: true
    範例:

    ...
    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
        service.beta.kubernetes.io/aws-load-balancer-internal: true
      ...
    type: LoadBalancer
    ...
  2. 執行以下命令,將該資訊清單套用至您的叢集:

    kubectl apply -f ingress-nginx.yaml

透過 AWS Load Balancer 控制器以 IP 模式運作的 Network Load Balancer

  1. 在叢集中安裝 AWS Load Balancer 控制器。如需更多資訊,請參閱 GitHub 網站上的 AWS Load Balancer 控制器。使用以下註解可讓 AWS Load Balancer 控制器佈建 Network Load Balancer:

    service.beta.kubernetes.io/aws-load-balancer-type: external
  2. 預設情況下,系統會建立內部 Network Load Balancer。若要建立面向網際網路,且目標群組目標類型為 IP 的 Network Load Balancer,請新增以下註解:
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    範例:

    apiVersion: v1
    kind: Service
    metadata:
      ...
      name: ingress-nginx-controller
      namespace: ingress-nginx
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: external
        service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
      ...
    type: LoadBalancer
  3. 執行以下命令,將該資訊清單套用至您的叢集:

    kubectl apply -f ingress-nginx.yaml

對問題進行疑難排解

如需更多資訊,請參閱 GitHub 網站上的疑難排解

子網路錯誤

如果 Network Load Balancer 無法自動探索子網路,您可能會收到以下錯誤訊息:

「Reconciler error","controller":"ingress",...,"error":"couldn't auto-discover subnets: unable to resolve at least one subnet」

AWS Load Balancer 控制器會使用子網路標籤自動尋找可用於負載平衡器的子網路。對於 AWS Load Balancer,控制器至少需要兩個位於不同可用區域的子網路。對於 Network Load Balancer,控制器至少需要一個子網路。若要啟用自動探索,您必須為子網路新增標籤:

  • 以金鑰 kubernetes.io/role/elb 標記公共子網路。將值設定為 1。
  • 以金鑰 kubernetes.io/role/internal-elb 標記私有子網路。將值設定為 1。
  • 如果您使用的是 AWS Load Balancer 控制器版本 2.1.1 或更舊版本,請使用金鑰 kubernetes.io/cluster/your-cluster-name 標記公共與私有子網路。將值設定為已擁有已共用

位址欄位未顯示於 kubectl get 或 describe ingress

當您執行 kubectl get ingress your-ingress-name 命令時,位址欄位可能為空白。或是 kubectl describe ingress 可能未顯示已指派的位址。在上述任一情況下,請執行以下動作:

  • 描述 Ingress 資源以確認其是否使用正確的 ingressClassNamekubernetes.io/ingress.class 註解。Ingress NGINX 控制器的 IngressClass 名稱必須與 ingressClassName 欄位或 kubernetes.io/ingress.class annotation (kubernetes.io/ingress.class 註解) 的值相符。如果不相符,請將 Ingress NGINX 控制器的 IngressClass 資源設定為叢集的唯一預設 IngressClass。如需更多資訊,請參閱 Kubernetes 網站上的預設 IngressClass
  • 描述 Ingress 資源,以檢查是否有 Ingress NGINX 控制器新增至事件的錯誤。如果沒有事件,則表示事件已達其存留時間限制。或是 Ingress NGINX 控制器無法偵測需處理的輸入。
  • 執行以下命令,以檢查 Ingress NGINX 控制器 Pod 的日誌中是否存在角色型存取控制 (RBAC) 或其他相關錯誤:
    kubectl logs ingress-nginx-controller-pod-name -n ingress-nginx-namespace
    **注意:**請將 ingress-nginx-controller-pod-name 替換為您的 Ingress NGINX 控制器 Pod 名稱。將 ingress-nginx-namespace 替換為您的 Ingress NGINX 命名空間名稱。

存取與請求日誌

檢查 Ingress NGINX 控制器的預設日誌格式,尋找有關特定請求與回應的資訊。若要這麼做,請參閱 GitHub 網站上的 日誌格式。在以下範例中,預設日誌格式與下列範例日誌相符。它顯示後端目標的 IP 位址與連接埠為 192.168.114.102.80,且後端目標的 HTTP 回應為 200。

192.168.116.133 - - \[24/Sep/2024:22:14:59 +0000\] "GET / HTTP/1.1" 200 45 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10\_15\_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36" 524 0.003 \[default-apache-service-80\] \[\] 192.168.114.102:80 45 0.003 200 ffe584bdeb28959241e8d8408cfc06e5

相關資訊

公開 Kubernetes 應用程式,第 3 部分: Ingress-Nginx 控制器

AWS 官方已更新 2 個月前