MinikubeをWindows 10(Hyper-V)で利用する

MinikubeをWindows環境(Hyper-V)で動かす機会があったのでまとめておきます。
「k8s触ってみようかな…」という方のお役に立てば幸いです。

# 事前準備

* Windowsのライセンス確認
    * Windows 10 Homeの場合はHyper-Vが使えないので、おとなしくVirtualBoxを使ってMinikubeを動かすか、Professionalにアップグレードしてください。
* BIOSの仮想化機能(VT-X/AMD-V)を有効化
    * [参考記事](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-Troubleshooting-Enabling_Intel_VT_x_and_AMD_V_virtualization_hardware_extensions_in_BIOS.html)
* OSにHyper-Vをインストール
    * [参考記事](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)
* Windowsの「Hyper-Vプラットフォーム」を有効化
    * [参考記事](http://www.vwnet.jp/Windows/w10/Hyper-V/Enablew10Hyper-V.htm)

既にDocker for Windowsを利用している環境なら、何かする必要はないと思います。


# Hyper-Vの設定(外部ネットワーク用仮想スイッチの追加)

Hyper-V マネージャーを起動します。

* 「プログラム」>「Windows 管理ツール」>「Hyper-V マネージャー」
   * もしくは「ファイル名を指定して実行」から`virtmgmt.msc`

起動したら「仮想スイッチ マネージャー」を選択。

![0001.png](https://qiita-image-store.s3.amazonaws.com/0/50184/45539927-0302-3ddc-bc42-1a458792ba4a.png)

「新しい仮想ネットワーク スイッチ」→「外部」→「仮想スイッチの作成」として、外部ネットワーク用の仮想スイッチを追加します。

![abc.png](https://qiita-image-store.s3.amazonaws.com/0/50184/8cbf490a-a3f7-756a-9a4d-aea40545a11f.png)


Docker for Windowsを利用している場合は「DockerNAT」という名前で既に仮想スイッチが登録されているため、同じような名前にしました。赤枠のチェックを忘れずに。

![0002.png](https://qiita-image-store.s3.amazonaws.com/0/50184/7db76545-b667-0f39-ecb2-3f4a0552726f.png)



# Minikubeのインストール

[公式の手順](https://github.com/kubernetes/minikube#windows)の通りやっていけばOKです。[Chocolatey](https://chocolatey.org/packages/Minikube)も提供されていますが、ここでは基本的なやり方で。

以下のバイナリをダウンロードして、あとはPATHの通ったところに置くだけです。`minikube-windows-amd64.exe`は`minikube.exe` にリネームしておくと楽です。

* [Minikube](https://storage.googleapis.com/minikube/releases/latest/minikube-windows-amd64.exe)
* [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/#tabset-2)

今回は`C:\minikube\`以下に配置し、システム環境変数からパスを通しました。

![008.png](https://qiita-image-store.s3.amazonaws.com/0/50184/33d8edc4-4751-54df-111c-6ad9f0404820.png)


どちらもexeファイルを直接ダウンロードするため、Windowsのsmartscreenにひっかかって起動が失敗することがあります。exeファイルには、以下のようにチェックを入れておくと安心です。

![0003.png](https://qiita-image-store.s3.amazonaws.com/0/50184/24e1bf78-f7d1-1b7d-e326-4acfe872261f.png)


# 動作確認

[公式のQuickstart](https://github.com/kubernetes/minikube#quickstart)をやってみます。

コマンドプロンプトを管理者権限で起動し[(参考記事)](http://qiita.com/takuya0301/items/df6cde3bbaf9e13ef8f0)、仮想マシンドライバとして"hyperv"を指定して起動します。(無指定だとvirtualboxのドライバが利用されます)

```
c:\>minikube start --vm-driver="hyperv"
Starting local Kubernetes v1.6.4 cluster...
Starting VM...
Moving files into cluster...
Setting up certs...
Starting cluster components...
Connecting to cluster...
Setting up kubeconfig...
Kubectl is now configured to use the cluster.
```

Hyper-Vマネージャに「minikube」という名前で仮想マシンが追加されるのが確認できます。

![0005.png](https://qiita-image-store.s3.amazonaws.com/0/50184/ba95837c-8bfb-46e3-3595-982733521b89.png)


クラスタが立ち上がっているのも確認しておきます。

```
c:\>kubectl config use-context minikube
Switched to context "minikube".

c:\>kubectl cluster-info
Kubernetes master is running at https://192.168.11.222:8443

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

ここまで確認できたら、あとは[MiniqubeのQuickstart](https://github.com/kubernetes/minikube#quickstart)の通りやっていきましょう。

```
c:\>kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=8080
deployment "hello-minikube" created

c:\>kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed

c:\>kubectl get pod
NAME                             READY     STATUS    RESTARTS   AGE
hello-minikube-938614450-jl8ht   1/1       Running   0          51s

c:\>minikube service hello-minikube --url
http://192.168.11.222:32455
```

表示されたURL( http://192.168.11.222:32455 )にアクセスして、以下のようなレスポンスが表示されればOKです。

```html
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://192.168.11.222:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
accept-encoding=gzip, deflate, sdch
accept-language=ja,en-US;q=0.8,en;q=0.6
connection=keep-alive
host=192.168.11.222:32455
referer=http://google.co.jp/
upgrade-insecure-requests=1
user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
BODY:
-no body in request-
```

終了する場合は以下のような感じで。

```
// 仮想マシン停止
c:\>minikube stop
Stopping local Kubernetes cluster...
Machine stopped.

// 仮想マシン削除
c:\>minikube delete
Deleting local Kubernetes cluster...
Machine deleted.
```

[^1]: 「Error starting host:  Error creating host: Error executing step: Running precreate checks. : Hyper-v commands have to be run as an Administrator」とエラーが表示されます

お役に立てば幸いです。


# 参考

* [Setting up Kubernetes on Windows10 Laptop with Minikube – Just Cloud](https://blogs.msdn.microsoft.com/wasimbloch/2017/01/23/setting-up-kubernetes-on-windows10-laptop-with-minikube/)
* [How to run Kubernetes on local machine \(Docker for Windows\) \- The dawn of modern programmers](http://esheeps.hatenablog.com/entry/2017/03/28/132622)