初めてのkubernetes（Minikube） Windows環境構築編

# 概要

初めてのkubernetesを勉強するのにあたって、ローカルで簡易的なクラスタリングを実現するMinikubeの導入とチュートリアルについての手順などを残します
まず、第1弾としてWindows10での環境構築になります

私の環境が特殊なのかわかりませんが、環境構築時にエラーが頻発して、基本すんなりと開始、終了できません
なので、トラブルシューティングなども合わせて記録として残したいと思います

なお、この記事投稿以降に以下のように環境構築が大変便利になりましたので、Minikubeではなく以下のツールをご利用することをお勧めします！
- **Docker for Windows/Mac版にKubernetesが統合されたことにより、Minikubeの構築よりも手軽にKubernetesを構築できるようになりましたので、「[Docker for WindowsでKubernetesを試してみる](https://qiita.com/h-r-k-matsumoto/items/68f694650029ddf7351d)」を参照してください。なお、最新版のKubernetesを試したい場合は下記に従ってMinikubeを構築してください**
- Minikubeはシングルノードですが、**マルチノードで勉強したい方はコンテナをクラスターノードとして扱える公式ツールの「[kind](https://kind.sigs.k8s.io/docs/user/quick-start/)」をご利用ください**

# 実行環境

以下の環境で以降の手順を実行していきます

Windows 10 Pro + Hyper-V

# 前提条件

- **VT-x**または**AMD-v** が有効になっていること(BIOSから設定)
- **Hyper-V**が導入されていること  
  「プログラムと機能」-「Windowsの機能の有効化または無効化」でHyper-V関連の機能を有効にしましょう
   ![install-hyper-v.png](https://qiita-image-store.s3.amazonaws.com/0/30522/dd00db0c-a456-3c5e-fd25-4175042343f4.png)

# 手順

## 準備

1. 作業用のディレクトリ(minikubeとでもしましょう)を作成し、以下の作業はこのディレクトリ内で行うものとする

## kubectlのインストール

  kubernetesとのやり取りに必要なコマンドラインツールとして導入します

1. [公式手順](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-binary-via-curl)に従ってダウンロードする
![download-kubectl.exe.png](https://qiita-image-store.s3.amazonaws.com/0/30522/3fa2084a-28eb-f59c-c4bf-1e5477f269df.png)
2. 環境変数Pathに登録
3. バージョンを確認（以下のように表示されたらOK）

    ```
    > ./kubectl.exe version

    Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", 
    GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", 
    GoVersion:"go1.9.2", Compiler:"gc", Platform:"windows/amd64"}

    ```

## Minikubeのインストール

1. Minikubeをダウンロード
  [github](https://github.com/kubernetes/minikube/releases)から最新版のminikube-windows-amd64をダウンロードし、**minikube.exe**にリネームします
2. 環境変数Pathに登録

### Hyper-V用のdriverの導入

MinukubeはHyper-V上で稼働する仮想マシンにあるため、外部と通信するための仮想ネットワークスイッチが必要になります
[各種driverの導入](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md#hyperv-driver)

1.  仮想スイッチマネージャ
![hyper-v-switch-manager.png](https://qiita-image-store.s3.amazonaws.com/0/30522/f4fed208-5ead-e76c-d533-f7a5bcd5ab67.png)
2. 外部仮想スイッチを作成
![hyper-v-switch-type.png](https://qiita-image-store.s3.amazonaws.com/0/30522/33e91ff5-cb4a-8308-21a7-487fe262b348.png)
3. ネットワークアダプタを選択と共有を許可  
 ネットワークアダプタは外部と通信できる物理アダプタ名を選択しましょう  
 **仮想スイッチの名前**はMinikube起動時に使いますので、控えといてください
![hyper-v-switch-property.png](https://qiita-image-store.s3.amazonaws.com/0/30522/9e7fb944-a2df-a4e7-18fe-bcc3ca5d60e0.png)

### Minikubeの起動

1. コマンドプロンプトを**管理者モード**で起動し、以下のコマンドでHyper-VにMinikubeの仮想マシンが作成され、起動されます
`--hyperv-virtual-switch=minikube`のminikubeは前述で作成した仮想スイッチ名を入力してください

    ```
    > minikube start --vm-driver=hyperv --hyperv-virtual-switch=minikube
    ```

その他のコマンドオプション（NWスイッチの指定、メモリ、ディスクサイズ）は[こちら](https://minikube.sigs.k8s.io/docs/commands/start/)を確認してください
また、start時にエラーが発生した場合は、管理者で実行されていないか。`%HOMEPATH%\.minikube`フォルダを一度削除し、再度してみてください

2. 起動確認
   以下のように表示されればOK

    ```
    > minikube status

    minikube: Running
    cluster: Running
    kubectl: Correctly Configured: pointing to minikube-vm at 192.168.1.25
    ```

3. ダッシュボードの表示

    ```shell
    > minikube dashboard
    ```

    or

    ```shell
    > kubectl proxy

     Starting to serve on 127.0.0.1:8001
    ```
    http://localhost:8001/api/v1/namespaces/kube-system/services/http:kubernetes-dashboard:/proxy/#!/overview?namespace=default にアクセス

![minikube-dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/30522/2a296746-f199-0bd1-ac3a-ddd3699a29ca.png)

※ダッシュボードサービスがない場合は、

```shell
> kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
```

### Minikubeの停止

```
> minikube stop
```

ですんなりと止まってくれればいいですが・・・
私の環境ではHyper-V マネージャー上でずっと「シャットダウン中」となったままで、一向にショットダウンしてくれません
そんな時にはコンソールで直接ログインしてシャットダウンします（正しい方法かはわかりませんが・・・）
minikubeのデフォルトユーザ（docker）とパスワード（tcuser）でログインし、以下のコマンドでシャットダウンします
または、`minikube ssh`でログインすることができます
※個人環境に依存しますが、最新版（v1.11.0）ではスムーズにstopとstartができるようになっていることを確認しています

```
> sudo shutdown -h now
```

### Minikubeの起動パラメータを保存

前述の`minikube start xxx`では都度パラメータを付与して起動しなければならないので、デフォルト挙動を`minikube config`で設定することで、`minikube start`のみで起動できるようになります

```shell

> minikube config set vm-driver hyperv

These changes will take effect upon a minikube delete and then a minikube start

> minikube config set hyperv-virtual-switch minikube

# 設定確認
> minikube config view

- hyperv-virtual-switch: minikube
- vm-driver: hyperv
```

VMの設定を変更しているので再起動時に適用されます

# デバックコマンド

Windows版しか触ったことがないので、何とも言えないですが、すんなり起動できなかったりすることが多い
そういう時は以下のコマンドを追加して、デバックログを確認したほうが問題解決への近道になるかと思います

https://github.com/kubernetes/minikube/blob/master/docs/debugging.md

```
> minikube start --logtostderr -v 7

--v=0 INFO level logs
--v=1 WARNING level logs
--v=2 ERROR level logs
--v=3 libmachine logging
--v=7 libmachine --debug level logging
```

# トラブルシューティング

## E0326エラー

管理者モードでコマンドプロンプトを実行しない


## E0325エラー

すでにminikubeが存在していると下記のようなエラーが表示される
Hyper-Vマネージャーから「minikube」を削除するとこのようなエラーが発生します

```
Starting VM...
E0325 19:03:39.838220   14056 start.go:159] Error starting host: Error starting stopped host: exit status 1.

 Retrying.
E0325 19:03:39.842720   14056 start.go:165] Error starting host:  Error starting stopped host: exit status 1
```

### 対策

一度削除しましょう（消しても問題ないなら）

```
> minikube delete
```

## The system cannot find the path specified

`minikube start`時にISOファイルから仮想マシンを作成するが、ISOをロードしようとしているパス（/Users/user）が存在していないことから以下のようなエラーになります（バグ？）

```
/Users/user/.minikube/cache/iso/minikube-v0.25.1.iso: The system cannot find the path specified
```

### 対策

`.minikube`までのパスを`MINIKUBE_HOME`という環境変数を設定してあげましょう
**※設定後マシンの再起動を忘れずに**

例）

```
MINIKUBE_HOME=C:\Users\user\.minikube
```


## メモリエラー

Hyper-Vが割り当てるメモリーが使用できるメモリーの上限を超えた時にエラーが発生します

### 対策

1. minikubeを停止

    ```powershell:powershell
    > minikube stop
    ```
    ![minikube-config.png](https://qiita-image-store.s3.amazonaws.com/0/30522/44de8de6-fdab-f089-86c4-032548d347fe.png)

2. 動的メモリをオフにします
    ![minikube-dynamic-memory-off.png](https://qiita-image-store.s3.amazonaws.com/0/30522/41bab761-1c88-af76-af16-22a5b79c6a12.png)

## minikube start時に「getting kubeadm bootstrapper: getting ssh client: Error dialing tcp via ssh client: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain」

minikubeのISOイメージやキャッシュなどが古い可能性があります

### 対策

1. 既存のminikubeの削除
  
    ```powershell:powershell
    > minikube delete
    ```
2. `c:/Users/ユーザ名/.minikube/`を削除
3. 再度`minikube start`を実行

## panic runtime error invalid memory address or nil pointer dereference kubernetes

%HOME%/.minikubeディレクトリがないによるエラーと思われる

### 対策

1. %HOME%/.minikubeディレクトリを作成
2. 上記の環境変数の設定が正しくされていることを確認し、必要に応じて再設定してください
3. コンソールの再起動やマシンの再起動を忘れずに！

## E0920 Temporary Error: provisioning: error getting ssh client: Error dialing tcp via ssh client: ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

Kubernetesクラスターにアクセスするための証明書がない
以前はそんなエラーは出ていなかったが・・・

### 対策

1. %HOME%/.minikube/に**key.pem**、**cert.pem**があることを確認
2. 以下のコマンドでstart時に使用する鍵を明示的に指定します

```
> kubectl config set-credentials minikube --client-certificate=/Users/ユーザ名/.minikube/cert.pem --cl
ient-key=/Users/ユーザ名/.minikube/key.pem
```
3. `minikube start`を再実行

##  Error loading host from store: open xxxxxxxx/config.json

minikubeの設定ファイルがなにかの理由で消えた場合

### 対策

minikubeを削除してもいい場合、

1. %HOME%/.minikubeを削除する
2. `minikube delete` → `minikube start` を再実行

自前でconfig.jsonを作成
手元のサンプル

```json:config.json
{
    "ConfigVersion": 3,
    "Driver": {
        "IPAddress": "192.168.1.43",
        "MachineName": "minikube",
        "SSHUser": "docker",
        "SSHPort": 22,
        "SSHKeyPath": "C:\\Users\\user\\.minikube\\machines\\minikube\\id_rsa",
        "StorePath": "C:\\Users\\user\\.minikube",
        "SwarmMaster": false,
        "SwarmHost": "",
        "SwarmDiscovery": "",
        "Boot2DockerURL": "file://C:/Users/user/.minikube/cache/iso/minikube-v0.28.0.iso",
        "VSwitch": "external-switch",
        "DiskSize": 20000,
        "MemSize": 2048,
        "CPU": 2,
        "MacAddr": "",
        "VLanID": 0
    },
    "DriverName": "hyperv",
    "HostOptions": {
        "Driver": "",
        "Memory": 0,
        "Disk": 0,
        "EngineOptions": {
            "ArbitraryFlags": null,
            "Dns": null,
            "GraphDir": "",
            "Env": null,
            "Ipv6": false,
            "InsecureRegistry": [
                "10.96.0.0/12"
            ],
            "Labels": null,
            "LogLevel": "",
            "StorageDriver": "",
            "SelinuxEnabled": false,
            "TlsVerify": false,
            "RegistryMirror": null,
            "InstallURL": ""
        },
        "SwarmOptions": {
            "IsSwarm": false,
            "Address": "",
            "Discovery": "",
            "Agent": false,
            "Master": false,
            "Host": "",
            "Image": "",
            "Strategy": "",
            "Heartbeat": 0,
            "Overcommit": 0,
            "ArbitraryFlags": null,
            "ArbitraryJoinFlags": null,
            "Env": null,
            "IsExperimental": false
        },
        "AuthOptions": {
            "CertDir": "C:\\Users\\user\\.minikube",
            "CaCertPath": "C:\\Users\\user\\.minikube\\certs\\ca.pem",
            "CaPrivateKeyPath": "C:\\Users\\user\\.minikube\\certs\\ca-key.pem",
            "CaCertRemotePath": "",
            "ServerCertPath": "C:\\Users\\user\\.minikube\\machines\\server.pem",
            "ServerKeyPath": "C:\\Users\\user\\.minikube\\machines\\server-key.pem",
            "ClientKeyPath": "C:\\Users\\user\\.minikube\\certs\\key.pem",
            "ServerCertRemotePath": "",
            "ServerKeyRemotePath": "",
            "ClientCertPath": "C:\\Users\\user\\.minikube\\certs\\cert.pem",
            "ServerCertSANs": null,
            "StorePath": "C:\\Users\\user\\.minikube"
        }
    },
    "Name": "minikube"
}
```


##  E0918 start.go:174] Error starting host: Error creating host: Error executing step: Running precreate checks. exit status 1.

Minikubeを新規作成時にMinikubeのISOまではダウンロードされるが、その後は上記のエラーで進まなくなる問題
原因は不明ですが、デバックログで以下のようなエラーが表示されていました
一部文字化けしていますが、`Get-Unique`がない？ようなエラーが表示されます・・・
このエラーが発生するきっかけは明確にはわかりませんが、もしかしたらWindows Creators Updateしたから？かもしれない

※Minikubeが存在する場合は、このエラーは発生しません

```powershell:powershell
> minikube start --vm-driver=hyperv --hyperv-virtual-switch=minikube --logtostderr -v 7

I0918 18:01:00.515937   13276 notify.go:121] Checking for updates...
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
I0918 18:01:00.625852   13276 cluster.go:69] Machine does not exist... provisioning new machine
I0918 18:01:00.629938   13276 cluster.go:70] Provisioning machine with config: {MinikubeISO:https://storage.googleapis.com/minikube/iso/minikube-v0.28.1.iso Memory:2048 CPUs:2 DiskSize:20000 VMDriver:hyperv HyperkitVpnKitSock: HyperkitVSockPorts:[] XhyveDiskDriver:ahci-hd DockerEnv:[] InsecureRegistry:[] RegistryMirror:[] HostOnlyCIDR:192.168.99.1/24 HypervVirtualSwitch:minikube-switch KvmNetwork:default Downloader:{} DockerOpt:[] DisableDriverMounts:false NFSShare:[] NFSSharesRoot:/nfsshares UUID: GPU:false}
I0918 18:01:00.630854   13276 downloader.go:56] Not caching ISO, using https://storage.googleapis.com/minikube/iso/minikube-v0.28.1.iso
Reading certificate data from C:\Users\xxx\.minikube\certs\ca.pem
Decoding PEM data...
Parsing certificate...
Reading certificate data from C:\Users\xxx\.minikube\certs\cert.pem
Decoding PEM data...
Parsing certificate...
[executing ==>] : C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -NonInteractive @(Get-Module -ListAvailable hyper-v).Name | Get-Unique
[stdout =====>] :
[stderr =====>] : Get-Unique : 'Get-Unique' �R�}���h�̓��W���[�� 'Microsoft.PowerShell.Utility' �Ō����� �܂������A���̃��W���[�����ǂݍ���
���Ƃ��ł��܂����ł����B�ڍׂɂ��ẮA'Import-Module Microsoft.PowerShell.Utility' �����s���Ă��������B
�����ꏊ �s:1 ����:45
+ @(Get-Module -ListAvailable hyper-v).Name | Get-Unique
+                                             ~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-Unique:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CouldNotAutoloadMatchingModule


E0918 18:01:03.097464   13276 start.go:174] Error starting host: Error creating host: Error executing step: Running precreate checks.
: exit status 1.

 Retrying.
E0918 18:01:03.097464   13276 start.go:180] Error starting host:  Error creating host: Error executing step: Running precreate checks.
: exit status 1

```

### 対策

powershellで`minikube start`するのではなく、**コマンドプロンプトを管理者権限**で実行することで問題なく、起動できました

## Kubernetes x.xx.x is not supported by this release of minikube

minikube.exeを差し替えて環境再作成しようとした時に、過去に作成したminikube環境が古くなっていると以下のようなエラーが表示されます

```
* minikube v1.8.2 on Microsoft Windows 10 Pro 10.0.18363 Build 18363
  - MINIKUBE_HOME=C:\Users\user\.minikube
* Using the hyperv driver based on user configuration
! Specified Kubernetes version 1.10.0 is less than the oldest supported version: v1.11.10
X Sorry, Kubernetes 1.10.0 is not supported by this release of minikube
```

### 対策

- `~/.minikube`のディレクトリを削除する。仮想マシンも削除（過去の実行環境や永続化していないデータはすべて削除されるのでご注意ください）
- 旧版のminikube.exeを使用する