Amazon EKSがやってきた

EKSがGAになってようやく使えるようになりました！
現時点ではオレゴン(us-west-2)とバージニア(us-east-1)で使えます。

https://aws.amazon.com/jp/blogs/aws/amazon-eks-now-generally-available/

マネージメントコンソルールに `EKS` の文字が！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/42b1b7c3-abbb-3894-52c7-c3f2615aa5a8.png)

クリックすると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/4e1129a2-ae23-fe1e-fe5b-f18284be197b.png)

作成途中？？


# 手順
Getting Startedを見ながら作ってみました。
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html

## IAMロール作成

まずEKS用のIAMロールをつくります。

ロール作成の画面にいって、`EKS`を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/a1525f7d-397c-a75f-6de7-f984b0383010.png)

とりあえずポリシーは指定されたままで
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/d3a21a33-fa4a-0ab4-5170-1fa230f6f037.png)

適当に名前つけて作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/724e5c94-2dc2-b00d-0c21-5aa0761e81d5.png)


## CloudFormationでVPCの作成

Getting StartedではCFnのテンプレでVPC作れってことなので・・・

テンプレートのURLはこちら

```
https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-vpc-sample.yaml
```

CFnの画面でテンプレートURLを指定して、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/7ef66b40-256b-c16c-825d-b876f51f93c6.png)

CIDR指定して、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/f7078d78-7eb2-1ecb-0bac-ca635fb71983.png)

作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/1ce8e409-e131-c373-cadf-39a0027fa745.png)

てきあがったものみるとただの3サブネットのVPCでした。


## ローカル環境のセットアップ
- kubectlのインストール

EKS用のkubectlがあるみたいなのでダウンロード

```bash:
$ curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
$ ./kubectl version --short --client
Client Version: v1.10.3
```
- Heptio Authenticator AWSのインストール

認証に使うらしい

```bash:
＄ curl -o heptio-authenticator-aws https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/heptio-authenticator-aws
＄ chmod +x ./heptio-authenticator-aws
＄ ./heptio-authenticator-aws help
A tool to authenticate to Kubernetes using AWS IAM credentials

Usage:
  heptio-authenticator-aws [command]

Available Commands:
  help        Help about any command
  init        Pre-generate certificate, private key, and kubeconfig files for the server.
  server      Run a webhook validation server suitable that validates tokens using AWS IAM
  token       Authenticate using AWS IAM and get token for Kubernetes
  verify      Verify a token for debugging purpose
```

- aws-cliのアップグレード

1.15.32以降が必要

```bash:
$ sudo pip install --upgrade awscli 
```

## Clusterの作成

`aws-cli` でやった方がよさそうです。
理由はわかりませんが、マネージメントコンソールからつくると、kubectlでの接続で認証でエラーになりました・・・

```bash:
$ ./kubectl get all
error: the server doesn't have a resource type "cronjobs"
$ ./kubectl get node
error: You must be logged in to the server (Unauthorized)
```

作成のコマンドはこんな感じです。

```
$ aws eks create-cluster --name test --role-arn arn:aws:iam::XXXXXXXXXXX:role/EKS-Role --resources-vpc-config subnetIds=subnet-XXXXXX,subnet-XXXXXXX,securityGroupIds=XXXXXX --region us-east-1
{
    "cluster": {
        "status": "CREATING",
        "name": "test",
        "certificateAuthority": {},
        "roleArn": "arn:aws:iam::XXXXXXXXX:role/EKS-Role",
        "resourcesVpcConfig": {
            "subnetIds": [
                "subnet-XXXXXXX",
                "subnet-XXXXXXX"
            ],
            "vpcId": "vpc-XXXXXXXX",
            "securityGroupIds": [
                "sg-XXXXXX"
            ]
        },
        "version": "1.10",
        "arn": "arn:aws:eks:us-east-1:XXXXXXXXXXXX:cluster/test",
        "createdAt": 1528253503.404
    }
}
```
CFｎでつくったSubnetID、SGを指定しています。
バージニアでは1bのサブネットを含めると↓のエラーが出たので、外しています。

