Hyper-VでMinikubeを動かす

自宅のPC（Windows10）で Hyper-V で Minikube を動かす機会あったのでそれの備忘録的なやつです。

# 事前準備
Minikube を動かすにあたって事前準備を行います。
ここでは Hyper-V の有効化方法などは紹介しないので、まだ有効化していない方は他の記事などを参照して有効化してください。

## 仮想スイッチ作成
Minikube で使用する Hyper-V の外部仮想スイッチを作成します。
既に外部仮想スイッチを作成している場合は、ここはスキップしてください。
**ただし、「仮想スイッチのプロパティ」の「接続の種類」で「管理オペレーティングシステムにこのネットワークアダプターの共有を許可する」にチェックが入っているか確認してください。入っていない場合は入れて適用してください。**

「Hyper-V マネージャー」を起動し、右メニューの「仮想スイッチ マネージャー」を開いてください。
次に「新しい仮想ネットワーク スイッチ」=>「外部」を選択し仮想スイッチを作成してください。
仮想スイッチの名前は適当に決めてください。ここで付けた名前は Minikube を起動させる際に必要になります。
そして「接続の種類」の「管理オペレーティングシステムにこのネットワークアダプターの共有を許可する」にチェックを入れて適用してください。

### 余談
私の環境では既に外部仮想スイッチを作成していましたが（いつ何のために作ったのかは不明）、ネットワーク構成がおかしなことになっており、 Minikube を起動する際の処理（SSH で Minikube のVMに接続してコマンドを流す処理）でエラーとなってしまいました。
（`ipconfig`で確認したら、外部仮想スイッチにバインドさせていた物理NICにLANのIPアドレスが割り当てられており、外部仮想スイッチにはDHCPより正常にIPアドレスが割り当てられていない、という状態でした）
外部仮想スイッチを再作成したら直りましたが、なんでこんなことになっていたのかは不明です。。。

