初心者
Hyper-V
kubernetes
minikube

初めてのkubernetes(Minikube) Windows環境構築編

概要

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

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

実行環境

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

Windows 10 Pro + Hyper-V

前提条件

  • VT-xまたはAMD-v が有効になっていること(BIOSから設定)
  • Hyper-Vが導入されていること
    「プログラムと機能」-「Windowsの機能の有効化または無効化」でHyper-V関連の機能を有効にしましょう install-hyper-v.png

手順

準備

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

kubectlのインストール

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

  1. 公式手順に従ってダウンロードする download-kubectl.exe.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から最新版のminikube-windows-amd64をダウンロードし、minikube.exeにリネームします
  2. 環境変数Pathに登録

Hyper-V用のdriverの導入

MinukubeはHyper-V上で稼働する仮想マシンにあるため、外部と通信するための仮想ネットワークスイッチが必要になります
各種driverの導入

  1. 仮想スイッチマネージャ hyper-v-switch-manager.png
  2. 外部仮想スイッチを作成 hyper-v-switch-type.png
  3. ネットワークアダプタを選択と共有を許可
    ネットワークアダプタは外部と通信できる物理アダプタ名を選択しましょう
    仮想スイッチの名前はMinikube起動時に使いますので、控えといてください hyper-v-switch-property.png

Minikubeの起動

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

    > minikube start --vm-driver=hyperv --hyperv-virtual-switch=minikube
    
  2. 起動確認
    以下のように表示されればOK

    > minikube status
    
    minikube: Running
    cluster: Running
    kubectl: Correctly Configured: pointing to minikube-vm at 192.168.1.25
    
  3. ダッシュボードの表示

    > minikube dashboard
    

    or

    > 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

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

> 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でログインすることができます

> sudo shutdown -h now

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

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

> 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
    > minikube stop
    

    minikube-config.png

  2. 動的メモリをオフにします
    minikube-dynamic-memory-off.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
    > 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.pemcert.pemがあることを確認
  2. 以下のコマンドでstart時に使用する鍵を明示的に指定します
> kubectl config set-credentials minikube --client-certificate=/Users/ユーザ名/.minikube/cert.pem --cl
ient-key=/Users/ユーザ名/.minikube/key.pem
  1. minikube startを再実行

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

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

対策

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

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

自前でconfig.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
> 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するのではなく、コマンドプロンプトを管理者権限で実行することで問題なく、起動できました