Kubernetes の学習 (1) ～ AWS上でのクラスタ構築

# 概要
Kubernetes の学習をするためにまずは実環境がほしかったので、AWS EC2 上に Kubernetes のクラスターを構築してみた。今回は作業用のEC2 インスタンスを作成して、そこから Kubernetes のセットアップスクリプトを実行して、クラスターを構築した。

# 作業用インスタンスの作成
Kubernetes のクラスターを構築するための作業用インスタンスを作成する。

## IAM Role の作成
作業用インスタンスに割り当てる Role を作成する。Kubernetes の [セットアップスクリプト](https://get.k8s.io)は、自動で EC2インスタンス、VPC、S3バケットなどを作成するため、事前に Role を割り当てておく必要がある。

面倒であればフルアクセス権を持つ Role を作ればいいが、最低限以下のように EC2, S3, IAM へのアクセス権を持つ Role を作成すればいい。

```js
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "ec2:*",
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "elasticloadbalancing:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "autoscaling:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:*",
      "Resource": "*"
    }
  ]
}
```

![iam_role.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/63e91536-015e-67a7-4211-3944981f9f68.png)


## 作業用インスタンスの作成
EC2インスタンスを作成。 作成時に、上の手順で作成した Role を IAM Role として指定する。
![assign_role.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/e7627aa9-05cc-0305-9ca9-7bc2b5909f27.png)

起動後、作業用インスタンスにSSHで接続する。

# クラスターセットアップ

## 環境変数の設定
基本的には作業用インスタンスから https://get.k8s.io のセットアップスクリプトを実行するだけなのだが、このスクリプトが様々なリソースを作るため、AZ名やS3のバケット名などを環境変数で設定しておく。

```bash
# クラウドプロバイダー名の指定(aws)。 このスクリプトは、AWS だけでなく、
# Google Cloud Engine(gce) や Microsoft Azure(azure)にも対応しているため、
# この変数の指定は必要。
export KUBERNETES_PROVIDER=aws  

# 使用するAZの名前。デフォルトは us-west-2a になっているため、必要に応じて変更。
# なお、使用するリージョンは、このAZ名から判断される。
export KUBE_AWS_ZONE=ap-northeast-1a

# Master と Minon のインスタンスサイズ。デフォルトで t2.micro にはなっているが
# 念のため設定。
export MASTER_SIZE=t2.micro
export MINION_SIZE=t2.micro

# Minion の台数(作成するインスタンス数)。デフォルトで4台なので、2台にしておいた。
export NUM_MINIONS=2

# S3 のバケット名。すでに存在しればそれが使われ、存在しなければ作成される。
# なお、この環境変数を指定しなくても、名前を自動生成してバットを作成してくれる。
export AWS_S3_BUCKET=arturias-kube

# S3 のリージョン。バケットをスクリプトに生成させる場合に指定する。
export AWS_S3_REGION=ap-northeast-1
```

<補足> デフォルトでは Master や Minion は ubuntu の AMI を使って構築される。AWS_IMAGE という環境変数で使用する AMI を指定することはできるが、現在セットアップスクリプトでサポートされているのは ubuntu と CoreOS だけらしいので、それ以外は動作しない可能性がある。
    

## クラスターの構築
環境変数の設定が終わったら、Kubernets のセットアップスクリプトを実行する。

```bash
curl -sS https://get.k8s.io | bash
```

あとは自動的に進んでいき、クラスターが構築される。Master や Minon のアドレス、ユーザー名・パスワードが記載されたファイルなどの情報が出力される。

```bash
$ curl -sS https://get.k8s.io | bash
Downloading kubernetes release v0.19.3 to /home/ec2-user/kubernetes.tar.gz

・・・(略)

Kubernetes cluster is running.  The master is running at:

  https://52.68.83.XX

The user name and password to use is located in /home/ec2-user/.kube/config.

... calling validate-cluster
Found 2 nodes.
        NAME                                             LABELS                                                                  STATUS
     1  ip-172-20-0-10.ap-northeast-1.compute.internal   kubernetes.io/hostname=ip-172-20-0-10.ap-northeast-1.compute.internal   Ready
     2  ip-172-20-0-11.ap-northeast-1.compute.internal   kubernetes.io/hostname=ip-172-20-0-11.ap-northeast-1.compute.internal   Ready

・・・(略)

Done, listing cluster services:

Kubernetes master is running at https://52.68.83.XX
Elasticsearch is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/elasticsearch-logging
Kibana is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/kibana-logging
KubeDNS is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/kube-dns
Grafana is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/monitoring-grafana
 is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/monitoring-heapster
influxGrafana is running at https://52.68.83.XX/api/v1beta3/proxy/namespaces/default/services/monitoring-influxdb

Kubernetes binaries at /home/ec2-user/kubernetes/kubernetes/cluster/
You may want to add this directory to your PATH in $HOME/.profile
Installation successful!
```

AWS コンソールを見ると、以下のようにEC2インスタンスが作成されていることが分かる(kubernetes-* が自動で作成されたインスタンス)。セットアップスクリプトは EC2 の AutoScaling Group を作成し、その機能によりこれらのインスタンスが作成される。
![kube-nodes-ec2.PNG](https://qiita-image-store.s3.amazonaws.com/0/79316/991e3334-715a-b254-7cb7-66de5179ff58.png)

他にもセットアップスクリプトにより、VPC、S3バケット、IAM Role が作成される。

#動作確認

作業用インスタンスから、Master のアドレスにアクセスしてみる。ユーザー名とパスワードは、作業用インスタンスの ~/.kube/config に書かれている。

```bash
$ curl -u admin:XXXXXXX -k https://52.68.83.XX
{
  "paths": [
    "/api",
    "/api/v1",
    "/api/v1beta3",
    "/healthz",
    "/healthz/ping",
    "/logs/",
    "/metrics",
    "/static/",
    "/swagger-ui/",
    "/swaggerapi/",
    "/ui/",
    "/version"
  ]
}

$ curl -u admin:XXXXXXX -k https://52.68.83.XX/version
{
  "major": "0",
  "minor": "19",
  "gitVersion": "v0.19.3",
  "gitCommit": "3103c8ca0f24514bc39b6e2b7d909bbf46af8d11",
  "gitTreeState": "clean"
}
```

Pod を表示してみる。Kubernetes クラスタを管理するツールである kubectl は、セットアップを実行したディレクトリにある kubernetes/platforms/ 配下に置かれている。

```bash
$ ./kubernetes/platforms/linux/amd64/kubectl get pods
NAME                                                                   READY     REASON    RESTARTS   AGE
elasticsearch-logging-v1-atfii                                         1/1       Running   0          35m
elasticsearch-logging-v1-f3rge                                         1/1       Running   0          35m
fluentd-elasticsearch-ip-172-20-0-10.ap-northeast-1.compute.internal   1/1       Running   0          31m
fluentd-elasticsearch-ip-172-20-0-11.ap-northeast-1.compute.internal   1/1       Running   0          31m
kibana-logging-v1-4ije5                                                1/1       Running   0          35m
kube-apiserver-ip-172-20-0-9                                           0/1       Pending   0          11m
kube-controller-manager-ip-172-20-0-9                                  0/1       Pending   0          11m
kube-dns-v3-7rw1g                                                      3/3       Running   1          35m
kube-scheduler-ip-172-20-0-9                                           0/1       Pending   0          11m
monitoring-heapster-v3-uz6oy                                           1/1       Running   1          35m
monitoring-influx-grafana-v1-7agvr                                     2/2       Running   0          35m
```

# クラスターの削除

セットアップスクリプトは、AWS の AutoScaling Group や VPC など様々なリソースを作成しているので、手動でクラスターや各種リソースを削除するのは面倒。作業用インスタンスにダウンロードされている Kubernetes パッケージに含まれる cluster/kube-down.sh を使うのが簡単。

```bash
$ export KUBERNETES_PROVIDER=aws
$ export KUBE_AWS_ZONE=ap-northeast-1a
$ kubernetes/cluster/kube-down.sh
Bringing down cluster using provider: aws
Deleting auto-scaling group: kubernetes-minion-group
Deleting auto-scaling launch configuration: kubernetes-minion-group
Deleting instances in VPC: vpc-97e249f2
(中略)
Deleting security group: sg-f1700f94
Deleting security group: sg-f2700f97
Done
```


# 参考サイト
[Getting started on AWS EC2](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/getting-started-guides/aws.md)

# 修正履歴
2015/8/11 「クラスターの削除」を追記