eksctlを使って東京リージョンでEKSを試す

EKS使いたいけど東京リージョンないしなぁと思ってた方は多いんじゃないでしょうか？

[Amazon EKS が 東京リージョンに対応しました。](https://aws.amazon.com/jp/blogs/news/amazon-eks-tokyo-region/)

[Amazon EKS の使用開始](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html)を見ながら何がどうなってるか理解しながら進めるのもいいですが、

[eksctl](https://eksctl.io/)というツールで最速でEKS構築できるようなので早速試してみました。

## eksctl インストール

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

## eksctlでクラスタ作成

```
$ eksctl create cluster \
  --name cluster-name \
  --region ap-northeast-1 \
  --nodes 2 \
  --nodes-min 1 \
  --nodes-max 2 \
  --node-type t2.medium \
  --version=1.10 \
  --tags environment=staging
```

10分くらいで完了！

## 何が作られた?

`get cluster` で作成されたクラスタとリージョンを確認できます。

```
$ eksctl get cluster
NAME           REGION
cluster-name   ap-northeast-1
```

kubernetesの環境も `~/.kube/config` に書き出されていました。

```
$ cat ~/.kube/config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: xxxxxxxxxxxxx
    server: https://xxxxxxxxxxxxxxxxxxxx.ap-northeast-1.eks.amazonaws.com
  name: cluster-name.ap-northeast-1.eksctl.io
...
```

現在のkubectlの向き先が作成したeks宛に変更されています。
docker-for-mac kubernetesを使っている方は `get-contexts` で切り替わっている事を確認できます。

```
$ kubectl config get-contexts
CURRENT   NAME                                            CLUSTER
*         account@cluster-name.ap-northeast-1.eksctl.io   cluster-name.ap-northeast-1.eksctl.io
          docker-for-desktop                              docker-for-desktop-cluster
```

ちなみに戻す際は `use-context` コマンドを利用します。

```
$ kubectl config use-context docker-for-desktop
$ kubectl config use-context account@cluster-name.ap-northeast-1.eksctl.io
```

実際にimageを動かすワーカーノードが指定した数作られていました。

```
$ kubectl get nodes
NAME                                                 STATUS    ROLES     AGE       VERSION
ip-000-000-000-000.ap-northeast-1.compute.internal   Ready     <none>    11m       v1.10.11
ip-000-000-000-000.ap-northeast-1.compute.internal   Ready     <none>    11m       v1.10.11
```

## aws上では

vpcとサブネットが作られます

https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1

- eksctl-cluster-name-cluster/VPC

cloudformationが作られます

https://ap-northeast-1.console.aws.amazon.com/cloudformation

- eksctl-cluster-name-nodegroup-0
- eksctl-cluster-name-cluster

eks クラスタ(マスターノード)が作られます

https://ap-northeast-1.console.aws.amazon.com/eks/home?region=ap-northeast-1#/clusters

- cluster-name

ec2 インスタンス(ワーカーノード)が作られます

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home

- cluster-name-0-Node x2

ec2 セキュリティグループが作られます

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#SecurityGroups

- eksctl-cluster-name-nodegroup-0/SG
- eksctl-cluster-name-cluster/ControlPlaneSecurityGroup



## チュートリアルのゲストブックアプリケーションを起動する

Redis マスターレプリケーションコントローラーを作成

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-controller.json
replicationcontroller "redis-master" created
```

Redis マスターサービスを作成

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-service.json
service "redis-master" created
```

Redis スレーブレプリケーションコントローラーを作成

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-controller.json
replicationcontroller "redis-slave" created
```

Redis スレーブサービスを作成

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-service.json
service "redis-slave" created
```

ゲストブックレプリケーションコントローラーを作成

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-controller.json
replicationcontroller "guestbook" created
```

ゲストブックサービスを作成

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-service.json
service "guestbook" created
```

作成されたレプリケーションコントローラーとサービスを確認します。

```
$ kubectl get rc
NAME           DESIRED   CURRENT   READY     AGE
guestbook      3         3         3         25s
redis-master   1         1         1         2m
redis-slave    1         1         1         2m
$ kubectl get svc
guestbook      LoadBalancer   10.100.58.17     xxx.ap-northe...   3000:32540/TCP   44s
kubernetes     ClusterIP      10.100.0.1       <none>             443/TCP          32m
redis-master   ClusterIP      10.100.72.41     <none>             6379/TCP         1m
redis-slave    ClusterIP      10.100.240.246   <none>             6379/TCP         1m
```

guestbookはロードバランサを挟んでアクセスできるようになっており、ec2を見てみるとロードバランサが作成されていました。

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#LoadBalancers

External IP が作成されるまで待機して、ポート3000でアクセスします。

```
$ kubectl get services -o wide
```

http://xxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com:3000


## 掃除

kubernetes上に作成したアプリケーションを削除

```
$ kubectl delete rc/redis-master rc/redis-slave rc/guestbook svc/redis-master svc/redis-slave svc/guestbook
```

作成したクラスタを削除

```
$ eksctl delete cluster \
  --name cluster-name \
  --region ap-northeast-1
```

## 感想

[eksctl](https://eksctl.io/)を使うとものすごく早くEKS構築できました。色々なオプションもあるのでいい感じです。

ただ、既存のVPCでEKS環境を作りたいのですが新たにVPC作成するので、eksctl使わずに手動で色々カスタマイズする事になりそう。

> VPC Networking
> By default, eksctl create cluster instatiates a dedicated VPC, in order to avoid interference with any existing resources for a variety of reasons, including security, but also because it's challenging to detect all the settings in an existing VPC

> デフォルトでは、eksctl create clusterセキュリティを含むさまざまな理由で既存のリソースとの干渉を回避するためだけでなく、既存のVPCのすべての設定を検出するのは難しいため、専用のVPCを起動します

[Amazon EKS の使用開始](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html) も新たにVPC作成する手順なのと、いろいろハマりどころがあるので四苦八苦中。それについてはまたの機会に記事にします。

## 追記

既存VPC利用したクラスタ構築のオプションもあるようです！試す！