図でわかるGetting Started with Amazon EKS


## はじめに
- EKS構築でハマるという声が多かったので、[某雑食系エンジニアサロン](https://kentakatsumata.net/archives/10)のもくもく会で[Getting Started with Amazon EKS](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started-console.html)をやってみました。(クラスタ名がmokumokuになってます。適宜会社やサービス名に変更してください)
- 可能な限りAWSコンソールからGUIでEKSクラスタを作成しています。CLIになれている人は逆に見づらい可能性があります。
- キャプチャをとりつつハマりそうなポイントを補足したので、初心者にとってわかりやすくなっていることを祈ります。
- 手順を1つずつ進めやすいようにQiitaのスライドで見れるよう作りました。下に長いページが多いのでスクロールが必要です。
- 漏れやtypoがあったら遠慮なく修正リクエストください。よろしくおねがいします。

---
## 対象
- kubernetes、EKSを始めたいAWS初心者

## 前提環境
- AWSアカウントがありAWSにログインできる
- 以下の操作権限がある
    -  IAM
    -  VPC
    -  CloudFormation
    -  EKS
    -  EC2
-  AWSCLIが使える

---

## 手順

- EKSクラスターのサービスロールを作成する
- EKSクラスターのVPCを作成する
- EKSクラスターを作成する
- kubeconfigファイルを作成する
- EC2のキーペアを作成する
- EKSワーカーノードを起動して設定する

---

### EKSクラスターのサービスロールを作成する

---

EKSを始める前に、EKSクラスタ作成時にIAMサービスロールを指定する必要があるのであらかじめ作成しておく。
AWSにログインしてIAMの[ロール](https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/roles)を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/3e8e1870-58ec-a677-fa41-1f1fc4b6d7cc.png)

---

ロールの作成>AWSサービス>EKSを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/df1c6702-f393-e0ac-0fda-4143b21f6a82.png)

---

ここは特になし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/982c8059-58f4-00d4-f738-f4ee19258c02.png)

---

ここも特になし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/2b9fe63f-e1ae-a8c3-3df5-c77d1dea777c.png)

---

ロール名を入力して作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/06341fb8-11d3-2182-694c-63b7f46e41f2.png)

---

ロールが作成されたことを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/cd1c5368-fe64-40b5-cc6c-48e4f7311564.png)

---

### EKSクラスターのVPCを作成する

---

EKSを始める前に、EKSクラスタ作成時にVPCを指定する必要があるのであらかじめ作成しておく。
[CloudFormation](https://console.aws.amazon.com/cloudformation)を開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/5d09b808-c617-2b78-4015-68e05f725afd.png)

---

CloudFormation>スタック>スタックの作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/dd5d7f83-627b-efb1-6fff-b775a515b0df.png)

テンプレートURL

```
https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/amazon-eks-vpc-sample.yaml
```

---

スタック名を設定して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/5881b1e8-bf48-987f-93b4-e4674a2bbab0.png)


---

ここは特になし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/d89a0f05-b497-9a5e-81b0-bcfb192bf8b2.png)


---

ここも特になし。スタックを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/ee0e26e6-7389-16c9-3406-6066a5e91f02.png)

---

スタックの作成が完了したら[VPC](https://console.aws.amazon.com/cloudformation)でリソースを確認する。
CloudFormation>スタック>リソース名でも確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/0d6d4005-3e94-a01d-e100-b36947131e0f.png)

---

### EKSクラスターを作成する

---

[EKS](https://console.aws.amazon.com/eks/home#/clusters)を開いてクラスターの作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/b2e043df-3896-66f6-f2ef-ed6a030034bb.png)

---

設定を入力して作成。ページが長いのでキャプチャ分割してます。
クラスタが作成されるのに10~15分かかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/47257efb-6837-4795-6fb6-dcac830bf3f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/876c6a55-9550-4fca-e393-b0af5401a87c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/cfd01ea0-c043-dc7d-15b0-7d2d16590d15.png)

---

### kubeconfigファイルを作成する

---

ここからはAWS CLIを使って[kubeconfig](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig)を作成します。
kubectlコマンドを使う際に対象のk8sクラスタの向き先や認証情報などを設定するファイルですね。
aws eksコマンドで作成したEKSクラスタがあるか確認する。

```sh
$ aws eks list-clusters --region ap-northeast-1
{
    "clusters": [
        "mokumoku"
    ]
}

```

---

`aws eks update-kubeconfig` コマンドでkubeconfigを作成する。
`kubectl config view` で作成したkubeconfigの設定内容を確認することが出来ます。

```sh
aws eks --region ${region} update-kubeconfig --name ${cluster_name}
```

例:

```sh
$ aws eks --region ap-northeast-1 update-kubeconfig --name mokumoku
Added new context arn:aws:eks:ap-northeast-1:634938955698:cluster/mokumoku to /Users/ota/.kube/config
Warning: aws-iam-authenticator is not installed properly or is not in your path.
Refer to the AWS Documentation to download it at https://docs.aws.amazon.com/eks/latest/userguide/configure-kubectl.html
```

---

kubectlコマンドでEKSクラスタに接続できるかテスト。

```sh

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   19m
```

※すでにGKEやDocker for Macなどでkubectlコマンドを使用していた場合はこのエラーが出ると思います。
エラーの記載通り[aws-iam-authenticator のインストール](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-aws-iam-authenticator.html)実行してください。


