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

トラブルシューティング

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. コンソールの再起動やマシンの再起動を忘れずに!

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"
}