VirtualBox on Windows用のKubernetesインストーラー

これはなに
==========

CoreOSの[Kubernetesインストーラープロジェクト](https://github.com/coreos/coreos-kubernetes)が、WindowsのVirtulaBoxに対応していなかったので、作ってみました。
以下のような構成の、Kubernetes環境を作ることができます。

    -------------------------------
    |          Kubernetes         |
    -------------------------------
    | Core OS | Core OS | Core OS |
    -------------------------------
    |          VirtualBox         | <- Vagrantで操作
    -------------------------------
    |           Windows           |
    -------------------------------
    |             H/W             |
    -------------------------------


使い方
======

前提条件
--------
VirtualBoxがインストール済みであることに加えて、Windowsのコマンドプロンプトで以下のコマンドラインツールが利用できる環境が必要です。

- 7-Zip
- Git
- Kubernetes CLI
- OpenSSH
- OpenSSL
- Vagrant

次章で、上記コマンドラインツールのインストール手順も記します。VirtualBoxだけはインストールを済ませた上で、以降の手順に進んでください。


コマンドラインツール群のインストール
------------------------------------
前提条件に記したコマンドラインツールがインストールされていない場合、以下の手順でインストールします。

### 1. Chocolateyのインストール
コマンドラインツールのインストールにはWindows用のパッケージマネージャのChocolateyを使います。

#### 1-1. コマンドプロンプトを管理者として実行

#### 1-2. 以下をペーストして実行

    > @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

#### 1-3. インストールの確認
バージョン情報を表示して正常にインストールされているか確認します。

    > choco
    Chocolatey v0.10.8
    Please run 'choco -?' or 'choco <command> -?' for help menu.


### 2. 各コマンドラインツールのインストール

コマンドプロンプトを管理者として実行し、Chocolateyで各コマンドラインツールをインストールしていきます。環境にインストール済みでないものに関して、以下のコマンドを実行します。

・7-Zip

    > choco install 7zip.install

・Git

    > choco install git --params="/NoAutoCrlf" -y

・Kubernetes CLI

    > choco install kubernetes-cli

・OpenSSH

    > choco install openssh

・OpenSSL

    > choco install openssl.light

・Vagrant

    > choco install vagrant

インストールが済んだら、コマンドプロンプトを一旦閉じて、新たに一般ユーザーで立ち上げなおしておきます。


インストールスクリプトの取得
----------------------------

[インストールスクリプト](https://github.com/hhiroshell/coreos-kubernetes)はGitHubにあるので、適当なフォルダにCloneするか、ダウンロードします。

ホームディレクトリにcloneする場合、コマンドプロンプトを起動して以下のコマンドを実行します。

    > cd %HOMEPATH%
    > git clone https://github.com/hhiroshell/coreos-kubernetes.git


（仮想マシンと）Kubernetesクラスターの起動
------------------------------------------
Vagrantを使って仮想マシンとKubernetesクラスターを起動します。

シングルノードのクラスターを構成する場合、

    > cd %HOMEPATH%\coreos-kubernetes\single-node
    > vagrant up

マルチノードのクラスターを構成する場合、

    > cd %HOMEPATH%\coreos-kubernetes\multi-node\vagrant
    > vagrant up

マルチノードのクラスターは、デフォルトではcontroller、worker、etcd用に一台ずつ仮想マシンを起動します。
これらの数を増やしたい場合は、`config.rb.sample`ファイルを`config.rb`にリネームし、指定したいプロパティの行をコメントアウト／値変更をします。

例えば、workerを2台にしたい場合、以下のようになります。

```ruby:config.rb
#$update_channel="alpha"

#$controller_count=1
#$controller_vm_memory=512

$worker_count=2
#$worker_vm_memory=1024

#$etcd_count=1
#$etcd_vm_memory=512
```

_Note: 
`vagrant up`の初回実行時は、仮想マシン起動後にKubernetesの各種コンポーネントのインストールが行われます。
パッケージのダウンロードのために、それなりの通信量が発生するので、十分なネットワーク速度の環境で実行することをおすすめします。筆者の体感では、数十MB/sの環境で5-10分くらいはかかりました。_


Kubernetes CLIの設定
--------------------

起動したクラスターを操作するために、Kubernetes CLIを使います。ここでは、目的のクラスターに接続するための、CLIの設定を行います。

シングルノードの場合

    > kubectl config set-cluster vagrant-single-cluster --server=https://172.17.4.99:443 --certificate-authority=%cd%/ssl/ca.pem
    > kubectl config set-credentials vagrant-single-admin --certificate-authority=%cd%/ssl/ca.pem --client-key=%cd%/ssl/admin-key.pem --client-certificate=%cd%/ssl/admin.pem
    > kubectl config set-context vagrant-single --cluster=vagrant-single-cluster --user=vagrant-single-admin
    > kubectl config use-context vagrant-single

マルチノードの場合

    > kubectl config set-cluster vagrant-multi-cluster --server=https://172.17.4.101:443 --certificate-authority=%cd%\ssl\ca.pem
    > kubectl config set-credentials vagrant-multi-admin --certificate-authority=%cd%\ssl\ca.pem --client-key=%cd%\ssl\admin-key.pem --client-certificate=%cd%\ssl\admin.pem
    > kubectl config set-context vagrant-multi --cluster=vagrant-multi-cluster --user=vagrant-multi-admin
    > kubectl config use-context vagrant-multi


_Note:
Kubernetes CLIの設定情報は、デフォルトでは以下の設定ファイルに書き込まれており、これを参照して動作します。_

- _%HOMEPATH%\.kube\config_

_環境変数`KUBECONFIG`に参照したい設定ファイルのパスを指定すると、そちらを参照することもできます。[^1]_
_また現在適用されている設定情報を確認したいときは以下のコマンドを実行します。_

    > kubectl config view

[^1]: 詳細は[公式ドキュメント](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)を参照

接続確認
--------
クラスターを構成するノードを表示して、KubernetesとKubernetes CLIが動いていることを確認します。

    > kubectl get nodes
    NAME          STATUS    AGE       VERSION
    172.17.4.99   Ready     3d        v1.5.4+coreos.0


参考情報
========
この記事を書くに当たり、実際の動作確認で使用した環境は以下のとおりです。

- プラットフォーム
    * Windows 10 Pro: Version 1607(Anniversary Update)
    * VirtualBox: 5.1.22 r115126 (Qt5.6.2)
- コマンドラインツール
    * 7-Zip (install): 16.4.0.20170506
    * Git for Windows: 2.14.1
    * Kubernetes CLI: v1.7.5
    * OpenSSH: OpenSSH_7.5p1, LibreSSL 2.5.3
    * OpenSSL: OpenSSL 1.1.0f  25 May 2017
    * Vagrant: 2.0.0


脚注
====