如何對使用 AWS 負載平衡器控制器建立負載平衡器時出現的問題進行疑難排解?

上次更新日期︰2021 年 10 月 29 日

我無法使用 AWS 負載平衡器控制器 (之前稱為 ALB 傳入控制器) 建立 Network Load Balancer (NLB) 或 Application Load Balancer (ALB)。或者,負載平衡器不會在我建立服務或傳入物件之後建立。如何對此錯誤進行疑難排解?

簡短描述

若要對負載平衡器建立問題疑難排解,請執行下列操作:

  • 請確定符合所有必要條件。
  • 查看傳入 (ALB) 或服務 (NLB) 物件的註釋。
  • 如需其他資訊,請檢閱 AWS 負載平衡器控制器 Pod 的日誌。
  • 如果叢集在 AWS Fargate 上執行,請確認是否已為傳入或服務物件所在的命名空間建立 Fargate 描述檔。
  • 確認是否有未解決的相依項。

解決方案

確定符合所有必要條件

如需 ALB 先決條件清單,請參閱 Amazon Elastic Kubernetes Service (Amazon EKS) 上的應用程式負載平衡。如需 NLB 先決條件的清單,請參閱 Amazon EKS 上的網路負載平衡

1.    確認 AWS 負載平衡器控制器已成功佈建。

2.    檢查子網路的數目。ALB 至少需要兩個子網路,而 NLB 至少需要一個子網路。如需詳細資訊,請參閱檢視您的子網路

3.    在某些情況下,您必須使用下列標籤:

  • 金鑰:"kubernetes.io/cluster/cluster-name"
  • 值:"shared" or "owned"

如果您使用的 Application Load Balancer

在下列案例中,必須只標記一個安全群組:

  • 您正在使用連接至工作節點的多個安全群組。
  • 您正在使用 AWS 負載平衡器控制器版本 v2.1.1 或更早版本。

如果您使用 Network Load Balancer

如果您正在使用 AWS 負載平衡器控制器 v2.1.1 或更早版本,則必須標記子網路。

如需有關從 Amazon EC2 主控台新增標籤的資訊,請參閱透過主控台使用標籤。如需有關使用 AWS Command Line Interface 新增標籤的資訊,請參閱透過命令列使用標籤

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

4.    除非子網路 ID 明確指定為服務物件或傳入物件中的註釋,否則請確定子網路具有下列標籤。如果沒有這些標籤,子網路自動探索將無法運作。

私有子網路標籤:

  • 金鑰︰"kubernetes.io/role/internal-elb"
  • 值︰"1"

公有子網路標籤:

  • 金鑰︰"kubernetes.io/role/elb"
  • 值︰"1"

查看傳入 (ALB) 或服務 (NLB) 物件的註釋

驗證服務物件上的注釋傳入物件上的注釋。設定負載平衡器所需的註釋如下:

注意:其他註釋會使用預設值。

Application Load Balancer

  • kubernetes.io/ingress.class: alb (確定傳入物件會使用 AWS 負載平衡器控制器)

Network Load Balancer

  • 使用 IP 目標:service.beta.kubernetes.io/aws-load-balancer-type: “external” service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: “ip”
  • 使用執行個體目標:service.beta.kubernetes.io/aws-load-balancer-type: “external” service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: “instance”

執行下列其中一項命令以檢視服務或傳入物件。在下列範例中,將 SERVICE-NAME/INGRESS-NAMENAMESPACE 取代為您的使用案例的正確值。

kubectl describe service <SERVICE-NAME> -n <NAMESPACE>
kubectl describe ingress <INGRESS-NAME> -n <NAMESPACE>

執行下列其中一項命令以編輯服務或傳入物件。在下列範例中,將 SERVICE-NAME/INGRESS-NAMENAMESPACE 取代為您的使用案例的正確值:

kubectl edit service <SERVICE-NAME> -n <NAMESPACE>
kubectl edit ingress <INGRESS-NAME> -n <NAMESPACE>

如需其他資訊,請檢閱 AWS 負載平衡器控制器 Pod 的日誌

執行下列命令以檢閱 AWS 負載平衡器控制器日誌:

kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller

如果沒有任何控制器 Pod 顯示日誌,請確定控制器 Pod 正在執行:

kubectl get deployment -n kube-system aws-load-balancer-controller

如果叢集在 Fargate 上執行,請確認是否已為傳入或服務物件所在的命名空間建立 Fargate 描述檔

執行下列命令,以確認是否有針對傳入或服務物件所在的命名空間建立 Fargate 描述檔。在下列範例中,將 CLUSTER-NAME 取代為叢集名稱。

eksctl get fargateprofile --cluster <CLUSTER-NAME> -o yaml

若要建立 Fargate 描述檔,請執行下列命令。在下列範例中,將 CLUSTER-NAMEREGIONFARGATE-PROFILE-NAMENAMESPACE 取代為您的使用案例的正確值。

eksctl create fargateprofile --cluster <CLUSTER-NAME> --region <REGION> --name <FARGATE-PROFILE-NAME> --namespace <NAMESPACE>

確認是否有未解決的相依項

檢閱文件以確定符合所有相依項。如需 ALB,請參閱 EKS 上的應用程式負載平衡。如需 NLB,請參閱 Amazon EKS 上的網路負載平衡

例如,如果您正在使用 ALB,則服務物件必須指定 NodePortLoadBalancer 以使用執行個體流量模式。


此文章是否有幫助?


您是否需要帳單或技術支援?