【初心者向け】Amazon EKSでcorednsノードを起動させる

# はじめに
　こんにちは。今までコンテナ関係の業務に携わったこともなければ、kubectlコマンドもほとんど実行したことがない「コンテナ初心者」でした。
　最近、コンテナサービスであるAmazon EKSを触る機会が増え、そこで、EKS構築からEKSアドオンのcorednsノードを起動させる作業を何回も繰り返してきました。最初は、うまくノードが起動せず、環境を作るまでに時間がかかりましたが、回数をこなしていくうちに、スムーズに構築できるようになりました。
　個人的な備忘録に近いかもしれませんが、EKSでEKSアドオンのcorednsを起動するまでの手順や注意ポイントを記載いたします。

# 構成図
　今回の構成図は下図のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/b2b55f85-3c10-aef5-b822-173bab2982c8.png)
　踏み台は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構築
基本的にコンソール画面に従って設定を入れていけば問題ありません。

## 設定画面①
![image.png](
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/48e7a890-72d2-7654-30bb-d75fd755562e.png)
　IAMロールは「AmazonEKSClusterPolicy」が付与されたrolesを作成して選択しましょう。
　クラスターアクセスの部分は、1度「EKS API」を許可した場合、**後から「ConfigMap」のみに変更できない**ため注意しましょう。

## 設定画面②
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/edbab4b1-bb31-9ea1-73c0-d8bdb412f750.png)
　クラスタエンドポイントアクセスは、EKSへの接続許可に関わる部分です。ここを「プライベート」に設定していることに気づかず、ずっとVPC外から接続しようとしてエラーになった経験があります。。。

## 設定画面③
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/0de50674-d9b5-b0d9-6698-72aa00ab8ebf.png)
　ここはログ、メトリクス関係の設定です。今回は検証なので不要とします。

## 設定画面④
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/8bfd2d19-a5ec-03a4-a576-5dea29b47c35.png)
　EKSアドオンの部分です。今回は検証なので、デフォルトでインストールされるもののみ選択します。EKSアドオンは、EKS構築後から削除、追加することはできます。

## 設定画面⑤
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/184bf64b-e8cf-8b85-b42b-9e561b2a5f5e.png)
　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:~#
```

## 設定画面①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/0d1bda01-56e9-1e1e-770b-0ae472fadecb.png)
　IAMロールは「AmazonEKSFargatePodExecutionRolePolicy」が付与されたrolesを作成して選択しましょう。

## 設定画面②
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/375088d7-1b01-d0f5-37a7-f956f7abb4e9.png)
　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を最近触り始めた方の参考になれば幸いです。