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

最終更新日: 2020 年 2 月 7 日

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

簡単な説明

クラスターのサブネットを識別するには、Kubernetes Cloud Controller Manager (cloud-controller-manager) と ALB Ingress Controller (alb-ingress-controller) が次のタグをフィルタとして使用して、そのクラスターのサブネットをクエリします。

kubernetes.io/cluster/cluster-name

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

kubernetes.io/role/elb

-- または --

kubernetes.io/role/internal-elb

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

サブネットをいずれのタグにも関連付けていない場合、エラーが表示されます。

たとえば、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

ALB Ingress Controller のトラブルシューティングを行っているときに kubectl logs your-alb-ingress-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

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