AWS上でKubernetesクラスタを構築してアプリ運用してみた　その1（クラスタ環境構築）

Kubernetesを用いる機会が多くなってきたのですが、それをAWS上で構築してみた話。結構はまりますよね。。。
# ゴール
以下のゴールを設定します。
- AWS上はCentOSを使う（本当はAmazon Linuxで試したいのですが、色々面倒だったので今回はCentOS7で。）
- 3台のマシンを借りてそれぞれMaster1台、Node2台とする（全てt2.microを選択）
- 上記3台はVPC内で通信させる
- 外部からのアクセスを捌けるところまでを構築する
- 使うKubernetesバージョンは**1.2系**（こちらもいずれは1.3系を試してみたい）

３台構成にした中で、マイクロサービス的なこともしてみたいのですが、それはまた今度。で、今回は「その1」として、マスタ / ノードをそれぞれ１台ずつで構成し、一旦つなげてみます。
ちなみにKubernetesのバージョン重要です。（バージョンが異なればPod作成の設定、手順などが異なることがままあるため）

# AWSインスタンスの準備
2台準備します。とりあえずt2.microで組みます。それからVPCとサブネットも必要ですね。2インスタンスが所属するように設定します。VPCのインターネットゲートウェイアタッチとルートテーブルの設定忘れに注意。また事前に借りたインスタンスのSELinuxをOffにするなど設定しておきましょう。

またセキュリティグループも必要であれば環境に合わせて適宜設定をしてください。

インスタンス準備ができたら、各種インストールが必要です。
# マスタ側のインストール
```
$ sudo yum install kubernetes
$ sudo yum install etcd
$ sudo yum install flannel
```

続いてファイル編集

```
$ sudo vi /etc/kubernetes/config
```
```properties
#KUBE_MASTER="--master=http://127.0.0.1:8080"
KUBE_MASTER="--master=http://172.17.0.62:8080"
```
KUBE_MASTERは自マシンのプライベートIPアドレスになります。

```
$ sudo vi /etc/kubernetes/apiserver
```
```properties
#KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1"
KUBE_API_ADDRESS="--insecure-bind-address=172.17.0.62"

#KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_ETCD_SERVERS="--etcd-servers=http://172.17.0.62:2379"
```
KUBE_ETCD_SERVERS（172.17.0.62）は自マシンのプライベートIPアドレスになります。

```
$ sudo vi /etc/kubernetes/kubelet
```
```properties
#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=master"

#KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_API_SERVER="--api-servers=http://172.17.0.62:8080"
```
Kubernetesは/etc/hostsのファイルにある名前からホスト名を理解するので

```properties
172.17.0.62 master
```
を/etc/hostsに追記しておきましょう。（これはノードの設定でも一緒です）

続いてetcdに関連するファイルの変更です。

```
$ sudo vi /etc/etcd/etcd.conf
```
```properties
#ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

#ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
```
```
$ sudo etcdctl mk /atomic.io/network/config '{"Network":"172.16.0.0/16"}'
```
※172.17.0.0/16はAWS側がプライベートアドレスを割り振ることが多いので（例に漏れず今回もそうです）、今回の設定では172.16系を指定しています。

必要ファイルが編集できたら関連サービスを再起動します。ついでに起動時に動くようにしておきます。

```
$ sudo systemctl restart etcd
$ sudo systemctl restart kube-apiserver
$ sudo systemctl restart kubelet
$ sudo systemctl restart kube-controller-manager
$ sudo systemctl restart kube-scheduler
$ sudo systemctl restart kube-proxy
$ sudo systemctl restart flanneld
$ sudo systemctl enable etcd
$ sudo systemctl enable kube-apiserver
$ sudo systemctl enable kubelet
$ sudo systemctl enable kube-controller-manager
$ sudo systemctl enable kube-scheduler
$ sudo systemctl enable kube-proxy
$ sudo systemctl enable flanneld
```

以下のコマンドでmasterが動いているかどうかの確認ができます。

```properties
$ kubectl cluster-info
Kubernetes master is running at http://localhost:8080
```
## ノード側の設定
```
$ sudo yum install kubernetes
$ sudo yum install docker
$ sudo yum install flannel
```

各種ファイルの設定です。

```
$ sudo vi /etc/kubernetes/config
```
```properties
#KUBE_MASTER="--master=http://127.0.0.1:8080"
KUBE_MASTER="--master=http://172.17.0.62:8080"
```
```
$ sudo vi /etc/kubernetes/kubelet
```
```properties
#KUBELET_ADDRESS="--address=127.0.0.1"
KUBELET_ADDRESS="--address=172.17.0.161"

#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=node1"

#KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"
KUBELET_API_SERVER="--api-servers=http://172.17.0.62:8080"
```
KUBELET_ADDRESSには自マシンのプライベートアドレスを定義してください。

```
$ sudo vi /etc/sysconfig/flanneld
```
```properties
#FLANNEL_ETCD="http://127.0.0.1:2379"
FLANNEL_ETCD="http://172.17.0.62:2379"
```

設定が完了したら以下のコマンドで必要なサービスを起動します。

```
$ sudo systemctl start docker
$ sudo systemctl start flanneld
$ sudo systemctl start kubelet
$ sudo systemctl start kube-proxy
$ sudo systemctl enable docker
$ sudo systemctl enable flanneld
$ sudo systemctl enable kubelet
$ sudo systemctl enable kube-proxy
```

# マスタとノードの設定の確認
一通り設定が終わったらマスタがノードを認識しているかを確かめましょう。

[マスタ]

```
$ kubectl get nodes
NAME      STATUS    AGE
master    Ready     25m
node1     Ready     24s
```
同じ設定をすれば２台目のノードを構築することも可能です。まずはこれでKubernetesクラスタを利用するための準備が整いました。これからはこの環境にDashBoardをインストールし、各ノードやPodの状態を確認しつつ、各ノードでのアプリ起動、運用を目指します。