EKSクラスターのLB用サブネットに特定のタグが必要
はじめに業務でEKSクラスターを構築する上で、後になって気づいたことがあるため備忘としてまとめます。
EKSクラスターを構築するにはAWS公式にも以下のようにネットワーク要件が存在します。
代表的なものでいうと以下があります (公式情報にはその他にもあります)
- サブネットは異なる2つのAZに必要
- プライベートサブネットはアウトバウンドインターネットアクセスが必要 -> つまりNAT Gatewayが必要
- ロードバランサーをサブネットにデプロイする場合には、特定のタグが必要
今回はその中でも3. の[ロードバランサーをサブネットにデプロイする場合には特定のタグが必要]であるという点が気づいた点になります。
プライベートサブネットにLBをデプロイする場合
プライベートサブネットにロードバランサーをデプロイする場合、以下のタグが必要です。
キー | 値 |
---|---|
kubernetes.io/role/internal-elb | 1 |
CloudFormationでの記載の例
Tags:
- Key: Name
Value: kubernetes.io/role/internal-elb
パブリックサブネットにLBをデプロイする場合
パブリックサブネットにロードバランサーをデプロイする場合、以下のタグが必要です。
キー | 値 |
---|---|
kubernetes.io/role/elb | 1 |
CloudFormationでの記載の例
Tags:
- Key: Name
Value: kubernetes.io/role/elb
違いはプライベートとパブリックでinternal
が付いているかどうかですね。
internal
つまり、内部向けか外部向けかどうかを判断させるためについているわけですね。
なぜこのタグが必要になるのか?
AWS Load Balancer Controller
がEKSクラスターにマニフェストファイルの情報からALBを作成する際に、どこのサブネットに作成するのか?が判断できなくなるために、このタグ付けが必要となります。
例えば以下のようなマニフェストファイルでIngress
を定義してALBを作成しようとした場合、metadata.annotations
に記述されているalb.ingress.kubernetes.io/scheme: internal
と関連付けされ、AWS Load Balancer Controller
はkubernetes.io/role/internal-elb
のタグがついたサブネットを検索しに行き、その対象サブネットにALBを作成します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: default
annotations:
alb.ingress.kubernetes.io/scheme: internal # 内部 ALB を作成
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/subnets: subnet-xxxxxxx,subnet-yyyyyyy # サブネットId (サブネットの名称でも可能)
spec:
ingressClassName: alb
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
以下サブネットにつけたタグを探しに行く
Tags:
- Key: kubernetes.io/role/internal-elb
Value: "1"
パブリックも考え方は同様で、マニフェストファイルで以下のように記述している場合、インターネット向けのALBを作成するIngeress
を定義しているため、
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
以下タグをAWS Load Balancer Controller
が探しに行き、パブリックサブネットにALBを作成するというわけです。
Tags:
- Key: kubernetes.io/role/elb
Value: "1"
まとめ
タグはただの名前だと思っていたのであまり影響範囲はないかと思っていましたが、EKSでIngressのマニフェストをデプロイする際にかなり重要な役割を担っていることに気づきました。
EKSを使用する場合にはパブリックサブネット、プライベートサブネットにはこのタグ付け要件が存在するため設計に組み込まなければなりませんよ、ということを知らなかった人への参考になればと思います。