Amazon EKS で Application Load Balancer が使用するサブネットを自動的に検出する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) でApplication Load Balancer が使用しているサブネットを自動的に検出したいと考えています。
簡単な説明
Application Load Balancer が使用するサブネットを識別するために、AWS Load Balancer Controller (aws-load-balancer-controller) はクラスターのサブネットをクエリします。このクエリでは、次のタグをフィルターとして使用します。
kubernetes.io/cluster/cluster-name shared kubernetes.io/role/elb 1 OR kubernetes.io/role/internal-elb 1
**注:**cluster-name を Amazon EKS クラスター名に置き換えます。
サブネットにタグを付けると、AWS Load Balancer Controller は、Application Load Balancer が使用するサブネットを自動的に検出できます。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
サブネットにタグを追加する
次の手順を実行します。
- Amazon EKS クラスターに AWS Load Balancer Controller をデプロイします。
- AWS Load Balancer Controller が正しくインストールされていることを確認するには、次のコマンドを実行します。
注:AWS Load Balancer Controller を別の名前空間にデプロイした場合は、-n kube-system を正確な名前空間に置き換えてください。kubectl get deployment -n kube-system aws-load-balancer-controller - 次のアノテーションを指定し、クラスターに Kubernetes Ingress リソースを作成します。
注: Load Balancer Controller は、ロードバランサーの作成を支援します。Ingress リソースは Application Load Balancer の構成を行い、HTTP トラフィックと HTTPS トラフィックをクラスター内の複数ポッドにルーティングします。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 Load Balancer Controller バージョン 2.1.1 以前を使用する場合のみ、kubernetes.io/cluster/CLUSTER_NAME タグが必要です。このタグは、Amazon EKS により自動的には追加、削除されません。このタグはバージョン 1.19 より前のクラスターでは必須でしたが、クラスターをアップグレードした後もサブネットに残ります。 - サブネットに正しいタグを付与したことを確認するには、次の AWS CLI コマンド describe-subnets を実行します。
注: 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 Load Balancer Controller に対する 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 Load Balancer Controller に関連付けられていることを確認するには、次のコマンドを実行します。
kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount注:AWS Load Balancer Controller を別の名前空間にデプロイした場合は、-n kube-system を正確な名前空間に置き換えてください。
出力例:serviceAccount: aws-load-balancer-controller serviceAccountName: aws-load-balancer-controller -
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::abcdefxyz:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-abcdefxyz
注: サービスアカウント (IRSA) で IAM ロールを使用しない場合は、Amazon EKS ワーカーノードの IAM ロールに必須の権限を含める必要があります。必須の権限については、GitHub のウェブサイトで iam_policy.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 1
パブリックサブネットでは、次のタグを追加します。
kubernetes.io/role/elb 1
注: アノテーション (alb.ingress.kubernetes.io/subnets) を指定すると、サブネットをロードバランサーに手動で割り当てられます。必須の権限については、GitHub のウェブサイトで iam_policy.json を参照してください。
先頭や末尾にスペースを入れずに、次の形式でサブネットにタグを付けます。
- Key に kubernetes.io/cluster/your-cluster-name を入力します。
- Value に shared または owned を入力します。
AWS Load Balancer Controller バージョン 2.1.1 以前を使用する場合は、サブネットに上記の形式でタグを付ける必要があります。バージョン 2.1.2 以降では、タグ付けは省略可能です。
次のシナリオでは、サブネットにタグを付けるのがベストプラクティスです。
- 同じ仮想プライベートクラウド (VPC) で実行されている複数のクラスターがあります。
- VPC のサブネットを共有する AWS サービスが複数あります。
- 各クラスターのロードバランサーの割り当て場所をより細かく制御したい。
複数のサブネット検出エラー
AWS Load Balancer Controller が 2 つ以上の適格なサブネットを検出できなかった場合、次のエラーメッセージが表示されます。
"{"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)"}"
この問題を解決するには、次の手順を実行します。
- 2 つの異なるアベイラビリティーゾーンに 2 つ以上のサブネットが配置されていることを確認します。
注: これは Application Load Balancer を作成するための要件です。Network Load Balancer は、単一サブネットで作成できます。 - 各サブネットに /27 ビットマスク以上の CIDR ブロックを指定し (例: 10.0.0.0/27)、8 個以上の空き IP アドレスを割り当てます。
- サブネットのタグ形式が適切であることを確認します。たとえば、タグの先頭または末尾にスペースを含めることはできません。
- トピック
- Containers
- 言語
- 日本語

関連するコンテンツ
- 質問済み 2年前
