Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
如何在 Amazon EKS 中自動探索 Application Load Balancer 使用的子網路?
我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中自動探索 Application Load Balancer 使用的子網路。
簡短描述
為了辨識 Application Load Balancer 所使用的子網路,aws-load-balancer-controller AWS 負載平衡器控制器會查詢叢集的子網路。此查詢會使用下列標籤做為篩選條件:
kubernetes.io/cluster/cluster-name shared kubernetes.io/role/elb 1 OR kubernetes.io/role/internal-elb 1
**注意:**使用 Amazon EKS 叢集名稱取代 cluster-name。
若要允許 AWS 負載平衡器控制器自動探索 Application Load Balancer 使用的子網路,請標記您的子網路。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
將標籤新增至子網路
請完成下列步驟:
- 在您的 Amazon EKS 叢集上部署 AWS 負載平衡器控制器。
- 若要驗證您是否正確安裝了 AWS 負載平衡器控制器,請執行下列命令:
**注意:**如果您在不同的命名空間中部署了 AWS 負載平衡器控制器,請將 -n kube-system 替換為正確的命名空間。kubectl get deployment -n kube-system aws-load-balancer-controller - 使用以下註釋在叢集上建立 Kubernetes Ingress 資源:
**注意:**AWS 負載平衡器控制器有助於建立負載平衡器。Ingress 資源會設定 Application Load Balancer,以將 HTTP 和 HTTPS 流量路由到叢集中的不同 Pod。annotations: kubernetes.io/ingress.class: alb - 在 Ingress 物件註釋下,輸入 internal 以建立內部負載平衡器,或輸入 internet-facing 以建立公有負載平衡器:
-或-alb.ingress.kubernetes.io/scheme: internal
**注意:**您可以使用標籤自動探索子網路,而無需手動使用 alb.ingress.kubernetes.io/subnets 註釋。alb.ingress.kubernetes.io/scheme: internet-facing
對於叢集版本 1.18 及更舊版本,Amazon EKS 會將下列標籤新增至 Amazon EKS 在叢集建立期間傳遞的所有子網路:
**注意:**將 CLUSTER_NAME 替換為您的叢集名稱。kubernetes.io/cluster/CLUSTER_NAME
只有當您使用 AWS 負載平衡器控制器 2.1.1 或更舊版本時,才需要 kubernetes.io/cluster/CLUSTER_NAME 標籤。Amazon EKS 不會自動新增或移除此標籤。儘管 1.19 版本之前的叢集需要該標籤,但即使在叢集升級後,它仍然保留在子網路上。 - 若要驗證您的子網路是否具有正確的標籤,請執行以下 describe-subnets AWS CLI 命令:
**注意:**將 your-subnet-abcdefghxyz 替換為您的子網路 ID。aws ec2 describe-subnets --subnet-ids your-subnet-abcdefghxyz - 若要部署範例應用程式,請執行以下命令:
**注意:**上述命令由於 Ingress 物件而建立了一個 Application Load Balancer。kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml - 若要驗證 Amazon EKS 是否建立了 Ingress 資源和關聯的 Application Load Balancer,請執行下列命令:
kubectl get ingress/2048-ingress -n game-2048
標籤錯誤疑難排解
根據您在使用標籤自動探索子網路時遇到的錯誤,執行下列動作。
權限遭拒問題
您 AWS 帳戶的 AWS 負載平衡器控制器的 AWS Identity and Access Management (IAM) 角色必須具有所需的權限。如果沒有,那麼您會收到以下錯誤訊息:
"{"level":"error","ts":1621443417.9175518,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":" ingress-2048","namespace":" game-2048","error":"couldn't auto-discover subnets: UnauthorizedOperation: You are not authorized to perform this operation.\n\tstatus code: 403, request id: 72ee57ae-f804-4f81-b069-8b04114b67b0"}"
若要解決此問題,請完成以下步驟:
-
若要驗證您的服務帳戶是否與 AWS 負載平衡器控制器相關聯,請執行下列命令:
kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount**注意:**如果您在不同的命名空間中部署了 AWS 負載平衡器控制器,請將 -n kube-system 替換為正確的命名空間。
輸出範例:serviceAccount: aws-load-balancer-controller serviceAccountName: aws-load-balancer-controller -
若要識別與 AWS 負載平衡器控制器關聯的服務帳戶所附加的 IAM 角色,請執行下列命令:
kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn輸出範例:
annotations: eks.amazonaws.com/role-arn: arn:aws:iam::abcdefxyz:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-abcdefxyz
**注意:**如果您未使用服務帳戶 (IRSA) 的 IAM 角色,請確保 Amazon EKS 工作節點所使用的 IAM 角色具有所需的權限。若要查看所需的權限,請參閱 GitHub 網站上的 iam_policy.json。
單一子網路探索問題
當您的 AWS 負載平衡器控制器未能發現至少一個子網路時,您會收到下列其中一則錯誤訊息:
"{"level":"error","ts":1608229710.3212903,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"ingress-2048","namespace":"game-2048","error":"couldn't auto-discover subnets: unable to resolve at least one subnet"}"
-或-
"kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to
retrieval of subnets failed to resolve 2 qualified subnets.Subnets must contain the kubernetes.io/cluster/\u003ccluster name\u003e tag with a value of shared or owned and the kubernetes.io/role/elb tag signifying it should be used for ALBs Additionally, there must be at least 2 subnets with unique availability zones as required by ALBs.Either tag subnets to meet this requirement or use the subnets annotation on the ingress resource to explicitly call out what subnets to use for ALB creation.The subnets that did resolve were []" "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}"
若要解決此問題,請為子網路新增標籤,以允許 AWS 負載平衡器控制器使用自動探索功能來建立負載平衡器。
對於私有子網路,請新增以下標籤:
kubernetes.io/role/internal-elb 1
對於公有子網路,請新增以下標籤:
kubernetes.io/role/elb 1
**注意:**您可以使用 alb.ingress.kubernetes.io/subnets 註釋,手動將子網路指派給負載平衡器。若要查看所需的權限,請參閱 GitHub 網站上的 iam_policy.json。
使用下列格式標記子網路,不含任何開頭或結尾空格:
- 在「金鑰」中,輸入 kubernetes.io/cluster/您的叢集名稱。
- 在「值」中,輸入共用或擁有。
如果您使用 AWS 負載平衡器控制器版本 2.1.1 或更舊版本,則必須依照上述格式標記您的子網路。標記在 2.1.2 或更新版本中是選用功能。
在下列情況下,最佳做法是標記子網路:
- 您擁有多個叢集,並在同一個虛擬私有雲端 (VPC) 中執行。
- 您擁有多個 AWS 服務,並在 VPC 中共用子網路。
- 您希望對每個叢集配置的負載平衡器擁有更多控制權。
多個子網路探索錯誤
當您的 AWS 負載平衡器控制器未能發現兩個或更多個子網路時,您會收到下列錯誤訊息:
"{"level":"error","ts":"2024-08-12T19:01:27Z","msg":"Reconciler error","controller":"ingress","object":{"name":"ingress-2048","namespace":"game-2048"},"namespace":"game-2048","name":"ingress-2048","reconcileID":"1234567","error":"couldn't auto-discover subnets: unable to resolve at least one subnet (2 match VPC and tags: [kubernetes.io/role/internal-elb], 2 have fewer than 8 free IPs)"}"
若要解決此問題,請完成以下步驟:
- 確認您在不同的可用區域中擁有至少兩個子網路。
**注意:**這是建立 Application Load Balancer 的必要條件。您可以使用單一子網路來建立 Network Load Balancer。 - 對於每個子網路,指定一個至少具有 /27 位元遮罩 (例如 10.0.0.0/27) 和至少 8 個可用 IP 位址的 CIDR 區塊。
- 確認子網路上的標籤格式正確。例如,標籤不得包含任何開頭或結尾空格。
- 語言
- 中文 (繁體)

相關內容
AWS 官方已更新 3 年前
