AWS EKSの公式チュートリアルをやってみる

[ローカル環境のKubernetesでとにかく動くものを作ってみる](https://qiita.com/omukaik/items/c81fc56edc984aa23202)でローカル環境にKubernetesを立てて見たので、今回はAWSのEKSをとにかくさわってみることを目的にAWS EKSの公式チュートリアルをやって見たのでメモ。

[Docker/Kubernetes 実践コンテナ開発入門](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2/dp/4297100339/ref=sr_1_2?ie=UTF8&qid=1553449383&sr=8-2&keywords=kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89)にはGCPのGKEについての簡単な説明があります。
AWSのEKSについては何かないかと探したら公式チュートリアルあったのでやってみました。
つまづくところも多かったので、つまづいたところをピックアップしていきます。


## 公式チュートリアル
- [チュートリアル](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html)  
- [トラブルシューティング](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/troubleshooting.html)

## やったこと
[チュートリアル](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html)  にそってEKSをクラスターを作成してみました。

- EKSクラスター作成のための下準備
    - IAMロールの作成
        - IAMユーザの作成
    - グループの作成
    - AWS EKS クラスターVPCの作成
    - Amazon EKS の kubectl をインストール
    - aws-iam-authenticatorのインストール
    - AWS Cliのインストール
    - Credentialの作成

- EKSクラスターの作成
    - Amazon EKS クラスターを作成する
    - Amazon EKS の kubectl を設定する
    - Amazon EKS ワーカーノードを起動して設定する
    - ゲストブックアプリケーションを起動する（AWSが用意したサンプルアプリケーション）

ローカル環境にAWS系のツール等入れていなかったので、準備しなければいけないものが多かったです。
チュートリアルはやっている人が結構いるようなので、そちらの記事も参考にすると良さそう。

## 料金

- EKS 0.2$/h
- EC2インスタンス（デフォルトだと3台分。t3.nanoインスタンスで動作確認可能でした。）
- ロードバランサ

作った後にすぐ消すのであれば、全部で5ドル以下で可能です。
チュートリアルが終わったあとは、サービスを停止できたか確認しましょう。

## 環境

- ローカル環境
    - OS: Mac OS 10.13.6（High Sierra）
    - Docker for Mac: stable版 2.0.0.3
    - docker: 18.09.2
    - Kubernetes: v1.10.11
    - python: 2.7.9
- AWS環境
    - リージョン：us-east-1
    
東京リージョン（ap-northeast-1）でEKSが実行できるので最初進めていましたが、EKS最適化AMIが用意されていないので注意が必要です。

## EKS
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/what-is-eks.html

## IAMロールの作成
EKS-TESTというロールを作成しました。後々AWS Cli での操作が必要になるので、EKS-TESTというIAMユーザを作成しておきました。

## aws-iam-authenticatorのインストール
「aws-iam-authenticator を Amazon EKS にインストールするには」 にしたがって進めていたのですが、4のコマンドを実行した際にエラーが発生しました。

```shell
$ cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH
```

私の場合は $HOME/bin がなかったのでフォルダを作成する必要があったので、フォルダを作成して解決しました。

```shell
$ $HOME/bin/
```

## Amazon EKS クラスターを作成する
最初はコンソール上から作成を行いました。
![eks.png](https://qiita-image-store.s3.amazonaws.com/0/366054/d54926d6-7616-122c-afff-e41eaca506ab.png)
作成は問題なくできたのですが、コンソールにログインするユーザを間違えると後々問題になります。エラーを回避したい場合はaws-cliで使用するのが良さそうです。画面上から色々できるかなと思ったら、クラスターを作成するぐらいしか操作できない？

## Amazon EKS の kubectl を設定する
最初aws-iam-authenticatorをインストールしていなかったので、下記のコマンド実行時エラーが発生しました。

```shell:エラー
$ aws --profile=EKS-TEST eks --region us-east-1 update-kubeconfig --name EKS-TEST
Added new context  <clusterのARN>/EKS-TEST to /Users/[ユーザ名]/.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.htm
```

aws-iam-authenticatorをインストールして、成功しました。

```shell:成功
Updated context <clusterのARN>/EKS-TEST in /Users/[ユーザ名]/.kube/config
```

3.のコマンドを実行した際にエラーが発生しました。

```plaintext
$ get svc
error: the server doesn't have a resource type "svc"
```

[【解決方法】Amazon EKSで`kubectl get svc`コマンドに失敗する](https://qiita.com/NaokiIshimura/items/60f90d9d925ca2b103bb)

原因はEKSクラスタを作成したIAMユーザとAWS CLIのIAMユーザが異なっているためでした。

EKSクラスタを画面から作成した際にルートアカウントで作成し、AWS CliではEKS-TESTユーザで作成を行っているのが原因のようだったので、EKS-TESTユーザでAWSコンソールにログインし、EKSクラスタの作成を実施。もう一度コマンドを実行して、成功しました。

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

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

EKSが東京リージョンで利用可能ということで、最初は東京リージョンで作業していたのですが、
NodeImageIdの選択で`AWS EKS 最適化 AMI` が 東京リージョンにない・・・のでバージニア北部で作り直しました。
ちなみに作成するテンプレート情報をデザイナーで見てみるとこんな感じになっています。
![template.png](https://qiita-image-store.s3.amazonaws.com/0/366054/f1d4de89-0911-35dd-fdfc-56d181b5c752.png)

## ワーカーノードをクラスターと結合するには

`yaml:aws-auth-cm.yaml`を実行する際にもエラーが発生しました。

```
$ kubectl apply -f aws-auth-cm.yaml
error: unable to recognize "aws-auth-cm.yaml": Get https://5DF40067B3D1F08F77EF974EE000BE9C.yl4.ap-northeast-1.eks.amazonaws.com/api?timeout=32s: dial tcp: lookup 5DF40067B3D1F08F77EF974EE000BE9C.yl4.ap-northeast-1.eks.amazonaws.com on [240d:1a:37e:6100:ce1a:faff:feb5:b064]:53: no such host
```
こちらものエラーは原因がわかりませんでしたが、EKS-TESTユーザでログインして何もかもやり直したらうまくいった模様。ロールの関係？コマンドの関係？

２.で別の問題が発生。コマンドを実行しても何も反応なし。

```shell
kubectl get nodes --watch
```

クラスタに紐づいたノードがない状態になっています。

```
$ kubectl get nodes
No resources found.
```

原因はワーカノード作成の際に、作成したクラスターの名前とClusterNameが異なっているのが原因でした。公式ドキュメントにも重要と書いていたのに見逃してしまっていました。

```plaintext
ClusterName: Amazon EKS クラスター用に作成した際に使用した名前を入力します。

重要
この名前は、「ステップ 1: Amazon EKS クラスターを作成する」で使用した名前と完全一致する必要があります。
それ以外の場合、ワーカーノードにクラスターを結合できません。
```

## ゲストブックアプリケーションを起動する
ノードとクラスタが結びついていない状態（上記のエラーのまま）でも、`kubectl apply`を実行していると、うまくいかなかったので、`delete-context`で一度全て削除を行って作成を行ったところうまくいきました。

```shell
$ kubectl config delete-context https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-controller.json
```

参考
https://qiita.com/hana_shin/items/b7a947511a89accea6d4

色々エラーが発生しましたが、終わりです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/366054/cbfe88f6-f4b5-669b-27be-46175e87e276.png)