KubernetesでWindowsコンテナをクラスタ化して管理～Master構築編～

本記事は、「[クラウド時代のシステム管理](https://www.takanyan.net/kubernetes-windows-2-setup-master/)」の記事の転載です。

<a href="https://www.takanyan.net/kubernetes-windows-1/" rel="noopener" target="_blank">前回の環境セットアップ編</a>ではKubernetesでWindowsコンテナクラスタを構築するための環境セットアップまで完了させました。今回は、Linux上にKubernetes Master Nodeを手動で構築します。

<!--more-->

## 1. 環境の構成の確認と参考サイト

今回解説する手順は、環境全体のうち次の図にあるMaster Node部分の構築手順です。

<a href="https://www.takanyan.net/wp-content/uploads/2018/02/kubernetes-env-master.png"><img src="https://www.takanyan.net/wp-content/uploads/2018/02/kubernetes-env-master.png" alt="kubernetes windows environment" class="aligncenter size-full wp-image-453" /></a>

以下の手順は、Microsoft Docsにある<a href="https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/creating-a-linux-master" rel="noopener" target="_blank">こちらのサイトの手順</a>をもとに構築しています。ただし、Kubernetesは新しいバージョンがどんどんリリースされるため、手順が使えなくなる可能性もあるのでご注意ください。また、日本語版のドキュメントも存在していますが、内容のUpdateや間違いの修正が反映されていないため、実行するコマンドや手順自体は上記リンク先の英語版で確認することをお勧めします。

## 1. Kubernetesのインストール

### 1-1. 必要なパッケージとセットアップツールを準備

まず、Kubernetesを動かすのに必要なパッケージをインストールします。

```bash
$ sudo apt-get install curl git build-essential docker.io conntrack python2.7
```

次に、Microsoftが用意しているGithub上のリポジトリにある設定Scriptをダウンロードします。

```bash
$ mkdir -p ~/kube/bin
$ git clone https://github.com/Microsoft/SDN /tmp/k8s 
$ cd /tmp/k8s/Kubernetes/linux
$ chmod -R +x *.sh
$ chmod +x manifest/generate.py
$ mv * ~/kube/
```

### 1-2. Kubernetes本体とCNI Pluginの展開

設定Scriptを準備できたら、次はKubernetes本体のバイナリをダウンロードします。以下はv1.9.2をダウンロードしていますが、ダウンロードURLを適宜新しいバージョンに変更可能です。執筆時点ではv1.9.3がリリースされています。

```bash
$ wget -O kubernetes.tar.gz https://github.com/kubernetes/kubernetes/releases/download/v1.9.2/kubernetes.tar.gz
$ tar -xzf kubernetes.tar.gz
$ cd kubernetes/cluster
$ ./get-kube-binaries.sh
$ cd ../server
$ tar -xzf kubernetes-server-linux-amd64.tar.gz
$ cd kubernetes/server/bin
$ cp hyperkube kubectl ~/kube/bin/
```

Kubernetes実行ファイルのためにPATH情報をログインユーザーのプロファイルに追加しておきます。

```bash
$ vi ~/.profile
（最終行に以下を追記）
PATH="$HOME/kube/bin:$PATH"
```

次にCNI Pluginをダウンロードして展開します。下記のコマンドではCNI Pluginの最新リリースのバイナリを取得しています。

```bash
$ DOWNLOAD_DIR="${HOME}/kube/cni-plugins"
$ CNI_BIN="/opt/cni/bin/"
$ mkdir ${DOWNLOAD_DIR}
$ cd $DOWNLOAD_DIR
$ curl -L $(curl -s https://api.github.com/repos/containernetworking/plugins/releases/latest | grep browser_download_url | grep 'amd64.*tgz' | head -n 1 | cut -d '"' -f 4) -o cni-plugins-amd64.tgz
$ tar -xzf cni-plugins-amd64.tgz
$ sudo mkdir -p ${CNI_BIN}
$ sudo cp -r !(*.tgz) ${CNI_BIN}
```

以上の準備ができたら、各種設定の反映のために、一度OSを再起動しておきます。


## 2. Kubernetesの初期設定と起動

以下ではKubernetesの初期設定を行います。初期設定に用いる各種設定パラメータ名とその値および意味は以下の通りとします。

|パラメータ名|値|意味|
|:---:|:---:|:---:|
|<code>MASTER_IP</code>|192.168.1.20|Kubernetes Master（Ubuntu）のIPアドレス|
|<code>CLUSTER_CIDR</code>|172.16.0.0/16|コンテナクラスタ用Networkで使うCIDRで、/16で必ず指定する。ここから各Node用に/24ずつアサインされる。|
|<code>api-version</code>|1.9.2|インストールするKubernetesのバージョン|


### 2-1. Node間通信用証明書の生成

KubernetesのMasterを含めたNode間の管理通信のやり取りには証明書が用いられます。その証明書を以下のScriptで生成します。

```bash
$ MASTER_IP=192.168.1.20
$ cd ~/kube/certs
$ chmod u+x generate-certs.sh
$ ./generate-certs.sh $MASTER_IP
```

### 2-2. manifestファイルの生成

Kubernetes Master Nodeではmanifestファイルによって様々な設定を行います。手動でmanifestを作るのは手間なので、Pythonのスクリプトを使って生成します。ただ、事前にダウンロードしているScriptはPython 2系対応の内容になっていますがUbuntu 17.10ではデフォルトでPython 3系が使われているため、明示的にPython 2.7を指定して実行します。この点が、Microsoftのドキュメントに明記されていないので注意が必要です。

```bash
$ cd ~/kube/manifest
$ python2.7 ./generate.py $MASTER_IP --cluster-cidr 172.16.0.0/16 --api-version=1.9.2
```

上記のコマンドではAPI Versionとして1.9.2を指定しましたが、実際に利用するバージョンに合わせて設定します。

### 2-3. 操作用CLI(kubectl)の設定

Kubernetesを操作するコマンド<code>kubectl</code>でKubernetes MasterのAPIエンドポイントにアクセスできるよう、設定ファイルの生成と適切なディレクトリへの保存を行います。

```bash
$ cd ~/kube
$ ./configure-kubectl.sh $MASTER_IP
$ mkdir ~/kube/kubelet
$ sudo cp ~/.kube/config ~/kube/kubelet/
```

ここで生成した<code>~/.kube/config</code>ファイルは次回解説するWindowsコンテナNodeにも設置する必要があります。ダウンロードしておくと良いです。


## 3. Kubernetes Masterの起動と動作確認

### 3-1. Kubernetes Masterの起動

Kubernetes Masterをフォアグラウンドで起動します。起動するとずっと大量の出力が出続けるので、別Terminalを開き、ログの記録はしないよう注意してから実行します。まず、kubeletプロセスを開始します。

```bash
$ cd ~/kube
$ sudo ./start-kubelet.sh
```

出力結果が似たような内容の繰り返しになってきたら（初回は1～2分後）、別のTerminalでkubeproxyを開始します。この時、前節で指定した<code>CLUSTER_CIDR</code>の第2オクテットまでを引数に渡します。

```bash
$ cd ~/kube
$ sudo ./start-kubeproxy.sh 172.16
```

以上でKubernetes Masterが起動しました。デーモン化はしていないので、Master NodeのOSを起動するたびに手動でKubernetesを立ち上げる必要があります。

### 3-2. Master Nodeの起動確認

いくつかの方法でMaster Nodeが起動していることを確認します。まず、Kubernetes Master Nodeでは23個くらいのコンテナが起動します。起動していることを確認します。

```bash

$ sudo docker ps
CONTAINER ID        IMAGE                                                                                                                              COMMAND                  CREATED             STATUS              PORTS               NAMES
2aec1759b16d        gcr.io/google_containers/kubernetes-dashboard-amd64@sha256:2c4421ed80358a0ee97b44357b6cd6dc09be6ccc27dfe9d50c9bfc39a760e5fe        "/dashboard --inse..."   12 minutes ago      Up 12 minutes                           k8s_kubernetes-dashboard_kubernetes-dashboard-569d66cbd6-4gdhg_kube-system_dc60508c-033d-11e8-9830-00155d010b0d_2
a3f7cd1288cd        gcr.io/google_containers/exechealthz-amd64@sha256:7ecf20f93a631b0ec582214612e1e3e0baac9d024c58ce0a213c9fc26f19686f                 "/exechealthz '--c..."   13 minutes ago      Up 13 minutes                           k8s_healthz_kube-dns-v20-jh96x_kube-system_dc75ab38-033d-11e8-9830-00155d010b0d_0
66853ac43cc1        gcr.io/google_containers/exechealthz-amd64@sha256:7ecf20f93a631b0ec582214612e1e3e0baac9d024c58ce0a213c9fc26f19686f                 "/exechealthz '--c..."   13 minutes ago      Up 13 minutes                           k8s_healthz_kube-dns-v20-cgdm7_kube-system_dc6b9ffa-033d-11e8-9830-00155d010b0d_0
dc3b23c1c3db        gcrio.azureedge.net/google_containers/kube-dnsmasq-amd64@sha256:33f66d91ca9806dc2f5d630be8818d93455ac855bf27c519ad483fd5972a87b8   "/usr/sbin/dnsmasq..."   13 minutes ago      Up 13 minutes                           k8s_dnsmasq_kube-dns-v20-jh96x_kube-system_dc75ab38-033d-11e8-9830-00155d010b0d_0
814738fbaba0        gcrio.azureedge.net/google_containers/addon-resizer@sha256:ba506f5f21356331d92141ee48fc4945fd467ec6010364ae970342de5477272c        "/pod_nanny --cpu=..."   13 minutes ago      Up 13 minutes                           k8s_heapster-nanny_heapster-v1.2.0-69bbc88d85-gxsjf_kube-system_dc9744ae-033d-11e8-9830-00155d010b0d_0
a668698e4deb        gcrio.azureedge.net/google_containers/kube-dnsmasq-amd64@sha256:33f66d91ca9806dc2f5d630be8818d93455ac855bf27c519ad483fd5972a87b8   "/usr/sbin/dnsmasq..."   14 minutes ago      Up 14 minutes                           k8s_dnsmasq_kube-dns-v20-cgdm7_kube-system_dc6b9ffa-033d-11e8-9830-00155d010b0d_0
d80c24e20b1e        gcrio.azureedge.net/google_containers/kubedns-amd64@sha256:9b811ed606fd0ec2f4a8ec420968621e91ccdfc2143879e5b12a8c8321a81ebb        "/kube-dns --domai..."   14 minutes ago      Up 14 minutes                           k8s_kubedns_kube-dns-v20-jh96x_kube-system_dc75ab38-033d-11e8-9830-00155d010b0d_0
9b27ec99f67b        gcrio.azureedge.net/google_containers/heapster@sha256:97485e7168ee127c4fd42fc248b56a50dfbd5db878335c0bd190663c0cad16bc             "/heapster --sourc..."   14 minutes ago      Up 14 minutes                           k8s_heapster_heapster-v1.2.0-69bbc88d85-gxsjf_kube-system_dc9744ae-033d-11e8-9830-00155d010b0d_0
5cfe07499219        gcrio.azureedge.net/google_containers/kubedns-amd64@sha256:9b811ed606fd0ec2f4a8ec420968621e91ccdfc2143879e5b12a8c8321a81ebb        "/kube-dns --domai..."   14 minutes ago      Up 14 minutes                           k8s_kubedns_kube-dns-v20-cgdm7_kube-system_dc6b9ffa-033d-11e8-9830-00155d010b0d_0
5bc7b96b6510        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 14 minutes ago      Up 14 minutes                           k8s_POD_heapster-v1.2.0-69bbc88d85-gxsjf_kube-system_dc9744ae-033d-11e8-9830-00155d010b0d_0
61c996d5104d        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 14 minutes ago      Up 14 minutes                           k8s_POD_kubernetes-dashboard-569d66cbd6-4gdhg_kube-system_dc60508c-033d-11e8-9830-00155d010b0d_0
792f70f7a3e9        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 14 minutes ago      Up 14 minutes                           k8s_POD_kube-dns-v20-jh96x_kube-system_dc75ab38-033d-11e8-9830-00155d010b0d_0
382803c7c802        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 14 minutes ago      Up 14 minutes                           k8s_POD_kube-dns-v20-cgdm7_kube-system_dc6b9ffa-033d-11e8-9830-00155d010b0d_0
d6af9b72792d        gcr.io/google_containers/hyperkube-amd64@sha256:cd3430a6fbbffa6f52f7233c08237477ef374424baf45df8e33c5dc9b1f87177                   "/hyperkube apiser..."   15 minutes ago      Up 15 minutes                           k8s_kube-apiserver_kube-apiserver-kube-master_kube-system_42e5f383823c8bb80fce8dc5853b0ea5_0
b9424c962fb1        gcr.io/google_containers/hyperkube-amd64@sha256:69cd6e29c8bd7658e6597cba6aa0110e91c8ef9a993844717e7819cf91d77563                   "/hyperkube schedu..."   15 minutes ago      Up 15 minutes                           k8s_kube-scheduler_kube-scheduler-kube-master_kube-system_c16f50e59bcd25ea49353c1d2444e87b_0
2f1e92b84fc4        gcr.io/google_containers/etcd@sha256:d83d3545e06fb035db8512e33bd44afb55dea007a3abd7b17742d3ac6d235940                              "/bin/sh -c '/usr/..."   15 minutes ago      Up 15 minutes                           k8s_etcd-container_kube-etcd-kube-master_kube-system_5b10b07f6ba446c63b95480b4035d9f4_0
0dcad326b8d9        gcr.io/google_containers/kube-addon-manager-amd64@sha256:3e6ff32eb762ecf17d817c49372f4fe51052d3406772ddb0a65f89c478070b96          "/opt/kube-addons.sh"    15 minutes ago      Up 15 minutes                           k8s_kube-addon-manager_kube-addon-manager-kube-master_kube-system_352c7581858c47d92ec8a15335eea599_0
35baf72ed26b        gcr.io/google_containers/hyperkube-amd64@sha256:69cd6e29c8bd7658e6597cba6aa0110e91c8ef9a993844717e7819cf91d77563                   "/hyperkube contro..."   15 minutes ago      Up 15 minutes                           k8s_kube-controller-manager_kube-controller-manager-kube-master_kube-system_db212c4ed6765b078803edf554fa4711_0
4826b64fce5a        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 15 minutes ago      Up 15 minutes                           k8s_POD_kube-controller-manager-kube-master_kube-system_db212c4ed6765b078803edf554fa4711_0
fcc36dfa1ac4        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 15 minutes ago      Up 15 minutes                           k8s_POD_kube-etcd-kube-master_kube-system_5b10b07f6ba446c63b95480b4035d9f4_0
805ff0e6d3e3        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 15 minutes ago      Up 15 minutes                           k8s_POD_kube-apiserver-kube-master_kube-system_42e5f383823c8bb80fce8dc5853b0ea5_0
47323c7456f4        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 15 minutes ago      Up 15 minutes                           k8s_POD_kube-addon-manager-kube-master_kube-system_352c7581858c47d92ec8a15335eea599_0
ce8c90587bfb        gcrio.azureedge.net/google_containers/pause-amd64:3.0                                                                              "/pause"                 15 minutes ago      Up 15 minutes 
```

次に、<code>kubectl</code>コマンドでKubernetesクラスタのAPIエンドポイント情報などを確認します。

```bash
$ kubectl cluster-info
Kubernetes master is running at https://192.168.1.20
Heapster is running at https://192.168.1.20/api/v1/namespaces/kube-system/services/heapster/proxy
KubeDNS is running at https://192.168.1.20/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

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

また、コンテナ間の通信のために<code>cbr0</code>というインターフェースが生成されており、<code>CLUSTER_CIDR</code>の中のIPが付与されていることを確認します。

```bash
$ ifconfig
cbr0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 172.16.0.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::1838:a1ff:fe65:68c1  prefixlen 64  scopeid 0x20<link>
        ether 0a:58:ac:10:00:01  txqueuelen 1000  (Ethernet)
        RX packets 1860  bytes 211478 (211.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1816  bytes 1081512 (1.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
（以下略）
```

以上で、Kubernetes Masterの構築が完了しました。次回はWindows Server version 1709でKubernetes Worker Nodeを構築します。