Getting started with Amazon EKS の地雷処理

2 年ぶりに Kubernetes を使います。以前、仕事で AWS とオンプレそれぞれにクラスタを構築して運用していたもの、構築部分は k8s プロフェッショナルなエンジニアが身近にいたせいでおんぶにだっこの状態でした。過去に Kubernetes The Hard Way を AWS で実施する をしたものの、2 年も経つとほとんど忘れてしまっています。今回は EKS を使います。

まずは動作を確認するために AWS が提供している Getting Started with Amazon EKS に則って進めてみました。基本的にはドキュメントの通りでしたが、AWS 側の都合で以下 2 点の修正が必要でしたのでワークアラウンドを残しておきます。

地雷1. NAT Gateway が作成できない AZ が存在する

Region に ap-northeast-1(Tokyo) を指定すると NAT Gateway を作成できずに Cloudformation がエラーになりました(個人的な経験だと法人だと a は使用できますが個人だと b と c しか使用できないので a 側にリソースを作成できないのはアカウントに依存するのかもしれません)

f:id:kyagi:20220206180557p:plain

ワークアラウンドとしては単純に ap-northeast-1 以外のリージョンを選びました。最終的には ap-northeast-1 のどの AZ が問題なのかを明確にしたほうがいいですが、試用目的であればその限りではありません。今回は代わりに us-east-1(N.Virginia) を選びました。

地雷2. 選択した Region によっては Cloudformation で指定している AZ(a と b) でリソースに空きがない場合がある

us-east-1 を選択してクラスタを作ろうとしたのですが、AZ a にリソースの空きがないのが理由で AWS マネージメントコンソールがエラーになりました。

f:id:kyagi:20220206181304p:plain

ワークアラウンドとしては a 以外の AZ を選びました。みんな a を使っているのかもしれないので、なるべく混んでいなそうな(?) e と f を選びます。AWS 側が提供している Cloudformation の YAML ファイル をローカルに DL して以下のように修正します。

$ wget https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml
$ cp amazon-eks-vpc-private-subnets.yaml amazon-eks-vpc-private-subnets-modified.yaml

$ ruby -e "puts ('a'..'z').to_a.find_index('a')"
0
$ ruby -e "puts ('a'..'z').to_a.find_index('b')"
1
$ ruby -e "puts ('a'..'z').to_a.find_index('e')"
4
$ ruby -e "puts ('a'..'z').to_a.find_index('f')"
5

$ vi amazon-eks-vpc-private-subnets-modified.yaml
$ diff -Nurp amazon-eks-vpc-private-subnets.yaml amazon-eks-vpc-private-subnets-modified.yaml
--- amazon-eks-vpc-private-subnets.yaml 2020-10-30 07:36:35.000000000 +0900
+++ amazon-eks-vpc-private-subnets-modified.yaml    2022-02-06 15:19:24.000000000 +0900
@@ -168,7 +168,7 @@ Resources:
       MapPublicIpOnLaunch: true
       AvailabilityZone:
         Fn::Select:
-        - '0'
+        - '4'
         - Fn::GetAZs:
             Ref: AWS::Region
       CidrBlock:
@@ -189,7 +189,7 @@ Resources:
       MapPublicIpOnLaunch: true
       AvailabilityZone:
         Fn::Select:
-        - '1'
+        - '5'
         - Fn::GetAZs:
             Ref: AWS::Region
       CidrBlock:
@@ -209,7 +209,7 @@ Resources:
     Properties:
       AvailabilityZone:
         Fn::Select:
-        - '0'
+        - '4'
         - Fn::GetAZs:
             Ref: AWS::Region
       CidrBlock:
@@ -229,7 +229,7 @@ Resources:
     Properties:
       AvailabilityZone:
         Fn::Select:
-        - '1'
+        - '5'
         - Fn::GetAZs:
             Ref: AWS::Region
       CidrBlock:

同時に aws cloudformation のパラメータも修正します(--template-url https://... ではなく --template-body file://... で修正したファイルに置き換える)

$ diff -Nurp a.txt b.txt
--- a.txt   2022-02-06 15:34:18.000000000 +0900
+++ b.txt   2022-02-06 15:33:28.000000000 +0900
@@ -1 +1 @@
-aws cloudformation create-stack --region ap-northeast-1 --stack-name my-eks-vpc-stack --template-url https://amazon-eks.s3.us-west-2.amazonaws.com/cloudformation/2020-10-29/amazon-eks-vpc-private-subnets.yaml
+aws cloudformation create-stack --region us-east-1 --stack-name my-eks-vpc-stack --template-body file://amazon-eks-vpc-private-subnets-modified.yaml

あとはドキュメント通りに進んで、クラスタが作成できました。最終的にはひとつひとつの AWS リソースの構成を自分で設定していく予定ですが、動作確認のためにはこれでよしとします。個人で試用している場合、料金も気になります。立ち上げたいサービスの Docker イメージの準備をしてからクラスタを作成し、動作確認後にクラスタと Cloudformation のスタックを削除する、といった流れがよさそうです。

その他、自分の Mac にインストールしている AWS ツールが若干古かったようで下記の設定をする必要がありました。事前に確認しておくといいかもしれません。

事前準備

参考情報

EKSでの認証認可 〜aws-iam-authenticatorとIRSAのしくみ〜 - もうずっといなかぐらし