Kubernetesのお試し環境であるminikubeを動かしてみたくなって、Windows PC(Surface PRO LTE Advanced)のHyper_vにUbuntuを入れて、Ubuntuホスト(Windowsから見たらゲストですが)上のDockerでminikubeを動かしてみました。
Hyper_vの上でUbuntuを入れなくても、minikubeをインストールできます。この場合はHyper_v上にminikubeの仮想マシンが自動的に構築されます。ただ、この方式ですと、kubectlなどの操作をDOSプロンプト、ないしはPowerShellから実行しなければなりません。Linuxの操作に慣れているので、今回はUbuntuを入れて、その中でDocker上にminikubeを導入する方法を選択しました。
#環境
PC OS : Windows10 Enterprise Edition
PC Hypervisor : Windows10に同梱されているHyper_v
Guest OS : Ubuntu 18.04.1 LTS(Hyper_vのクイック作成でメニューに出てくるイメージ)
#手順
##Hyper_vの導入
マイクロソフト社のオフィシャルサイトの手順に沿って、Hyper_vを有効化します。
https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v
##Ubuntu仮想マシンの作成
同じく、以下のサイトの手順に沿って、Ubuntu仮想マシンを作成します。
https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/quick-create-virtual-machine
##kubectlの導入
Ubuntu仮想マシンを起動し、コンソールにログインします。
以下の手順はすべて、Ubuntu仮想マシン上での操作です。
kubernetesクラスタを操作するためにCLIであるkubectlを導入します。
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
##Dockerの導入
パッケージリポジトリを更新します。
sudo apt-get update
HTTPSでリポジトリにアクセスできるよう必要なパッケージを導入します。
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
Dockerの公式GPGキーをリポジトリに登録します。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
安定版であるstableパッケージを取得するよう設定します。
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
リポジトリを更新します。
sudo apt-get update
Dockerを導入します。
sudo apt-get install docker-ce docker-ce-cli containerd.io
Dockerが正しく導入されたかどうかを確認するためにhello-worldイメージを実行します。
sudo docker run hello-world
##minikubeの導入
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
導入はこれで終わり、あっさりです。カレントディレクトリ上にminikubeというファイルができているはずです。
次の手順で実行可能にしてどこからでもパスが取る状態にしておきます。
chmod +x minikube
sudo cp minikube /usr/local/bin
rm minikube
##minikubeの実行
コンテナ上で実行するので、--vm-driver=noneを指定して、minikubeを実行します。
sudo minikube start --vm-driver=none
sudoを付けてroot権限で実行しないとpermissionエラーで止まってしまうのでご注意ください。
--vm-driver=noneを付けないで実行すると、VirtualBox(デフォルト)に対してminikubeを導入しようとするため、失敗します。
kubectlを一般ユーザで実行したいので、次のコマンドで関係ファイルのオーナーを変更しておきます。
sudo chown -R $USER:$GROUP ~/.kube
sudo chown -R $USER:$GROUP ~/.minikube
minikubeの稼働状況を確認します。
> sudo minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.225.5
kubectlコマンドを実行してみます。
kubectl get nodes
マスターノードが作動していることがわかります。
NAME STATUS ROLES AGE VERSION
minikube Ready master 5m41s v1.14.0
#トラブルシューティング
Unable to load cached images: loading cached images: loading image /home/matsuo/.minikube/cache/images/k8s.gcr.io/pause_3.1: Docker load /tmp/pause_3.1: running command: docker load -i /tmp/pause_3.1: exit status 1
Failed to update cluster: downloading binaries: copy: error creating file at /usr/bin/kubeadm: open /usr/bin/kubeadm: permission denied
sudoを付けずにminikubeを実行すると上記のエラーが出ます。
こちらのブログを参照しました。
Waiting for pods: apiserver proxy
Error restarting cluster: wait: waiting for k8s-app=kube-proxy: timed out waiting for the condition
Sorry that minikube crashed. If this was unexpected, we would love to hear from you:
https://github.com/kubernetes/minikube/issues/new
Problems detected in "kube-addon-manager":
error: unable to recognize "STDIN": Get https://localhost:8443/api?timeout=32s: dial tcp 127.0.0.1:8443: connect: connection refused
error: no objects passed to apply
error: no objects passed to apply
こんなエラーや、
Waiting for pods: apiserver proxy
Error restarting cluster: wait: waiting for k8s-app=kube-proxy: timed out waiting for the condition
Sorry that minikube crashed. If this was unexpected, we would love to hear from you:
https://github.com/kubernetes/minikube/issues/new
Problems detected in "kube-addon-manager":
error: no objects passed to apply
error: no objects passed to apply
error: no objects passed to apply
こんなエラーが出たら、始めからやり直した方が無難です。
2019/04/03 18:23:23 Unable to read "/home/matsuo/.docker/config.json": open /home/matsuo/.docker/config.json: no such file or directory
2019/04/03 18:23:23 No matching credentials were found, falling back on anonymous
このエラーは気にしなくてもいいみたいです。
> sudo minikube status
NAME STATUS ROLES AGE VERSION
minikube Ready <none> 70m v1.14.0
上記のようにROLESが<none>の場合は起動に失敗している可能性が高いです。やり直した方が良いでしょう。
#minikube起動に失敗した場合
minikube起動に失敗した場合は、一度リセットするとよいです。
sudo minikube stop
sudo minikube delete
sudo rm -rm ~/.minikube
sudo rm -rm ~/.kube
sudo minikube start --vm-driver=none
起動が成功すると下記のようなメッセージが出ます。これ以外のエラーが出る場合は、一度リセットしてから、再度minikube実行をしてみましょう。
"minikube" IP address is 192.168.225.5
Configuring Docker as the container runtime ...
Version of container runtime is 18.09.4
⌛ Waiting for image downloads to complete ...
✨ Preparing Kubernetes environment ...
Downloading kubeadm v1.14.0
Downloading kubelet v1.14.0
Pulling images required by Kubernetes v1.14.0 ...
Launching Kubernetes v1.14.0 using kubeadm ...
⌛ Waiting for pods: apiserver proxy etcd scheduler controller dns
Configuring cluster permissions ...
樂 Verifying component health .....
魯 Configuring local host environment ...
⚠️ The 'none' driver provides limited isolation and may reduce system security and reliability.
⚠️ For more information, see:
https://github.com/kubernetes/minikube/blob/master/docs/vmdriver-none.md
⚠️ kubectl and minikube configuration will be stored in /home/matsuo
⚠️ To use kubectl or minikube commands as your own user, you may
⚠️ need to relocate them. For example, to overwrite your own settings:
▪ sudo mv /home/matsuo/.kube /home/matsuo/.minikube $HOME
▪ sudo chown -R $USER $HOME/.kube $HOME/.minikube
This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true
kubectl is now configured to use "minikube"
Done! Thank you for using minikube!