概要
初めてのkubernetesを勉強するのにあたって、ローカルで簡易的なクラスタリングを実現するMinikubeの導入とチュートリアルについての手順などを残します
まず、第1弾としてWindows10での環境構築になります
私の環境が特殊なのかわかりませんが、環境構築時にエラーが頻発して、基本すんなりと開始、終了できません
なので、トラブルシューティングなども合わせて記録として残したいと思います
なお、この記事投稿以降に以下のように環境構築が大変便利になりましたので、Minikubeではなく以下のツールをご利用することをお勧めします!
- Docker for Windows/Mac版にKubernetesが統合されたことにより、Minikubeの構築よりも手軽にKubernetesを構築できるようになりましたので、「Docker for WindowsでKubernetesを試してみる」を参照してください。なお、最新版のKubernetesを試したい場合は下記に従ってMinikubeを構築してください
- Minikubeはシングルノードですが、マルチノードで勉強したい方はコンテナをクラスターノードとして扱える公式ツールの「kind」をご利用ください
実行環境
以下の環境で以降の手順を実行していきます
Windows 10 Pro + Hyper-V
前提条件
- VT-xまたはAMD-v が有効になっていること(BIOSから設定)
-
Hyper-Vが導入されていること
「プログラムと機能」-「Windowsの機能の有効化または無効化」でHyper-V関連の機能を有効にしましょう
手順
準備
- 作業用のディレクトリ(minikubeとでもしましょう)を作成し、以下の作業はこのディレクトリ内で行うものとする
kubectlのインストール
kubernetesとのやり取りに必要なコマンドラインツールとして導入します
-
公式手順に従ってダウンロードする
-
環境変数Pathに登録
-
バージョンを確認(以下のように表示されたら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のインストール
- Minikubeをダウンロード
githubから最新版のminikube-windows-amd64をダウンロードし、minikube.exeにリネームします - 環境変数Pathに登録
Hyper-V用のdriverの導入
MinukubeはHyper-V上で稼働する仮想マシンにあるため、外部と通信するための仮想ネットワークスイッチが必要になります
各種driverの導入
- 仮想スイッチマネージャ
- 外部仮想スイッチを作成
- ネットワークアダプタを選択と共有を許可
ネットワークアダプタは外部と通信できる物理アダプタ名を選択しましょう
仮想スイッチの名前はMinikube起動時に使いますので、控えといてください
Minikubeの起動
-
コマンドプロンプトを管理者モードで起動し、以下のコマンドでHyper-VにMinikubeの仮想マシンが作成され、起動されます
--hyperv-virtual-switch=minikube
のminikubeは前述で作成した仮想スイッチ名を入力してください> minikube start --vm-driver=hyperv --hyperv-virtual-switch=minikube
その他のコマンドオプション(NWスイッチの指定、メモリ、ディスクサイズ)はこちらを確認してください
また、start時にエラーが発生した場合は、管理者で実行されていないか。%HOMEPATH%\.minikube
フォルダを一度削除し、再度してみてください
-
起動確認
以下のように表示されればOK> minikube status minikube: Running cluster: Running kubectl: Correctly Configured: pointing to minikube-vm at 192.168.1.25
-
ダッシュボードの表示
> minikube dashboard
or
> kubectl proxy Starting to serve on 127.0.0.1:8001
※ダッシュボードサービスがない場合は、
> 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
のみで起動できるようになります
> 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版しか触ったことがないので、何とも言えないですが、すんなり起動できなかったりすることが多い
そういう時は以下のコマンドを追加して、デバックログを確認したほうが問題解決への近道になるかと思います
> 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が割り当てるメモリーが使用できるメモリーの上限を超えた時にエラーが発生します
対策
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イメージやキャッシュなどが古い可能性があります
対策
-
既存のminikubeの削除
powershell> minikube delete
-
c:/Users/ユーザ名/.minikube/
を削除 -
再度
minikube start
を実行
panic runtime error invalid memory address or nil pointer dereference kubernetes
%HOME%/.minikubeディレクトリがないによるエラーと思われる
対策
- %HOME%/.minikubeディレクトリを作成
- 上記の環境変数の設定が正しくされていることを確認し、必要に応じて再設定してください
- コンソールの再起動やマシンの再起動を忘れずに!
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クラスターにアクセスするための証明書がない
以前はそんなエラーは出ていなかったが・・・
対策
- %HOME%/.minikube/にkey.pem、cert.pemがあることを確認
- 以下のコマンドでstart時に使用する鍵を明示的に指定します
> kubectl config set-credentials minikube --client-certificate=/Users/ユーザ名/.minikube/cert.pem --cl
ient-key=/Users/ユーザ名/.minikube/key.pem
-
minikube start
を再実行
Error loading host from store: open xxxxxxxx/config.json
minikubeの設定ファイルがなにかの理由で消えた場合
対策
minikubeを削除してもいい場合、
- %HOME%/.minikubeを削除する
-
minikube delete
→minikube start
を再実行
自前で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が存在する場合は、このエラーは発生しません
> 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を使用する