はじめに
こんにちは。今までコンテナ関係の業務に携わったこともなければ、kubectlコマンドもほとんど実行したことがない「コンテナ初心者」でした。
最近、コンテナサービスであるAmazon EKSを触る機会が増え、そこで、EKS構築からEKSアドオンのcorednsノードを起動させる作業を何回も繰り返してきました。最初は、うまくノードが起動せず、環境を作るまでに時間がかかりましたが、回数をこなしていくうちに、スムーズに構築できるようになりました。
個人的な備忘録に近いかもしれませんが、EKSでEKSアドオンのcorednsを起動するまでの手順や注意ポイントを記載いたします。
構成図
今回の構成図は下図のようになります。
踏み台はEKSへkubectlコマンドを実行するためのサーバです。もし、EKSのクラスターエンドポイントアクセスで接続許可すれば、ローカルのWSLから接続もできますので、踏み台は必要に応じて構築してください。
※NWの各リソース作成方法についてはここでは割愛させていただきます。
※sgは、ポート443、ソース0.0.0.0/0を許可、ACLはデフォルトのままです。検証のためかなり緩いルールにしてます。
※ルートテーブルについて、Publicサブネットはigwで外部通信(送信先:0.0.0.0/0、ターゲット:igw)、PrivateサブネットはNatGateway経由で外部通信(送信先:0.0.0.0/0、ターゲット:nat)できるようになっていれば問題ありません。
EKS構築
基本的にコンソール画面に従って設定を入れていけば問題ありません。
設定画面①
IAMロールは「AmazonEKSClusterPolicy」が付与されたrolesを作成して選択しましょう。
クラスターアクセスの部分は、1度「EKS API」を許可した場合、後から「ConfigMap」のみに変更できないため注意しましょう。
設定画面②
クラスタエンドポイントアクセスは、EKSへの接続許可に関わる部分です。ここを「プライベート」に設定していることに気づかず、ずっとVPC外から接続しようとしてエラーになった経験があります。。。
設定画面③
ここはログ、メトリクス関係の設定です。今回は検証なので不要とします。
設定画面④
EKSアドオンの部分です。今回は検証なので、デフォルトでインストールされるもののみ選択します。EKSアドオンは、EKS構築後から削除、追加することはできます。
設定画面⑤
EKSアドオンのバージョン設定です。今回は検証なので、デフォルトとします。
最後に各設定一覧が表示されますので、問題なければ作成します。作成が完了するまで10分ほどかかります。
Fargateプロファイル作成
続いてFargateプロファイルを作成します。まだFargateプロファイルが作られていないため、corednsのノードは起動しようとしてますが、Pendingになっていると思います。
root@test:~# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-676bf68468-8zkql 0/1 Pending 0 117s
kube-system coredns-676bf68468-skzpv 0/1 Pending 0 117s
root@test:~#
設定画面①
IAMロールは「AmazonEKSFargatePodExecutionRolePolicy」が付与されたrolesを作成して選択しましょう。
設定画面②
corednsの名前空間は「kube-system」なのでkube-systemの名前空間を指定します。
pod確認
ここまで行ったら設定は完了です。kubectlコマンドを実行してpodのステータスを見てみましょう。
root@test:~# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-84bdd59474-6nlfb 1/1 Running 0 7m47s
kube-system coredns-84bdd59474-z4wmk 1/1 Running 0 7m47s
root@test:~#
以上で作業は完了です。もし、引き続きPending状態だった場合、rolloutを実行してpodを再配備してみてください。
podがRunningになっていないときの原因
ここまで作業を実施したがpodがRunningになっていないときの原因(私もやってしまったうっかりミス)について記載します。
- rolloutしてpodを再配備する。
# kubectl rollout restart coredns -n kube-system
- 外部通信ができるようにルートテーブルが設定されていない。
- Fargateプロファイルが作成されていない。
- 作成したFargateプロファイルの名前空間が間違っている。
おまけ
ここからはEKS構築でよく使ったコマンドを紹介します。
- .kube/configの更新
# aws eks update-kubeconfig --name [EKS名]
- リソースの一覧
# kubectl get [リソース名] -A
リソース名:pod、deployment、node、namespaceなど
- リソースの詳細確認
# kubectl describe [リソース名] -A
リソース名:pod、deployment、node、namespaceなど
- リソースの削除
# kubectl delete [リソース名] -A
リソース名:pod、deployment、node、namespaceなど
- deploymentの再起動(rollout)
# kubectl rollout restart deployment [deployment名] -n [namespace]
# kubectl rollout status deployment [deployment名] -n [namespace]
最後に
いかがでしたでしょうか。今回は検証なので、sgやEKSのアクセスなど厳密なものにしておりません。当たり前ですが、実業務でEKSを構築する場合は、EKSの各設定、NW要件、通信要件など設計した上で構築しましょう。
やはり実際に手を動かして作業をするのが、記憶に残りやすいですね。私と同じようにEKSを最近触り始めた方の参考になれば幸いです。