Amazon EKS の公式ガイドに沿って学ぶ Kubernetes とその前提知識

# この記事は何？

[Amazon EKS の公式ガイド](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started-console.html)を進めていく上で戸惑いそうな箇所に解説をつけたものです。

よくわからないけど指示に従ったら動いた(How はわかるけど What/Why がわからない)、という状態にならないことを目指しています。

公式ガイドを進めつつ、よくわからない点があったらこの記事を見る、という使われ方を想定しています。

# 背景
『入門 Kubernetes』(オライリー)の第3章で Kubernetes のインストール方法がほとんど書かれておらず、困った。
第3章で困る人を救いたかった。


# 対象

* 『入門 Kubernetes』 の第3章で AWS への Kubernetes のインストール方法がわからず挫折した人。
* Kubernetes を学びたいがどこから手をつけていいかわからない人
* Kubernetes を学ぼうとしたがそもそも VPC 設定などネットワーク知識でつまづいて挫折した人


# 事前条件

AWS アカウントはすでにあるものとします。

# 本編
[Amazon EKS の公式ガイド](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started-console.html) を進めていきます。
本記事ではマネジメントコンソールから設定していきます。

以下、見出しは公式ガイドの見出しと対応させています。


## Amazon EKS の前提条件
ここでやっていることは以下の3つです。

* Amazon EKS クラスターにAWS リソースを作成する権限を付与できるように IAM ロールを作成
* Amazon EKS クラスターを配置するネットワーク構築とセキュリティ設定(前者はVPCの構築、後者はセキュリティグループの作成)。
* kubectl コマンドを実行できるようにするためのセットアップ

以下でもう少し詳しく解説します。

### Amazon EKS サービスロールを作成する

IAM は AWS にアクセスするアカウントとその権限を管理するサービスです。

* IAM ユーザは、AWS リソースではない存在(人やオンプレサーバ等)に対して、AWS リソースへのアクセス権限を付与するために使用します。
* IAM ロールは、AWS リソース(EC2 や RDS 等) に対して、他の AWS リソースへのアクセス権限を付与するために使用します。

今回は、Amazon EKS に ELB 等を作成する権限を与えたいので、IAM ロールが必要となります。


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

AWS CloudFormation は、インフラ構成をテキストベースで記述しておけば、あとはそれを元に AWS がいい感じに構築してくれる、というものです。

ガイドに登場する↓のURLはインフラ構成を記述したテンプレートの参照です。
ダウンロードしてテキストエディタで開いて読んでみると、雰囲気がつかめるかと思います。

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

[詳細の指定] のところでは、テンプレートでは十分でない具体的な情報を入力しています。

具体的にどのようなインフラ構成を作るのかを表すのが以下の画像です。

![template1-designer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183649/c1db6582-cd24-86d6-d6cc-c6eeaf6b33ba.png)


AWS CloudFormation デザイナーを使って出力したものです。
VPC 内にパブリックサブネットが 3 つ作られています。
まず外部からの通信がインターネットゲートウェイが受け、ルートテーブルを経由して各サブネット内に配置される Amazon EKS クラスターに割り振られます。

これら3つのサブネット上でワーカーノードが起動します。


### Amazon EKS の kubectl をインストールして設定する

kubectl コマンドを使うことで、ローカルマシンから Amazon EKS を操作することができます。

### 最新の AWS CLI をインストールする

特に言うことはありません。
素直に従ってやればOKです。



## ステップ 1: Amazon EKS クラスターを作成する / ステップ 2: kubeconfig ファイルを作成する


人によっては罠にハマり、ステップ 2 で↓のような問題がおきてしまいます。

[【解決方法】Amazon EKSで`kubectl get svc`コマンドに失敗する](https://qiita.com/NaokiIshimura/items/60f90d9d925ca2b103bb#%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E6%89%8B%E9%A0%86)

その場合は、この記事にあるように、aws cli から クラスターを作成しましょう。
(私もこの方針で作成しました。)


```bash
$ aws eks create-cluster --name <cluster_name> --role-arn arn:aws:iam::xxxxx:role/xxxxx --resources-vpc-config subnetIds=subnet-xxxxx,subnet-xxxxx,subnet-xxxxx,securityGroupIds=sg-xxxxx

$ aws eks update-kubeconfig --name <cluster_name>

$ kubectl get svc
```

以下のように create-cluster でエラーになる場合は、IAM ユーザの権限が足りていない可能性があります。IAMFullAccess 等のポリシーをアタッチしましょう。

```bash
An error occurred (AccessDeniedException) when calling the CreateCluster operation:
User: arn:aws:iam::xxxxx:user/xxxxx is not authorized to perform: iam:PassRole on resource:
arn:aws:iam::xxxxx:role/xxxxx
```

## ステップ 3: Amazon EKS ワーカーノードを起動して設定する

以下のような結果になる場合、クラスター名が一致していない可能性があるので注意してください。

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

うまく動くとこうなります(しばらくすると Ready になります)

```bash
$kubectl get nodes
NAME                                                STATUS     ROLES    AGE   VERSION
ip-xxx.ap-northeast-1.compute.internal   NotReady   <none>   2s    v1.12.7
ip-xxx.ap-northeast-1.compute.internal   NotReady   <none>   5s    v1.12.7
ip-xxx.ap-northeast-1.compute.internal   NotReady   <none>   4s    v1.12.7
```


## 次のステップ

[「ゲストブックアプリケーションを起動する」](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eks-guestbook.html) に進むと、「これは何をやっているんだ？？？」となるので注意が必要です。

# 終わりに
ここまでくると 『入門 Kubernetes』の第3章以降を読み進める準備が完了します。
読み進めていきましょう。