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 でのアプリケーションロードバランシング