Kubernetesでクラスタ環境構築手順(1) - masterの作成

## 概要
Kubernetesの環境構築手順です。

## Kubernetesとは
Kubernetesとは、Dockerなどの仮想コンテナのクラスタリングを行うためのサービスです。

詳しくはこちらを参照してください。

- [Docker（コンテナ型仮想化）と Kubernetes についての簡単な紹介](https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/)
- [Kubernetesとは何かを分かりやすく紹介する「よい子のためのKubernetes絵本」動画が公開](http://www.publickey1.jp/blog/16/kuberneteskubernetes.html)

この記事はmasterの構築手順です。
nodeの作成手順は以下になります。
[Kubernetesでクラスタ環境構築手順(2) - nodeの作成](http://qiita.com/Esfahan/items/256fdb78e6a40b7c3e1f)

## 目次
- [Kubernetesハンズオン目次](https://qiita.com/Esfahan/items/4fcf51622fed20dffb88)


## 事前準備
まず、master用に1台、node用に最低1台、サーバーを用意する必要があります。
今回は、vagrantを2つ、master, node用に用意をして構築をしました。


このページで、手順で特に指定がないものは、全てmasterサーバーで実行してください。

## masterの環境
- CentOS7.1
- Kubernetes v1.5.2
- flanneld 0.7.1
- etcdserver 3.1.9
- etcdcluster 3.1.0
- Docker version 1.12.6, build 88a4867/1.12.6

## kubernetesのアーキテクチャ
kubernetesを構成するコンポーネントです。

| component | desc |
| --- | --- |
| apiserver | kubernetesを操作するためのAPIを提供する |
| controller-manager | コンテナの状態管理やノードの管理と言った各種管理作業を行う |
| proxy | コンテナへのネットワークルーティングおよび負荷分散を行う |
| scheduler | 各ノードに対しコンテナの割り当てなどを行う |
| kubelet | 各ノード上でのコンテナ作成/削除やボリュームの割り当てなどを行う |
| kubectl | API経由でKubenetesを操作するためのクライアントツール |

引用元：[kubernetesによるDockerコンテナ管理入門](http://knowledge.sakura.ad.jp/tech/3681/)

## flannelとetcdについて
これらの2つを使って、コンテナ間で通信するための内部ネットワークが作られます。
flannelはetcdを使うので、まず先にetcdが起動している必要があります。

| 名前 | 説明 |
| --- | --- |
| [ectd](http://qiita.com/pocket8137/items/ef44ca68ffc0f4e70995) | Flannelが各種情報を格納するKeyValueストア |
| [flannel](http://qiita.com/dtan4/items/8f9cf40aabd2e6c9a494#flannel) | コンテナ間で通信するための内部ネットワークを作る |

参考記事：[Kubernetesの分散環境を支えるetcdとflannel ](https://netmark.jp/2014/12/kubernetes-etcd-flannel.html)

## host名の設定
Kubernetesは、node間通信で、マシンのホスト名を利用できるように、
/etc/hostsにIPアドレスとホスト名を登録します。

```lang:/etc/hosts
192.168.33.10 master
```

## インストール
etcd, kubernetes, flannelをインストールします。

```
$ sudo yum -y install etcd kubernetes flannel
```

## etcdの設定
kubernetesやflannelはその設定管理にetcdを使用します。
そのため、まずetcdの設定を行ってサービスを起動しておく必要があります。

etcdのデフォルト設定ではローカルホストからしかetcdにアクセスできないようになっているので、外部から接続できるようにします。

```
$ sudo vi /etc/etcd/etcd.conf
```

```lang:/etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
```

```
$ sudo systemctl start etcd
```


## flannelの設定
仮想ネットワークを利用するためにflannelの設定を行います。
etcdctlコマンドでflannelが使用する仮想ネットワークのIPアドレスを指定します。

```
$ sudo etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'
```

```
$ sudo  systemctl start flanneld
```

## kubernetesの設定
Kubernetesの設定をします。

### RSA鍵の発行
opensslコマンドを使用して、kubernetesのAPI認証に使用される鍵ファイルを/etc/kubernetes/serviceaccount.keyとして作成します。

```
$ sudo openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048
```

### マスターサーバーの指定
/etc/kubernetes/configファイルでkubernetesのマスターサーバーを指定します。

```
$ sudo vi /etc/kubernetes/config
```

```lang:/etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.33.10:8080"
```

### 自マシンのホスト名とAPI Serverの設定
/etc/hostsに設定した、ホスト名と、API Serverの設定をします。

```
$ sudo vi /etc/kubernetes/kubelet
```

```lang:/etc/kubernetes/kubelet
KUBELET_HOSTNAME="--hostname-override=master"
KUBELET_API_SERVER="--api-servers=http://192.168.33.10:8080"
```

### API Serverの設定
KUBE_API_ADDRESSにマスターサーバーのIPアドレスを指定します。
KUBE_API_ARGSに作成したRSA鍵のパスを指定します。

`--insecure-bind-address` を使っているのはローカルの通信を想定しているため。
ローカルでない場合は、 `--address` を使う。

`KUBE_API_ARGS` には先ほど生成したRSA鍵のパスを指定します。

```
$ sudo vi /etc/kubernetes/apiserver
```

```lang:/etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=192.168.33.10"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.33.10:2379"
KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key"
```

### controller-manager
/etc/kubernetes/controller-managerにも、同様に鍵ファイルの指定をします。

```
$ sudo vi /etc/kubernetes/controller-manager
```

```lang:/etc/kubernetes/controller-manager
# Add your own!
KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key"
```

### 色々起動
色々起動します。

```
$ sudo systemctl start kube-apiserver
$ sudo systemctl start kube-controller-manager
$ sudo systemctl start kube-scheduler
$ sudo systemctl start kube-proxy
$ sudo systemctl start kubelet
```

自動起動設定

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

## kubectlコマンドの設定
kubectlコマンドで設定をします。
こちらの設定は、ユーザーごとに作られるので、Kubernetesを操作する一般ユーザーで実行してください。

ちなみに、kubectlコマンドは設定ファイルとして~/.kube/configファイルを参照するので、kubectlコマンドを使用せず、手動で~/.kube/configを作成することもできます。

```
$ kubectl config set-cluster vagrant --server=http://master:8080
$ kubectl config set-credentials vagrant-admin --username=admin --password=admin
$ kubectl config set-context vagrant --cluster=vagrant --user=vagrant-admin
$ kubectl config use-context vagrant
```

設定内容確認

```
$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    server: http://master:8080
  name: vagrant
contexts:
- context:
    cluster: vagrant
    user: vagrant-admin
  name: vagrant
current-context: vagrant
kind: Config
preferences: {}
users:
- name: vagrant-admin
  user:
    password: admin
    username: admin
```

## クラスタの情報を確認

```
$ kubectl cluster-info
Kubernetes master is running at http://master:8080

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

## nodeの情報を確認。
masterができていることが確認できます。

```
$ kubectl get nodes
NAME      STATUS    AGE
master    Ready     6m
```

## firewallの設定
nodeとの通信のために、2379番, 8080番のポートを開ける。

```
$ sudo firewall-cmd --add-port=2379/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=8080/tcp --zone=public --permanent
$ sudo firewall-cmd --reload
```

次項: [Kubernetesでクラスタ環境構築手順(2) - nodeの作成](http://qiita.com/Esfahan/items/256fdb78e6a40b7c3e1f)

## 参考
- [kubernetesによるDockerコンテナ管理入門](http://knowledge.sakura.ad.jp/tech/3681/)
- [Docker（コンテナ型仮想化）と Kubernetes についての簡単な紹介](https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/)
- [Kubernetesクラスタ環境を構築してDashboardで見える化を試してみた](http://acro-engineer.hatenablog.com/entry/2016/10/04/120000)
- [docker-composeしか知らない私がKubernetesを触ってみたメモ](https://devalon.biz/docker-composesikazhi-ranairen-gakuberneteswohong-tutemitamemo/)
- [VagrantでKubernetesクラスタを立てる](http://qiita.com/awakia/items/fa054fd2a7c6329adac7)
- [Kubernetes Installation with Vagrant & CoreOS](https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant.html)
- [［入門編］etcdでクラスタを構築する](http://qiita.com/coreos/items/2e4ca397031d368832c4)
- [Kubernetesとは何かを分かりやすく紹介する「よい子のためのKubernetes絵本」動画が公開](http://www.publickey1.jp/blog/16/kuberneteskubernetes.html)