【初心者】Amazon EKSを使ってみる　（環境構築～サンプルアプリ起動まで）

# 目的
- k8sが検証できる環境がほしかったため、一番慣れているAWSのEKSで環境構築を行うこととした。
- 自分でk8s環境を全部作るのと比較して、EKSではAWSのマネージドサービスとどのように連携が行われているのかを理解できるようにしたい。

# Amazon EKS とは (自分の理解)
- AWSが提供するk8s環境。マネージドサービスなのでコントロールプレーン側を自分で管理しなくてよい等のメリットがある。

# やったこと
- AWS公式ドキュメント「[AWS マネジメントコンソール の使用開始](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started-console.html)」に従い、以下の作業を実施。
    - EKS展開用のVPCの作成
    - kubectlが打てる環境の作成
    - EKSクラスター(k8sコントロールプレーン側)の作成
    - ノードグループの作成
    - 動作確認とサンプルアプリ(guestbook)のデプロイ

# 構成図
![eks-構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/08c050c4-8424-5820-904b-4274809c3d04.png)

# 手順
## 構築方法の選択
- AWS公式ドキュメント「[Amazon EKS の開始方法](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html)」によると、初心者用の環境構築の方法にはeksctlというユーティリティを使って一発で作るか、マネージメントコンソールでポチポチ作っていくかの2通りがあるとのこと。ステップバイステップで進めたいので今回は後者を選択した。
- 以降はAWS公式ドキュメント「[AWS マネジメントコンソール の使用開始](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started-console.html)」に従って作業を進める。気になった箇所等を中心に記載する。


## 前提条件（事前準備）
- Amazon EKS クラスターの IAM ロールの作成
    - 手順通りにIAMロールを作成する。

- Amazon EKS クラスター VPC を作成する
    - EKSクラスターとするためのVPCを、CloudFormationで作成する(AWSが提供するyamlを使用する)。
    - なるべく単純な構成としたいため、「3 つのパブリックサブネットを持つ VPC」のほうを選択した。またサブネットのCIDRを分かりやすくするために/24に変更。
 
![eks04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/1c2e4063-644c-c49b-7227-e6039d30b470.png)


- Amazon EKS の kubectl をインストールして設定する
    - kubectlコマンドが打てる環境を用意する必要がある。今回は普通のEC2インスタンス(Amazon Linux 2)上に環境を構築する。
    - AWS公式ドキュメント「[kubectl のインストール](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html)」から、kubectlのバイナリファイルをダウンロードする。今回はバージョン1.15を使用する。

- 最新の AWS CLI をインストールする
    - Amazon Linux 2に元々入っているAWS CLIのバージョンは「v1.16.300」だが、EKS用には「v1.18.49以降」が望ましいとのことで、AWS公式ドキュメント「[Installing the AWS CLI version 2 on Linux](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html)」に従い、CLIのv2をインストールする。

```
# 元々入ってるawsコマンド
[ec2-user@ip-10-0-0-33 ~]$ /usr/bin/aws --ver
aws-cli/1.16.300 Python/2.7.16 Linux/4.14.173-137.229.amzn2.x86_64 botocore/1.13.36

# 追加したawsコマンド
[ec2-user@ip-10-0-0-33 ~]$ /usr/local/bin/aws --ver
aws-cli/2.0.10 Python/3.7.3 Linux/4.14.173-137.229.amzn2.x86_64 botocore/2.0.0dev14
```

## ステップ 1: Amazon EKS クラスターを作成する
- まず先にコントロールプレーン側を作る（ワーカーノード側は後で作成）。
    - 名前: mksamba-eks-cluster
    - Kubernates バージョン: 1.15
    - クラスターサービスロール: 「前提条件」の項で作成したIAMロールを選択
    - VPC/サブネット/セキュリティグループ: 「前提条件」の項で作成したVPCを選択
    - クラスターエンドポイントアクセス: 今回は別のVPCのEC2インスタンスからkubectlで操作するため、「パブリック」が必要。念のため「パブリック及びプライベート」を選択。またエンドポイントにアクセスできるIPアドレスをkubectlを打つインスタンスのIPに制限。

![eks08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/82907c3f-d5b4-c1c0-3040-1b6474f3526f.png)
![eks09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/df8b6e39-1772-c59b-1c9a-8509b4e95413.png)

## ステップ 2: kubeconfig ファイルを作成する
- 手順通り、「aws eks --region region-code update-kubeconfig --name cluster_name」 を実行し、configファイルが作成され、「kubectl get service」 コマンドが実行できるようになることを確認する。


