kubesprayを使ってローカルwindows上にkubernetes clusterをつくる方法

# この記事について
この記事は[Kubernertes Advent calender 2018 その2](https://qiita.com/advent-calendar/2018/kubernetes2)の10日目の記事です。

紹介すること: 自身のローカルPC上にkubernetesのclusterを立てる方法
環境: windows 10(※たぶんwindows 7も可能)

# モチベーション
コンテナのオーケストレーションツールとしてKubernetesはデファクトスタンダードになりました。
Kubernetesを実際に試してみようと思う場合、もっとも簡単な方法は各クラウドベンダーのマネージドサービス(GKE, AKS, EKS)を使うことです。
しかし、マネージドサービスの使用には基本的にお金がかかります。
無料でやる方法(※)もありますが、使用できるリソースは非常に少なくいろいろ試すにはちょっと足りません。
ただ、皆さんが今使ってるPCにはそこそこのリソースがあるはずです。
そこで今回は、自身のローカルPC上にkubernetes clusterを立てる方法を紹介します。
kubernetes cluster構築には[kubespray](https://github.com/kubernetes-incubator/kubespray)を使用します

※参考資料: https://qiita.com/apstndb/items/788f705e71e7660967a6

# kubesprayとは
公式リポジトリはhttps://github.com/kubernetes-incubator/kubespray にあります
サイトにもあるように<b>Production Ready Kubernetes Cluster</b>をデプロイするためのツールです。
気軽に試すにはちょっと大げさですが、様々な環境にProductionでも使えるクラスタを構築できます。
そのため、Kubernetesの勉強としてはこれ以上ない環境なのではと思っています。
※ただしkubesprayはansibleを使用するため、windows上で使用するのは至難の業です。Linux環境だとここに書いてある手順の半分くらいの手間でできるので、もし可能ならそちらをおすすめします。

# 構築方針
kubesprayはvagrantでの構築をサポートしていますが、vagrantを使用するホストのOSとしてwindowsはサポートしていません。
実際に私はwindows上のvagrantを使って多大な労力をかけましたが成功しなかったのであまりお勧めはしません。(ansibleがインストールできなかったり、かといってansible_localを使うといろいろなところでエラーが出たりします)
※そもそも私のスキルが低いことが問題なだけなのかもしれませんが・・・orz
そこで今回の方針はwindows上のvagrantでbootstrap VMとkubernetes clusterのVM部分を作成します。そしてbootstrap VM上でkubesprayをダウンロードし、そこでansibleを使ってkubernetes clusterのセットアップをしていくという方針で進めました。
※なお、今回は以下のような構成のKubernetes Clusterを作成することを前提で話を進めます。その他の構成で作成したい場合は適宜読み替えてください。

- Kubernetes Master
  - 名前: kube-master
  - IPアドレス: 192.168.33.101
  - VM台数: 1
  - その他: etcdもこのVM上に立てる
- Kubernetes Node
  - 名前: kube-node
  - IPアドレス: 192.168.33.102
  - VM台数: 1

# Kubernetes Cluster構築手順

## vagrantのインストール
vagrantでVMを立てるので、windows上にインストールします。
インストールに関しては他の記事で大変丁寧に解説されているので、そちらをご参照ください。
参考サイト: https://qiita.com/TakashiOshikawa/items/d2fb48d59e9e316af9a2

## Kubernetes clusterのベースVMを作成
vagrantでVMを作成し、bootstrap上のansibleで構築できるようにsshでアクセスできるようにします。
今回、このあたりの設定と後で説明するBootstrap VMの設定を簡単にするためのVagrantfileをGitHub上に置いています(https://github.com/sh-miyoshi/windows-kube-cluster)
<b>注意: sshでrootにパスワードでアクセスできるようにするため、セキュリティ的にかなり弱くなります。そのため自身のローカル環境でのみ使用してください</b>

- windows-kube-clusterをダウンロード

```
$ git clone https://github.com/sh-miyoshi/windows-kube-cluster.git
or
公式ページのClone or Download → Download ZIPをクリック後、解凍する
```

- 設定ファイルを編集
  以下の項目はデフォルト値以外を使用したい人向けです。デフォルト値を使用する場合は無視してください。
  - kube-cluster/ansible/group_vars/all.yamlの変数の値(sshのパスワード)を変えてください
  - kube-cluster/Vagrantfileをテキストエディタで開き、`$vm_memory`や`$vm_info`を適当に編集してください。

- VMを起動

```
$ cd /path/to/window-kube-cluster/kube-cluster
$ vagrant up
```

## Bootstrap VMの作成
- VMを起動

```
$ cd /path/to/window-kube-cluster/bootstrap
$ vagrant up
```

## kubesprayによるkubernetes clusterの立ち上げ
Bootstrap VMにsshで乗り込み、必要な設定を書いた後、ansible-playbookコマンドでClusterを作り上げていきます。

- VMに乗り込む

```
$ cd /path/to/window-kube-cluster/bootstrap
$ vagrant ssh
```

- Kubernetes Cluster VMへアクセスできるように修正  
/etc/hostsファイルを編集し、Bootstrap VMからKubernetes Clusterの各VMに名前でアクセスできるようにします。  
viで/etc/hostsファイルを開き、以下のように変更してください。(下2行を追加)

``` hosts.
127.0.0.1       miyoshi-vm      miyoshi-vm
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.33.101 kube-master
192.168.33.102 kube-node
```

- kubesprayのインストール  
GitHubの公式リポジトリからダウンロードします  
その後`pip install`コマンドで必要なパッケージをインストールします(たぶんなくても動くけど一応・・・)

```
$ git clone https://github.com/kubernetes-incubator/kubespray.git
$ cd kubespray
$ sudo yum install python-pip
$ sudo pip install -r requirements.txt
```

- 設定ファイルを書く  
kubespray/inventory/sampleディレクトリ下にあるhosts.iniにKubernetes Clusterの情報を記入します。  
デフォルト値でやっている方は以下の情報をコピペしてください。

``` hosts.ini
[all]
kube-master ip=192.168.33.101
kube-node ip=192.168.33.102

[kube-master]
kube-master ip=192.168.33.101

[etcd]
kube-master ip=192.168.33.101

[kube-node]
kube-node ip=192.168.33.102

[k8s-cluster:children]
kube-master
kube-node
```

- ansibleの実行  
先ほど作成したhosts.iniを使ってKubernetes Clusterを作っていきます。  
-kオプションを付けることでSSHのパスワードを聞いてもらうようにしています。  
しばらく待てばansibleによるセットアップが終わってKubernetes Clusterが作成されます。  
※まぁまぁ時間かかります

```
$ sudo ansible-playbook -i inventory/sample/hosts.ini -k cluster.yml
```

## 状態を確認

最後に作成したKubernetes Clusterが正常動作しているか確認します。

1. sshでkube-masterに乗り込みます。
2. 以下のような`nginx.yaml`を作成し、リソースを作ります。
3. ブラウザからアクセスできることを確認します。

```
$ cd /path/to/windows-kube-cluster/kube-cluster
$ vagrant ssh kube-master
$ vi nginx.yaml
  ※以下を参照
$ kubectl apply -f nginx.yaml
※ windows上のブラウザからhttp://192.168.33.101:30000にアクセス
```

``` nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx
      ports:
      - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 30000
```


# 最後に
これでwindowsユーザーもハッピーコンテナライフ💛