```
An error occurred (UnsupportedAvailabilityZoneException) when calling the CreateCluster operation: Cannot create cluster 'test' because us-east-1b, the targeted availability zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these availability zones: us-east-1a, us-east-1c, us-east-1d
```
オレゴンでは問題なさそうでした。

STATUSが `ACTIVE` になるのをひたすら待ちます。 (15〜20分くらい・・・)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/6488e58c-22ee-4732-786f-02a9459b61f4.png)

## kubectlでの接続

configファイルをつくります。
サーバーエンドポイント、証明書情報、クラスタ名を修正します。

```yaml:eks-config
apiVersion: v1
clusters:
- cluster:
    server: (サーバーエンドポイント、DESCRIBE_CLUSTER_CONTAINER_LABEL_API_SERVER_ENDPOINTの部分)
    certificate-authority-data: (証明書情報、DESCRIBE_CLUSTER_CONTAINER_LABEL_CERTIFICATE_AUTHORITYの部分)
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: aws
  name: aws
current-context: aws
kind: Config
preferences: {}
users:
- name: aws
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: ./heptio-authenticator-aws
      args:
        - "token"
        - "-i"
        - "(クラスタ名)"
```

KUBECONFIGをセットします。

```bash:
$ export KUBECONFIG=./eks-config
```

接続！

```bash:
$./kubectl get all                                                 [12:04:13]
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   6m
```

できました。

## Workerノードの作成

CFnのテンプレが用意されているので、これを使います。
URLはこちら。

```
https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-nodegroup.yaml
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/e46dea78-1a41-1bf0-d196-a2121ca08c70.png)

AMIはEKS用のAMIがあるみたいです。

- ami-dea4d5a1 (バージニア)
- ami-73a6e20b (オレゴン)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/b3bbb44f-06ca-c8ec-b0e2-aa936358b08a.png)

この設定だと、AZごとに1台ずつインスタンスが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/069b92a7-f48c-ca86-5ecc-90180f62e2b5.png)

`ConfigMap` でNodeをJoinさせます。
サンプルがあるので、

```bash
$ curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/aws-auth-cm.yaml
```
`rolearn` の部分をCFnで作成された `NodeInstanceRole` のARNに修正します。

```yaml:aws-auth-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: aws-auth
  namespace: kube-system
data:
  mapRoles: |
    - rolearn: arn:aws:iam::XXXXXXXX:role/test-worker-nodes-NodeInstanceRole-XXXXXXXXX
      username: system:node:{{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes
```

Applyします。

```bash:
$ ./kubectl apply -f aws-auth-cm.yaml
configmap "aws-auth" created
$ ./kubectl get nodes
NAME                              STATUS    ROLES     AGE       VERSION
ip-192-168-121-147.ec2.internal   Ready     <none>    52s       v1.10.3
ip-192-168-182-144.ec2.internal   Ready     <none>    55s       v1.10.3
ip-192-168-235-51.ec2.internal    Ready     <none>    53s       v1.10.3
```

登録されました！

## デプロイ

あとは、k8sの世界なのでお好きに。
とりあえず、サンプルのGuestBookをデプロイしてみます。

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

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

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

$ ./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 services -o wide
NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                       PORT(S)          AGE       SELECTOR
guestbook      LoadBalancer   10.100.133.245   a22b8aa77693811e883521XXXXXXXXX-XXXXXXXXX.us-east-1.elb.amazonaws.com   3000:32551/TCP   5s        app=guestbook
kubernetes     ClusterIP      10.100.0.1       <none>                       443/TCP          18m       <none>
redis-master   ClusterIP      10.100.141.60    <none>                       6379/TCP         39s       app=redis,role=master
redis-slave    ClusterIP      10.100.252.136   <none>                       6379/TCP         20s       app=redis,role=slave
```

ELBを見ると、CLBができてます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/6c4f008b-04e5-9c37-7678-bdf557fb9fd1.png)

ブラウザでアクセスすると・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3246/238465b5-43a5-3998-a716-a3c9da220933.png)

見れました。


# まとめ
ようやくAWS上でマネージドなk8s環境が構築できるようになりました。

ただ・・・
だいぶめんどくさいですね・・・
おそらくツールとかが充実してくるんだとは思いますが・・・