## ステップ 3: マネージド型ノードグループの起動
-  Amazon EKS ワーカーノードロールを作成
    -  手順通りにIAMロールを作成する。
-  マネージド型ノードグループを起動する
    -  名前: mksamba-node-group
    -  ノードへのリモートアクセスを許可する: ON(勉強のため入ってコマンド実行する可能性のため)
    -  インスタンスタイプ: t3.micro (検証用なので一番小さいタイプに変更)
    -  スケーリング構成: 最大/最小/希望を全て2　(検証用なので少なくする)


![eks10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/f59b919e-04f0-996f-2f91-15274270da85.png)
![eks11a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e3ff268d-12b9-aca4-58ea-383b6b252ed2.png)
![eks12a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/268e1688-e1cc-c859-e2c1-79d9f89f0c12.png)


# 動作確認
- ワーカーノードの確認（2台あることの確認）

```
[ec2-user@ip-10-0-0-33 .kube]$ kubectl get nodes
NAME                                          STATUS   ROLES    AGE     VERSION
ip-192-168-0-160.us-east-2.compute.internal   Ready    <none>   2d23h   v1.15.10-eks-bac369
ip-192-168-2-203.us-east-2.compute.internal   Ready    <none>   2d23h   v1.15.10-eks-bac369
```

- podの作成

```
[ec2-user@ip-10-0-0-33 k8s]$ kubectl run nginx --image=nginx --restart=Never
pod/nginx created
[ec2-user@ip-10-0-0-33 k8s]$ kubectl get pods -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP              NODE                                          NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          8s    192.168.0.152   ip-192-168-0-160.us-east-2.compute.internal   <none>           <none>
```

- ゲストブックアプリケーションを起動する
    - 公式ドキュメント「[ゲストブックアプリケーションを起動する](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eks-guestbook.html)」に従って、アプリケーションを展開する。
    - 今回準備したt3.micro * 2ノード環境だと途中でリソース不足になるため、この検証では6ノードに増やした。
    - この検証ではService (Type LoadBalancer)を作成するが、それに伴いEKSではCLBが自動作成され、6個のノードも自動的に登録される。
    - CLBのURLにアクセスして、無事インターネット経由でguestbookにアクセスできることを確認。

```
[ec2-user@ip-10-0-0-33 k8s]$ kubectl get pods -o wide
NAME                 READY   STATUS    RESTARTS   AGE     IP              NODE                                          NOMINATED NODE   READINESS GATES
guestbook-dg572      1/1     Running   0          41s     192.168.2.48    ip-192-168-2-12.us-east-2.compute.internal    <none>           <none>
guestbook-jkhcx      1/1     Running   0          41s     192.168.0.111   ip-192-168-0-229.us-east-2.compute.internal   <none>           <none>
guestbook-p2c9w      1/1     Running   0          41s     192.168.1.35    ip-192-168-1-68.us-east-2.compute.internal    <none>           <none>
redis-master-xk6bn   1/1     Running   0          5m36s   192.168.2.28    ip-192-168-2-203.us-east-2.compute.internal   <none>           <none>
redis-slave-2lwrt    1/1     Running   0          4m22s   192.168.0.152   ip-192-168-0-160.us-east-2.compute.internal   <none>           <none>
redis-slave-zrnh8    1/1     Running   0          4m22s   192.168.1.138   ip-192-168-1-8.us-east-2.compute.internal     <none>           <none>

[ec2-user@ip-10-0-0-33 k8s]$ kubectl get service
NAME           TYPE           CLUSTER-IP      EXTERNAL-IP                                                              PORT(S)          AGE
guestbook      LoadBalancer   10.100.138.94   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxx.us-east-2.elb.amazonaws.com   3000:30454/TCP   44s
kubernetes     ClusterIP      10.100.0.1      <none>                                                                   443/TCP          4d22h
redis-master   ClusterIP      10.100.16.152   <none>                                                                   6379/TCP         5m13s
redis-slave    ClusterIP      10.100.31.81    <none>                                                                   6379/TCP         87s
```

![eks13a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4ca7f311-fa25-8345-6e22-518fe775861d.png)
![eks14a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/044c5a4b-19e6-7aa4-18e4-d5571b0af2ed.png)





# 所感
- ドキュメントの内容をそのままやっただけになってしまったが、とりあえず環境ができたので、他の技術要素（ストレージ、Ingress等)についても続けて動作確認を行ってみたい。