ロードバランサーまたはイングレスコントローラーで自動サブネット検出させるために、Amazon EKS クラスター内の Amazon VPC サブネットにタグを付ける方法を教えてください。

所要時間2分
0

Amazon Virtual Private Cloud (Amazon VPC) のパブリックまたはプライベートサブネットにロードバランサーまたはイングレスコントローラーをデプロイしたいと考えています。Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで Kubernetes がサブネットを検出できないのはなぜですか?

簡単な説明

Kubernetes Cloud Controller Manager (cloud-controller-manager) と AWS Load Balancer Controller (aws-load-balancer-controller) は、クラスターのサブネットをクエリしてサブネットを識別します。このクエリは、次のタグをフィルターとして使用します。

kubernetes.io/cluster/cluster-name

注: cluster-name を Amazon EKS クラスター名に置き換えます。

Cloud Controller Manager と AWS Load Balancer Controller はどちらも、サブネットに次のいずれかのタグが必要です。

kubernetes.io/role/elb
  • または -
kubernetes.io/role/internal-elb

注: 上記のタグを使用しない場合、Cloud Controller Manager は、関連するルートテーブルを調べて、サブネットがパブリックかプライベートかを判断します。プライベートサブネットとは異なり、パブリックサブネットはインターネットゲートウェイを使ってインターネットへの直接ルートを取得します。

サブネットをどちらのタグにも関連付けておらず、AWS Load Balancer Controller を使用している場合、エラーが表示されます。

例えば、Kubernetes サービスのトラブルシューティングを行っているときに kubectl describe service your-service-name コマンドを実行すると、次のエラーが表示されます。

Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   EnsuringLoadBalancer        9s (x2 over 14s)  service-controller  Ensuring load balancer
  Warning  CreatingLoadBalancerFailed  9s (x2 over 14s)  service-controller  Error creating load balancer (will retry): failed to ensure load balancer for service default/guestbook: could not find any suitable subnets for creating the ELB

Application Load Balancer Ingress Controller のトラブルシューティングを行っているときに kubectl logs your-aws-load-balancer-controller-pod-name コマンドを実行すると、次のエラーが表示されます。

E0121 22:44:02.864753       1 controller.go:217] 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"}

注: eksctl を使用して VPC を作成する場合、その VPC 内のすべてのサブネットに kubernetes.io/role/elb タグと kubernetes.io/role/internal-elb タグがあります。

解決方法

サブネットのタグ付けに適切なオプションを選択します。

ロードバランサーリソースで使用するパブリックおよびプライベートサブネットの場合

クラスターがロードバランサーリソースに使用するすべてのパブリックサブネットとプライベートサブネットを、次のキーと値のペアでタグ付けします。

Key: kubernetes.io/cluster/cluster-name
Value: shared

注: cluster-name を Amazon EKS クラスター名に置き換えます。shared 値は、複数のクラスターがサブネットを使用できるようにします。

内部ロードバランサーが使用するプライベートサブネットの場合

Kubernetes が内部ロードバランサーにプライベートサブネットを使用できるようにするには、VPC のすべてのプライベートサブネットに次のキーと値のペアをタグ付けします。

Key: kubernetes.io/role/internal-elb
Value: 1

外部ロードバランサーが使用するパブリックサブネットの場合

Kubernetes が外部ロードバランサーにタグ付きサブネットのみを使用できるようにするには、VPC 内のすべてのパブリックサブネットに次のキーと値のペアをタグ付けします。

Key: kubernetes.io/role/elb
Value: 1

注: 各アベイラビリティーゾーンでパブリックサブネットを使用する代わりに、前述のタグを使用します。


関連情報

Amazon EKS VPC とサブネットの要件および考慮事項

GitHub ウェブサイトでのサブネットの自動検出

Amazon EKS でのアプリケーションロードバランシング

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