```text

注記

"aws-iam-authenticator": executable file not found in $PATH エラーが発生した場合、kubectl は、Amazon EKS に設定されていません。詳細については、「aws-iam-authenticator のインストール」を参照してください。

その他の認可またはリソースタイプのエラーが発生した場合は、トラブルシューティングセクションの 許可されていないか、アクセスが拒否されました (kubectl) を参照してください
```

---

Get Startedの手順には無いですが、複数のKubernetesクラスタを扱う場合は[kubectx](https://github.com/ahmetb/kubectx)をインストールしておくと簡単にクラスタを切り替えることができとても便利なのでおすすめです。

```
$ kubectx
arn:aws:eks:ap-northeast-1:634938955698:cluster/mokumoku
```

---

EKSクラスタ起動直後のリソース一覧を確認。

```sh

$ kubectl get all --all-namespaces
NAMESPACE     NAME                          READY   STATUS    RESTARTS   AGE
kube-system   pod/coredns-67c9d9c78-lxtdr   0/1     Pending   0          24m
kube-system   pod/coredns-67c9d9c78-mdcd7   0/1     Pending   0          24m

NAMESPACE     NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
default       service/kubernetes   ClusterIP   10.100.0.1    <none>        443/TCP         24m
kube-system   service/kube-dns     ClusterIP   10.100.0.10   <none>        53/UDP,53/TCP   24m

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
kube-system   daemonset.apps/aws-node     0         0         0       0            0           <none>          24m
kube-system   daemonset.apps/kube-proxy   0         0         0       0            0           <none>          24m

NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/coredns   0/2     2            0           24m

NAMESPACE     NAME                                DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/coredns-67c9d9c78   2         2         0       24m
```

---

### EC2のキーペアを作成する

---

EKSワーカーノードを作成する際にEC2のキーペアを指定する必要があります。
既にAWSを運用していて設定したいEC2のキーペアがある人はこの手順を飛ばしても構いません。

EC2>キーペアを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/397932c3-3de4-c4f8-8bb3-447a0e3b9d8f.png)


`${キーペア名}.pem` が作業端末にダウンロードされるので `~/.ssh` とかにコピーしておく

```sh

$ cp ~/Downloads/mokumoku.pem ~/.ssh/
$ ls -l ~/.ssh/mokumoku.pem
-rw-r--r--@ 1 ota  staff  1692 Jul 15 16:28 /Users/ota/.ssh/mokumoku.pem
```

---

キーペア名を入力して作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/b64c2e3e-0c56-a8b8-4975-faec3d0593ea.png)

---

### EKSワーカーノードを起動して設定する

---

CloudFormation>スタックの作製。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/dfaa0da7-9849-540a-0097-c2b554445bc6.png)

---

eks-nodegloupのテンプレートを設定して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/9889568c-a07b-9e91-8b6b-7a14bd59e5e3.png)



```
# Amazon S3 URL
https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/amazon-eks-nodegroup.yaml
```

---

もろもろ設定して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/8ffd39a5-4366-34ac-62b7-7b9e201992ea.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/a3e9ec1a-e38b-0cb4-4116-2541a0b9ffaf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/a0e2ff68-0dea-dbc6-aaa8-a0ecd5f641b3.png)


---

ここは特になし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/dbead31c-f1fe-2bd7-d2a4-3eb0ff2ae7b0.png)

---

IAMリソースの作成を承認して作成。EKSのワーカーノードが作成されるのを待つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/8d3da4c1-a053-8da8-6dc2-2fee4a0c979c.png)

---

ステータスが `CREATE_COMPLETE` になったら作成完了。
このあと使うので `Cloudformation>スタック>出力>NodeInstanceRole` の値メモっておく。
このスタックだと `arn:aws:iam::634938955698:role/mokumoku-EKS-WORKER-NodeInstanceRole-1DNYLH5PVY791`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/eccb59c5-21cd-9946-3bc1-fdee4cca93b2.png)

---

ここからはCLIで作成したワーカーノードをEKSに登録する。
設定ファイルをDLしてrolearnを先ほどメモしたNodeInstanceRoleの値に書き換える。

```sh
# EKSの設定ファイルをDL
$ curl -o aws-auth-cm.yaml https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/aws-auth-cm.yaml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
# vscodeなどエディタで編集
$ code aws-auth-cm.yaml

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97541/29723da9-b4bd-f5e0-cbdc-519f72a2c2b7.png)

---
設定ファイルをEKSにデプロイする。

```
# ワーカーノードが登録されてないことを確認
$ kubectl get nodes
No resources found.

# aws-auth-cm.yamlをデプロイ
$ kubectl apply -f aws-auth-cm.yaml
configmap/aws-auth created

# 2分ほどで登録されるのでワーカーノードの登録を確認
$ kubectl get nodes 
NAME                                                 STATUS   ROLES    AGE   VERSION
ip-192-168-238-116.ap-northeast-1.compute.internal   Ready    <none>   96s   v1.12.7
```

EKSにワーカーノードが登録されPodをデプロイできるようになりました。

---

# おわりに
Getting Startedの手順はここまでです。お疲れ様でした。
次のステップとして[ゲストブックアプリケーションを起動する](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eks-guestbook.html)というチュートリアルが用意されています。
ぜひこちらの手順でEKSにPodやServiceをデプロイしてみてください。
よいk8sライフを。

---