0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】EKSクラスターのLB用サブネットのタグ付け要件

Posted at

EKSクラスターのLB用サブネットに特定のタグが必要

はじめに業務でEKSクラスターを構築する上で、後になって気づいたことがあるため備忘としてまとめます。
EKSクラスターを構築するにはAWS公式にも以下のようにネットワーク要件が存在します。

代表的なものでいうと以下があります (公式情報にはその他にもあります)

  1. サブネットは異なる2つのAZに必要
  2. プライベートサブネットはアウトバウンドインターネットアクセスが必要 -> つまりNAT Gatewayが必要
  3. ロードバランサーをサブネットにデプロイする場合には、特定のタグが必要

今回はその中でも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 Controllerkubernetes.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を使用する場合にはパブリックサブネット、プライベートサブネットにはこのタグ付け要件が存在するため設計に組み込まなければなりませんよ、ということを知らなかった人への参考になればと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?