## Minikube インストール
[kubernetes/minikube](https://github.com/kubernetes/minikube/releases "minikube")
ここより Minikube (Windows/amd64) をダウンロードして適当な場所に配置してください（必要ならPATHも通しておく）。
この時`minikube-windows-amd64.exe`という名前でダウンロードされるので、`minikube.exe`にリネームしておきます。
私は`C:\Apps\kubernetes\minikube.exe`に配置してPATHを通しています。

## kubectl インストール
[Install and Set Up kubectl (kubernetes公式)](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl)
ここより kubectl.exe をダウンロードして適当な場所に配置してください（必要ならPATHも通しておく）。
私は`C:\Apps\kubernetes\kubectl.exe`に配置してPATHを通しています。
Google Cloud SDK をインストールされている方で、既に kubectl をインストールしている場合はここはスキップしても大丈夫です。

# Minikube 起動
それでは Minikube を起動させます。
ここからは PowerShell を使用します。
まずは利用可能な Kubernetes のバージョンを確認します。

```ps1
PS C:\Users\hoge> minikube get-k8s-versions
The following Kubernetes versions are available:
        - v1.7.0
        - v1.7.0-rc.1
        - v1.7.0-alpha.2
        - v1.6.4
        - v1.6.3
        - v1.6.0
        - v1.6.0-rc.1
        - v1.6.0-beta.4
        - v1.6.0-beta.3
        - v1.6.0-beta.2
        - v1.6.0-alpha.1
        - v1.6.0-alpha.0
        - v1.5.3
        - v1.5.2
        - v1.5.1
        - v1.4.5
        - v1.4.3
        - v1.4.2
        - v1.4.1
        - v1.4.0
        - v1.3.7
        - v1.3.6
        - v1.3.5
        - v1.3.4
        - v1.3.3
        - v1.3.0
```

ここでは v1.7.0 を使うことにします。
では Minikube を起動させます。
Kubernetes のバージョンは 1.7.0 を使用しVMドライバには Hyper-V を、VMにCPUを4、メモリを4G割り当てています。
また、ログ出力レベルを7に設定して詳細なログを表示させています。
（各フラグの詳細が知りたい場合は`minikube.exe start --help`を実行してください）

```ps1
PS C:\Users\hoge> minikube start --kubernetes-version="v1.7.0" --vm-driver="hyperv" --cpus=4 --memory=4096 --hyperv-virtual-switch="作成した外部仮想スイッチ名" --v=7 --alsologtostderr
```

初めて起動する場合はVMの作成が入るので、それなりに時間がかかります。
起動が完了した場合は以下のメッセージが表示されます。

```ps1
Setting up kubeconfig...
I0715 22:22:33.742667   15444 config.go:75] Using kubeconfig:  C:\Users\hoge/.kube/config
Kubectl is now configured to use the cluster.
```

Minikube の状態を確認してみましょう。

```ps1
PS C:\Users\hoge> minikube status
minikube: Running
localkube: Running
kubectl: Correctly Configured: pointing to minikube-vm at <ここにVMのIPアドレスが表示されます>
```

次に Kubernetes のクラスタ情報を取得してみましょう。
取得する際に`error: couldn't read version from server:`とエラーが出たら、

```ps1
PS C:\Users\hoge> kubectl config set-context minikube
```

を実行してコンテキストを設定しましょう。

```ps1
PS C:\Users\hoge> kubectl cluster-info
Kubernetes master is running at https://<VMのIPアドレス>:8443

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

これでローカルに Kubernetes が起動しました。
あとは kubectl を通して Kubernetes を操作できます。

```ps1
PS C:\Users\hoge> kubectl run hello-minikube --image=gcr.io/google_containers/echoserver:1.4 --port=8080
deployment "hello-minikube" created
PS C:\Users\hoge> kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed
PS C:\Users\hoge> kubectl get pod
NAME                             READY     STATUS    RESTARTS   AGE
hello-minikube-180744149-tb548   1/1       Running   0          56s
PS C:\Users\hoge> Invoke-RestMethod -Uri $(minikube service hello-minikube --url)
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://<VMのIPアドレス>:8080/

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

HEADERS RECEIVED:
host=192.168.11.16:31979
user-agent=Mozilla/5.0 (Windows NT; Windows NT 10.0; ja-JP) WindowsPowerShell/5.1.15063.483
BODY:
-no body in request-
PS C:\Users\hoge> 
```

# Kubernetes ダッシュボード
Kubernetes のダッシュボードにアクセスしたい場合は以下のコマンドを実行すれば、ブラウザが開いてダッシュボードにアクセスできます。

```ps1
PS C:\Users\hoge> minikube dashboard
```

# Minikube 停止・削除
Minikube を停止させる場合は以下のコマンドで停止できます。

```ps1
PS C:\Users\hoge> minikube stop
```

作成されたVM（クラスタ）を削除したい場合は以下のコマンドで削除できます。

```ps1
PS C:\Users\hoge> minikube delete
```

# その他
何度か起動処理中に処理が止まって、強制終了させることがありました。
そのあと再び`minikube start`を実行したらエラーとなり、起動させることができませんでした。
その時に、以下の手順を踏んで関連するファイルを削除したら、正常に実行できるようになりました。

1. 作成されたVM「minikube」を削除（起動中の場合はシャットダウンさせた後に削除）
1. `%HOMEPATH%\.minikube` フォルダを削除

ちなみに`%HOMEPATH%\.minikube`には、ISOのキャッシュやVM関連のファイルなどが保存されています。

# 参考
[Setting up Kubernetes on Windows10 Laptop with Minikube](https://blogs.msdn.microsoft.com/wasimbloch/2017/01/23/setting-up-kubernetes-on-windows10-laptop-with-minikube/ "Setting up Kubernetes on Windows10 Laptop with Minikube") (Microsoft Developer)
[kubernetes/minikube](https://github.com/kubernetes/minikube "kubernetes/minikube") (Github)