Amazon EKS のチュートリアルで Kubernetes を理解する #01 クラスタ作成

# はじめに

これまで Kubernetes をちゃんと触ったことが無かったのですが、2019年11月に [マネージド型ノードグループがリリース](https://aws.amazon.com/jp/blogs/containers/eks-managed-node-groups/) されて、ノードの管理などもより簡単になったそうなので、Aamazon EKS のチュートリアルを元に、Kubernetes の理解をしていこうかと思います。
今回、クラスタの作成には ```eksctl``` を利用します。

- Aamazon EKS のチュートリアル
    - https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html


# 環境

開発環境は以下の通りです。

| 環境／ツール | バージョン |
| ---- | ---- |
| macOS | Catalina(10.15.2) |
| Python | 3.7.6 |
| Homebrew | 2.2.2 |
| awscli | 1.17.0 |

# Kubernetesクラスタ構築手順

何はともあれ、まずはクラスタを構築してみます。

## eksctl のインストール
最初に、 Amazon EKS での k8sクラスタの管理用ツールである ```eksctl``` をインストールします。

```console
$ brew tap weaveworks/tap
$ brew install weaveworks/tap/eksctl
$ eksctl version
[ℹ]  version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.12.0"}
```

## クラスタの新規作成
```eksctl``` を利用して、k8sクラスタを作成します。
2020年1月時点では、ワーカーノードとして、Fargateを利用するのか、EC2を利用するのかが選択できますが、
ここでは、EC2を利用することとします。

```zsh
eksctl create cluster \
--name dev \
--version 1.14 \
--region us-west-2 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 3 --nodes-min 1 --nodes-max 4 \
--managed
```

| オプション | 説明 |
| ---- | ---- |
| --name dev | "dev"という名称で、k8sのクラスタを作成します。 |
| --version 1.14 | k8sのバージョンは、1.14を使用します。 |
| --region us-west-2 | AWSの環境はオレゴンリージョンを利用します。 |
| --nodegroup-name standard-workers | "standard-workers"という名称で、ノードグループを作成します。 |
| --node-type t3.medium | ノードとして、"t3.medium" のインスタンスを利用します。 |
| --nodes 3 --nodes-min 1 --nodes-max 4 | 初期環境として3ノードで作成します。最小は1ノード、最大は4ノードです。 |
| --managed | [マネージド型ノードグループ](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/managed-node-groups.html) を利用します。  |

クラスタ作成のコマンドを実行すると、以下のような内容がコンソールに表示されます。
クラスタ作成には、10～15分程度かかります。

```console
[ℹ]  eksctl version 0.12.0
[ℹ]  using region us-west-2
[ℹ]  setting availability zones to [us-west-2c us-west-2b us-west-2a]
[ℹ]  subnets for us-west-2c - public:192.168.0.0/19 private:192.168.96.0/19
[ℹ]  subnets for us-west-2b - public:192.168.32.0/19 private:192.168.128.0/19
[ℹ]  subnets for us-west-2a - public:192.168.64.0/19 private:192.168.160.0/19
[ℹ]  using Kubernetes version 1.14
・・・・・・
[ℹ]  kubectl command should work with "/Users/takanorig/.kube/config", try 'kubectl get nodes'
[✔]  EKS cluster "dev" in "us-west-2" region is ready
```

作成されたクラスタを、AWSコンソール画面で見ると、以下のような感じになります。

![amazon-eks-dev01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/9e7b060f-eefd-a901-1478-dc25c0eec5ac.jpeg)

クラスタの作成と共に、kubectlの接続設定ファイルである kubeconfig も、以下に出力されます。

```console
/Users/$USERNAME/.kube/config
```

## 関連ツールのインストール

k8sクラスタを操作するために、```kubectl``` および ```aws-iam-authenticator``` をインストールします。
```kubectl``` は、k8sクラスタをコマンドラインから操作するためのツールで、アプリケーションのデプロイや、クラスタのリソース管理などを行うことができます。
```aws-iam-authenticator``` は、「AWS IAM Authenticator for Kubernetes」のことで、k8sクラスタの認証に IAM を使用してアクセスできるようになります。


### kubectl のインストール

まず、他のツールなどのインストールのために、すでに別の ```kubectl``` がインストールされている可能性があるため、既存の環境を確認します。


```console
$ which kubectl
/usr/local/bin/kubectl
```
私の場合は、Docker と合わせて ```kubectl``` がインストールされていました。
バージョンが合っていれば、そのまま使えるとは思いますが、本チュートリアルの操作では、新たにAWSが提供する媒体をインストールすることとします。

ここでは、以下にインストールします。
実際の開発や運用時は、```/usr/local/bin``` など、適切なディレクトリにインストールしてください。

```console
$ mkdir -p /Users/$USERNAME/MyWork/amazon-eks/bin
```

```console
$ cd /Users/$USERNAME/MyWork/amazon-eks/bin
$ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.14.6/2019-08-22/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
```
<font color="#ff0000">※ バージョンは、k8sのバージョンに合ったものをダウンロードしてください。</font>

以下のコマンドで、インストールされているバージョンを確認できます。

```
$ ./kubectl version --short
Client Version: v1.14.7-eks-1861c5
Server Version: v1.14.9-eks-c0eccc
```

パスを設定しておきます。
ここでは、一時的に指定するだけですが、永続化する場合は、```~/.zprofile``` などにPATHの指定を記載してください。

```
export PATH=/Users/$USERNAME/MyWork/amazon-eks/bin:$PATH
```


### aws-iam-authenticator のインストール

```aws-iam-authenticator``` は、Homebrewを利用してインストールします。

```console
$ brew install aws-iam-authenticator
```

以下のコマンドで、インストールされているバージョンを確認できます。

```console
$ aws-iam-authenticator version  
{"Version":"v0.4.0","Commit":"c141eda34ad1b6b4d71056810951801348f8c367"}
```

### クラスタの状態確認

```kubectl get``` コマンドを利用して、クラスタの状態を確認できます。
現状、クラスタを作成しただけなので、k8s本体だけが動作している状況です。

```console
$ kubectl get svc

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

## クラスタの構成

```eksctl``` を利用して作成した場合、クラスタは以下のような構成になります。

![amazon-eks-on-aws-architecture-diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/3f08eff8-e283-073f-3bf3-6ec01bbaf091.jpeg)
出典：https://aws.amazon.com/jp/quickstart/architecture/amazon-eks/

- マルチAZ構成で、1つのVPC内に Publicサブネットｘ3、Privateサブネットx3 が作成されます。
- k8sノードが配置されるのは、Privateサブネットの方になります。


AWSコンソールで確認すると、以下のような内容で、VPC／サブネットが作成されていました。

![amazon-eks-dev02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/0a7a60e7-5da2-be77-31c4-f53b00322d10.jpeg)
![amazon-eks-dev03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22893/011ea262-5e35-37df-04c8-ab5f58c718b9.jpeg)


## クラスタの削除
Amazon EKS でクラスタを作成した場合、作成したk8sクラスタごとに 0.20 USD／時間 の料金が発生します（ワーカーノードとなるEC2インスタンスの費用は別）。
そのため、不要なクラスタは、削除しておきましょう。

```console
$ eksctl delete cluster --name=dev
```

# まとめ
AWSコンソールからだと、各パラメータの指定なども理解していないと難しい部分がありますが、
```eksctl``` を利用することで、ほぼコマンド1つで、k8sクラスタやワーカーノードを作成することができました。
このように作成された内容を元に、構成などを確認すると理解もしやすいです。

次は、k8sクラスタにアプリケーションをデプロイしてみます。

- [Amazon EKS のチュートリアルで Kubernetes を理解する #02 アプリのデプロイ](https://qiita.com/takanorig/items/6b2eced40b309b557d70)