Amazon EKS で Application Load Balancer が使用するサブネットを自動的に検出する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) でApplication Load Balancer が使用しているサブネットを自動的に検出したいと考えています。
簡単な説明
Application Load Balancer が使用するサブネットを識別するには、Kubernetes Cloud Controller Manager (cloud-controller-manager) と AWS Load Balancer Controller (aws-load-balancer-controller) がクラスターのサブネットをクエリします。このクエリでは、次のタグをフィルターとして使用します。
kubernetes.io/cluster/cluster-name shared
**注:**cluster-name を Amazon EKS クラスター名に置き換えます。
AWS Load Balancer Controller が Application Load Balancer が使用するサブネットを自動的に検出できるようにするには、サブネットにタグを付けます。
解決策
サブネットへのタグの追加
サブネットにタグを付けるには、次の手順を実行します。
-
Amazon EKS クラスターに AWS Load Balancer Controllerアドオンをデプロイします。
-
AWS Load Balancer Controller がインストールされていることを確認します。
kubectl get deployment -n kube-system aws-load-balancer-controller
注:別の名前空間にデプロイする場合は、-n kube-system を適切な名前空間に置き換えてください。
-
以下のアノテーションを付けてクラスターに Kubernetes Ingress リソースを作成します。
annotations: kubernetes.io/ingress.class: alb
**注:**AWS Load Balancer Controller はロードバランサーを作成します。Ingress リソースは、HTTP (S) トラフィックをクラスター内のさまざまなポッドにルーティングするように Application Load Balancer を構成します。
-
内部アノテーションまたはインターネット向けアノテーションを追加して、Ingress にロードバランサーを作成させたい場所を指定します。
alb.ingress.kubernetes.io/scheme: internal -or- alb.ingress.kubernetes.io/scheme: internet-facing
**注:**内部ロードバランサーを作成するには [internal] を選択し、パブリックロードバランサーを作成するには [Internet-Facing] を選択します。
-
タグを使用して、AWS Load Balancer Controller がサブネットを自動的に検出するロードバランサーを作成できるようにします。タグの先頭または末尾にスペースを含めることはできません。例:
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 の割り当て場所を制御できます。複数のクラスターの場合は、必要なタグに加えてこのタグを使用して、EKS クラスターに Application Load Balancer を自動的に割り当てます。
kubernetes.io/cluster/$CLUSTER_NAME shared
-
サブネットに正しいタグが付いていることを確認します。
aws ec2 describe-subnets --subnet-ids your-subnet-xxxxxxxxxxxxxxxxx
-
サンプルアプリケーションをデプロイして、AWS Application Load Balancerが Ingress オブジェクトによってアプリケーションロードバランサーを作成することを確認します。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
-
Ingress リソースが作成され、Application Load Balancer が関連付けられていることを確認します。
kubectl get ingress/2048-ingress -n game-2048
Ingress オブジェクトとサブネットで定義したアノテーション (alb.ingress.kubernetes.io/scheme:) に応じて、内部向けロードバランサーまたはインターネット向けロードバランサーが作成されます。
一般的なタグエラーのトラブルシューティング
タグを使用してサブネットを自動的に検出すると、次のエラーがよく発生します。
権限拒否エラー
アカウントの AWS Load Balancer Controller の AWS ID およびアクセス管理 (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 Load Balancer Controller に関連付けられていることを確認します。
$ 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 を適切な名前空間に置き換えてください。
-
AWS Load Balancer Controller に関連付けられているサービスアカウントに、どの IAM ロールがアタッチされているかを確認します。
$ 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
-
ec2:DescribeAvailabilityZones など、関連するすべての権限を IAM ロールに付与します。AWS Load Balancer Controller が IAM ロールを引き受けて API 呼び出しを実行する方法の詳細については、「サービスアカウントの IAM ロール」を参照してください。関連する権限のリストについては、GitHub の AWS Load Balancer Controller のウェブページにある IAM JSON ポリシーを参照してください。
単一サブネット検出エラー
AWS Load Balancer Controller が少なくとも 1 つのサブネットを検出しない場合、次のいずれかのエラーメッセージが表示されます。
"{"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 Load Balancer Controller が自動検出を使用してロードバランサーを作成できるようにします。
プライベートサブネットのタグ:
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
値: shared または owned
AWS Load Balancer Controller バージョン v2.1.1 以前を使用する場合は、前述の形式でサブネットにタグを付ける必要があります。バージョン 2.1.2 以降では、タグ付けはオプションです。
次のシナリオでは、サブネットにタグを付けるのがベストプラクティスです。
- 同じ仮想プライベートクラウド (VPC) で実行されている複数のクラスターがあります。
- VPC のサブネットを共有する AWS サービスが複数あります。
- 各クラスターのロードバランサーの割り当て場所をより細かく制御したい。
複数のサブネット検出エラー
AWS Load Balancer Controller が 2 つ以上の適格なサブネットを検出しない場合、次のエラーメッセージが表示されます。
「{" レベル」: "エラー」, "ts」: "2024-08-12T 19:01:27 Z」, "msg」: "リコンサイラーエラー」, "コントローラ」: "ingress」, "object」: {"name」: "ingress-2048"," namespace」: "game-2048"}," 名前空間」: "game-2048"," name」: "ingress-2048"," ReconcileID」: "1234567"," error」: "サブネットを自動検出できませんでした:" 少なくとも1つのサブネットを解決できません (2つはVPCとタグが一致します:\ [kubernetes.io/role/internal-elb]、2 個の空きIPが8個未満です) "}」
この問題を解決するには、次のステップを実行してください。
- 2 つの異なるアベイラビリティーゾーンに少なくとも 2 つのサブネットがあることを確認します。これは Application Load Balancer を作成するための要件です。
**注:**1 つのサブネットでネットワークロードバランサーを作成できます。 - サブネットごとに、少なくとも /27 ビットマスクを含む CIDR ブロックを指定します (例: 10.0.0.0/27) および少なくとも 8 つの空いている IP アドレス。
- サブネットのタグが正しくフォーマットされていることを確認します。たとえば、タグの先頭または末尾にスペースを含めることはできません。
関連するコンテンツ
- 質問済み 2年前lg...
- 質問済み 6ヶ月前lg...
- 質問済み 6年前lg...
- 質問済み 6日前lg...