MinikubeをHyber_v上のUbuntuのDockerで動かす

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を導入します。

~~~bash
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の導入

パッケージリポジトリを更新します。

~~~bash
sudo apt-get update
~~~

HTTPSでリポジトリにアクセスできるよう必要なパッケージを導入します。

~~~bash
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
~~~

Dockerの公式GPGキーをリポジトリに登録します。

~~~bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
~~~

安定版であるstableパッケージを取得するよう設定します。

~~~bash
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu   $(lsb_release -cs) stable"
~~~

リポジトリを更新します。

~~~bash
sudo apt-get update
~~~

Dockerを導入します。

~~~bash
sudo apt-get install docker-ce docker-ce-cli containerd.io
~~~

Dockerが正しく導入されたかどうかを確認するためにhello-worldイメージを実行します。

~~~bash
sudo docker run hello-world
~~~


##minikubeの導入

~~~bash
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
~~~

導入はこれで終わり、あっさりです。カレントディレクトリ上にminikubeというファイルができているはずです。
次の手順で実行可能にしてどこからでもパスが取る状態にしておきます。

~~~bash
chmod +x minikube
sudo cp minikube /usr/local/bin
rm minikube
~~~


##minikubeの実行

コンテナ上で実行するので、--vm-driver=noneを指定して、minikubeを実行します。

~~~bash
sudo minikube start --vm-driver=none
~~~

sudoを付けてroot権限で実行しないとpermissionエラーで止まってしまうのでご注意ください。
--vm-driver=noneを付けないで実行すると、VirtualBox（デフォルト）に対してminikubeを導入しようとするため、失敗します。


kubectlを一般ユーザで実行したいので、次のコマンドで関係ファイルのオーナーを変更しておきます。

~~~bash
sudo chown -R $USER:$GROUP ~/.kube
sudo chown -R $USER:$GROUP ~/.minikube
~~~

minikubeの稼働状況を確認します。

~~~bash
> sudo minikube status
host: Running
kubelet: Running
apiserver: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.225.5
~~~


kubectlコマンドを実行してみます。

~~~bash
kubectl get nodes
~~~

マスターノードが作動していることがわかります。

~~~bash
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を実行すると上記のエラーが出ます。

こちらのブログを参照しました。

https://medium.com/@nieldw/running-minikube-with-vm-driver-none-47de91eab84c?email=antti18%2Bmedium%40kaihola.fi&g-recaptcha-response


~~~
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!
~~~