CentOS7でkubernetesを利用したdockerクラスタを構築する

今日は、dockerはサーバ1台で利用するには非常に便利なツールです。しかし、共通でたくさんの人が利用する仕組み(システム)を作るには、もう少し手順が必要です。その一つがGoogleが提供したkubernetes(k8s)です。Redhatが提供するOpenShiftにもコンポーネントとして利用されています。

今日はその構築方法についてまとめました。利用するOSは、CentOS 7になります。

###参考ページ
- http://keithtenzer.com/2015/06/01/application-containers-kubernetes-and-docker-from-scratch/
- http://keithtenzer.com/2015/04/15/containers-at-scale-with-kubernetes-on-openstack/

### kubernetesのアーキテクチャ
- http://www.slideshare.net/enakai/red-hat-enterprise-linux-71-kubernetes#5


# システム構成
kubernetes01    master, node
kubernetes02    node
kubernetes03    node


# 設定手順
## 共通の設定

#### firewalldを止めておきます。
```
systemctl stop firewalld
systemctl disable firewalld
```

#### 時刻同期を合わせます
```
yum install chrony
systemctl start chronyd.service
chronyc sources
```

#### サーバ名を登録します
```:/etc/hosts
192.168.243.51  kubernetes01
192.168.243.52  kubernetes02
192.168.243.53  kubernetes03
```
※各環境に合わせてください

# Kubernetes Masterの設定

必要なサービス・ツールをインストールし、enableにします。

```
yum install etcd flannel docker-registry docker kubernetes 

for SERVICES in docker.service docker-registry etcd kube-apiserver kube-controller-manager kube-scheduler flanneld 
   do systemctl enable $SERVICES 
done
```

#### dockerのREGISTRYにprivate-registryを追加します。

```:/etc/sysconfig/docker
INSECURE_REGISTRY='--insecure-registry kubernetes01:5000'
```

#### kubernetesのAPIサーバの設定をします
 
```:/etc/kubernetes/apiserver
KUBE_API_ADDRESS="--address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd_servers=http://kubernetes01:2379"
```
外部から参照できるように0.0.0.0にすることを忘れないようにしてください。

#### kubernetesのmasterの接続先を設定します
```:/etc/kubernetes/config
KUBE_MASTER="--master=http://kubernetes01:8080"
```

#### kubernetesのnodeを設定します
複数のnodeを設定する場合は、複数並べます。

```:/etc/kubernetes/controller-manager
KUBELET_ADDRESSES="--machines=kubernetes01,kubernetes02,kubernetes03"
```

## etcdの設定

```:/etc/etcd/etcd.conf
ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
```
外部から参照できるように0.0.0.0にすることを忘れないようにしてください。

## flannelの設定

etcdと接続する設定を記入します。上で指定した2379ポートを間違わないように記載します。また、/flannel/networkは後で設定しています。
```:/etc/sysconfig/flanneld
FLANNEL_ETCD="http://kubernetes01:2379"
FLANNEL_ETCD_KEY="/flannel/network"
FLANNEL_OPTIONS="eth0"
```

#### etcdにアップするflannelの設定ファイルです。
```:/root/flannel-config.json
{
 "Network": "10.100.0.0/16",
 "SubnetLen": 24,
 "SubnetMin": "10.100.50.0",
 "SubnetMax": "10.100.199.0",
 "Backend": {
 "Type": "vxlan",
 "VNI": 1
 }
}
```

#### etcdのAPIを使って、前で設定した/flannel/network/configにJSONデータをアップします。
```
#curl -L http://kubernetes01:2379/v2/keys/flannel/network/config -XPUT --data-urlencode value@/root/flannel-config.json
{"action":"set","node":{"key":"/flannel/network/config","value":"{\n \"Network\": \"10.100.0.0/16\",\n \"SubnetLen\": 24,\n \"SubnetMin\": \"10.100.50.0\",\n \"SubnetMax\": \"10.100.199.0\",\n \"Backend\": {\n \"Type\": \"vxlan\",\n \"VNI\": 1\n }\n}\n","modifiedIndex":6,"createdIndex":6}}
```

正常に登録できているかは、以下のコマンドで確認できます。

```
etcdctl -C=http://kubernetes01:2379 ls --recursive
etcdctl -C=http://kubernetes01:2379 get /flannel/network/config
```

#### 正常に起動することを確認し、念のため再起動しておきます。
```
systemctl start docker
systemctl start docker-registry
reboot
```
※再起動する意味は、起動後も正しく動作することを確認するということが大きい理由です。

# kubenetes Nodeのインストール

#### 必要なサービスをインストールします。
```
yum install -y docker kubernetes flannel

for SERVICES in docker.service kubelet kube-proxy flanneld
   do  systemctl enable $SERVICES
done

```

#### kubernetes nodeで動かすのは、kubeletサービスになります。
masterに接続するAPIのURLと自分のアドレスを設定します。

```:/etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME=""
KUBELET_API_SERVER="--api_servers=http://kubernetes01:8080"
```
外部から参照できるように0.0.0.0にすることを忘れないようにしてください。

## dockerの設定

```:/etc/sysconfig/docker
ADD_REGISTRY='--add-registry kubernetes01:5000'
```

## flannelの設定
masterと同様に設定します。

```:/etc/sysconfig/flanneld
FLANNEL_ETCD="http://kubernetes01:4001"
FLANNEL_ETCD_KEY="/flannel/network"
FLANNEL_OPTIONS="eth0"
```

# 各サービスの確認
うまく設定できればこのようにすべての接続先ノードが見えるはずです。

```
# kubectl get nodes
NAME           LABELS                                STATUS
kubernetes01   kubernetes.io/hostname=kubernetes01   Ready
kubernetes02   kubernetes.io/hostname=kubernetes02   Ready
kubernetes03   kubernetes.io/hostname=kubernetes03   Ready
```

ちなみに、OpenShiftでは、flannelを使用していないそうです。flannelでは、latencyが大きくなる傾向があるそうで、Open vSwitchを利用し、VXLANのoverlayネットワークを構成しているようです。

今日はここまでです。