如何在 Amazon EKS 中自動探索 Application Load Balancer 使用的子網路?

3 分的閱讀內容
0

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中自動探索 Application Load Balancer 使用的子網路。

簡短描述

為識別 Application Load Balancer 使用的子網路,Kubernetes 雲端控制器管理員 (cloud-controller-manager) 和 AWS 負載平衡器控制器 (aws-load-balancer-controller) 會查詢叢集的子網路。此查詢會使用下列標籤做為篩選條件:

kubernetes.io/cluster/cluster-name      shared

**注意:**使用 Amazon EKS 叢集名稱取代 cluster-name

為讓 AWS 負載平衡器控制器自動探索 Application Load Balancer 使用的子網路,請標記您的子網路。

解決方法

將標籤新增至子網路

若要標記子網路,請完成以下步驟:

  1. 為 Amazon EKS 叢集部署 AWS 負載平衡器控制器附加元件

  2. 確認是否已安裝 AWS 負載平衡器控制器:

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

    **注意:**如果您在不同的命名空間中進行部署,請使用適當的命名空間取代 -n kube-system

  3. 使用下列註釋在叢集上建立 Kubernetes 傳入資源:

    annotations:    kubernetes.io/ingress.class: alb

    **注意:**AWS Load Balancer 控制器會建立負載平衡器。傳入資源將 Application Load Balancer 設定為將 HTTP(S) 流量路由至叢集內的不同 Pod。

  4. 新增內部面向網際網路的註釋,以指定傳入建立負載平衡器的位置:

    alb.ingress.kubernetes.io/scheme: internal
    -or-
    alb.ingress.kubernetes.io/scheme: internet-facing

    注意:選擇內部以建立內部負載平衡器,或選擇面向網際網路以建立公有負載平衡器。

  5. 使用標籤讓 AWS 負載平衡器控制器建立負載平衡器,以自動探索您的子網路。標籤不得包含任何開頭或結尾空格。例如:

    kubernetes.io/role/internal-elb                Set to 1 or empty tag value for internal load balancers
    kubernetes.io/role/elb                         Set to 1 or empty tag value for internet-facing load balancers

    **注意:**您可以使用標籤進行自動探索,而不是手動建立 alb.ingress.kubernetes.io/subnets 註釋。
    具有內部負載平衡器之叢集的使用正確標籤的子網路範例:

    kubernetes.io/role/internal-elb          1

    具有公有負載平衡器之叢集的使用正確標籤的子網路範例:

    kubernetes.io/role/elb                     1

    **注意:**對於叢集 1.18 版及更早版本,Amazon EKS 會將以下標籤新增至叢集建立期間傳入的所有子網路。標籤並未新增至叢集 1.19 版。如果您使用標籤,而且將叢集更新至 1.19 版,則無需再次新增該標籤。該標籤會保留在您的子網路上。

    您可以使用下列標籤來控制 Application Load Balancer 的配置位置。如果您擁有多叢集,請使用此標籤以及必要標籤來自動將 Application Load Balancer 配置至 EKS 叢集:

    kubernetes.io/cluster/$CLUSTER_NAME    shared
  6. 確認您的子網路擁有正確的標籤:

    aws ec2 describe-subnets --subnet-ids your-subnet-xxxxxxxxxxxxxxxxx
  7. 部署範例應用程式,以確認 AWS 負載平衡器控制器是否因為輸入物件而建立 Application Load Balancer:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
  8. 確認傳入資源已建立,並與 Application Load Balancer 建立關聯:

    kubectl get ingress/2048-ingress -n game-2048

    根據您在傳入物件和子網路中定義的註釋 (alb.ingress.kubernetes.io/scheme:),建立內部或面向網際網路的負載平衡器。

對常見標籤錯誤進行疑難排解

當您使用標籤自動探索子網路時,通常會發生下列錯誤。

權限遭拒錯誤

當您帳戶 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"}"

若要解決此問題,請完成下列步驟:

  1. 確認您的服務帳戶與 AWS 負載平衡器控制器相關聯:

    $ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount

    您會收到類似下列內容的輸出:

    serviceAccount: aws-load-balancer-controllerserviceAccountName: aws-load-balancer-controller

    **注意:**如果您在不同的命名空間中進行部署,請使用適當的命名空間取代 -n kube-system

  2. 檢查哪個 IAM 角色已附加至與 AWS 負載平衡器控制器相關聯的服務帳戶:

    $ kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn

    您會收到類似下列內容的輸出:

    annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx
  3. 授予您的 IAM 角色所有相關權限,例如 ec2:DescribeAvailabilityZones。如需 AWS 負載平衡器控制器如何擔任 IAM 角色來執行 API 呼叫的相關資訊,請參閱 IAM roles for service accounts。如需相關權限清單,請參閱 GitHub 的 AWS 負載平衡器控制器網頁上的 IAM JSON policy

單一子網路探索錯誤

當您的 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                Set to 1 or empty tag value for internal load balancers

公有子網路標籤:

kubernetes.io/role/elb                         Set to 1 or empty tag value for internet-facing load balancers

**注意:**您可以使用 alb.ingress.kubernetes.io/subnets 註釋,將子網路手動指派至您的負載平衡器。

使用下列格式標記子網路,不含任何開頭或結尾空格:

金鑰:kubernetes.io/cluster/your-cluster-name

值:sharedowned

如果您使用 AWS 負載平衡器控制器 v2.1.1 或更早版本,您必須以上述格式標記您的子網路。標記在 2.1.2 或更新版本中是選用功能。

在下列情況下,最佳做法是標記子網路:

  • 您擁有多個叢集,並在同一個虛擬私有雲端 (VPC) 中執行。
  • 您擁有多個 AWS 服務,並在 VPC 中共用子網路。
  • 您希望對每個叢集配置的負載平衡器擁有更多控制權。

多個子網路探索錯誤

當您的 AWS 負載平衡器控制器未能發現二或更多個子網路時,您會收到下列錯誤訊息:

「{" 級別」:「錯誤」, "ts」:"2024-08-12T 19:01:27 Z」, "msg」:「調解器錯誤」, "控制器」:「輸入」, "對象」: {"名稱」:「輸入 -2048", "命名空間」:"遊戲 -2048", "名稱」: ress-2048", "ReconcileID」: "1234567", "error」:「無法自動探索子網路:無法解析至少一個子網路(2 個符合 VPC 和標籤:\ [庫伯內特 .io/角色/內部電子版],2 個有少於 8 個可用 IP)"}」

若要解決此問題,請完成下列步驟:

  1. 確認您在不同的可用區域中擁有至少兩個子網路。這是建立 Application Load Balancer 的必要條件。
    **注意:**您可以使用單一子網路來建立 Network Load Balancer。
  2. 為每個子網路指定位元遮罩至少為 /27 的 CIDR 區塊 (例如: 10.0.0.0/27) 和至少八個免費 IP 位址。
  3. 確認子網路上標籤的格式正確。例如,標籤不得包含任何開頭或結尾空格。
AWS 官方
AWS 官方已更新 1 年前