WSL2でhello-minikubeできるようになるまでが長かったのでメモしておく。
前提
- WSL2に使うゲストOSはUbunts 20.04
- DockerはWSL2のゲストOSにインストールする
- ホスト(Windows)の方にはあんまり開発ツールとか入れたくないんだよなぁ・・・
普通にインストール
Ubuntu用のDockerをインストールする。
Post-installationに書いてあるとおり、dockerを一般ユーザーでも実行できるようにする。
続いてkubectlとminikubeを入れる。
実行する
クイックスタートの通りにやってみる。
ただし、WSLでは仮想化ツールが使えないので、
minikube実行時に --driver=none
を指定してゲストOSのDocker上に直接Kubernetesを構築する。
なお、Insider Preview版のWSL2には nestedVisualization
というオプションがあり、
これを有効にすればゲストOSでvmxやsmvが有効となり、
QEMUなどの仮想化ソフトをインストールして使えるので --driver=docker
を指定しても良いかもしれない。
もしくは、素直にDocker Desktop for WindowsをインストールしてそのままKubernetesのオプションを利用するか。
エラーI: GUEST_MISSING_CONNTRACK
が出る
$ sudo minikube start --driver=none 😄 minikube v1.17.1 on Ubuntu 20.04 ✨ Using the none driver based on user configuration ❌ Exiting due to GUEST_MISSING_CONNTRACK: Sorry, Kubernetes 1.20.2 requires conntrack to be installed in root's path
conntrackが必要らしいのでインストールする。
$ sudo apt install conntrack
エラーII: Failed to connect to bus: Host is down
がでる
$ sudo minikube start --driver=none 😄 minikube v1.17.1 on Ubuntu 20.04 ✨ Using the none driver based on user configuration 👍 Starting control plane node minikube in cluster minikube 🤹 Running on localhost (CPUs=8, Memory=25329MB, Disk=257006MB) ... ℹ️ OS release is Ubuntu 20.04.1 LTS ❌ Exiting due to RUNTIME_ENABLE: sudo systemctl daemon-reload: exit status 1 stdout: stderr: System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
WSL2はsystemdがPID=1で起動しない仕様らしく、 ツールを使ってsystemdをPID=1で起動させる必要がある模様。
このサイトの通りWSL2でsystemdが起動するようにする。
エラーIII: Waiting for systemd...!!!!!
が終わらない
ここによると、起動に失敗するプロセスがあると止まってしまう。
WSLではmultipathdとsystemd-remount-fsが起動できないため無効にしておく。 なぜかSSHも起動できなくなっていたため、再インストールした。
$ sudo systemctl disable multipathd.service $ sudo systemctl disable multipathd.socket $ sudo systemctl mask systemd-remount-fs.service $ sudo apt purge openssh-server $ sudo apt install openssh-server
エラーVI: kubectl
を一般ユーザーで実行するとエラーになってしまう
非sudoユーザーで実行するオプションを環境変数を設定して minikube start
すれば良い。
$ export MINIKUBE_WANTUPDATENOTIFICATION=false $ export MINIKUBE_WANTREPORTERRORPROMPT=false $ export MINIKUBE_HOME=$HOME $ export CHANGE_MINIKUBE_NONE_USER=true $ mkdir $HOME/.kube || true $ touch $HOME/.kube/config $ export KUBECONFIG=$HOME/.kube/config $ sudo -E minikube start
できた
$ sudo minikube start --driver=none 😄 minikube v1.17.1 on Ubuntu 20.04 ✨ Using the none driver based on existing profile 👍 Starting control plane node minikube in cluster minikube 🔄 Restarting existing none bare metal machine for "minikube" ... ℹ️ OS release is Ubuntu 20.04.1 LTS 🐳 Preparing Kubernetes v1.20.2 on Docker 20.10.3 ... ▪ kubelet.resolv-conf=/run/systemd/resolve/resolv.conf > kubeadm.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s > kubectl.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s > kubelet.sha256: 64 B / 64 B [--------------------------] 100.00% ? p/s 0s > kubeadm: 37.40 MiB / 37.40 MiB [---------------] 100.00% 30.98 MiB p/s 1s > kubectl: 38.37 MiB / 38.37 MiB [---------------] 100.00% 14.88 MiB p/s 3s > kubelet: 108.73 MiB / 108.73 MiB [-------------] 100.00% 20.71 MiB p/s 5s ▪ Generating certificates and keys ... ▪ Booting up control plane ... ▪ Configuring RBAC rules ... 🤹 Configuring local host environment ... ❗ The 'none' driver is designed for experts who need to integrate with an existing VM 💡 Most users should use the newer 'docker' driver instead, which does not require root! 📘 For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/ ❗ kubectl and minikube configuration will be stored in /root ❗ To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run: ▪ sudo mv /root/.kube /root/.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 🔎 Verifying Kubernetes components... 🌟 Enabled addons: storage-provisioner, default-storageclass 🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default --- $ curl $(minikube service hello-minikube --url) Hostname: hello-minikube-5d9b964bfb-ww7m2 Pod Information: -no pod information available- Server values: server_version=nginx: 1.13.3 - lua: 10008 Request Information: client_address=x.x.x.x method=GET real path=/ query= request_version=1.1 request_scheme=http request_uri=http://x.x.x.x:8080/ Request Headers: accept=*/* host=x.x.x.x:32171 user-agent=curl/7.68.0 Request Body: -no body in request-
※ IPアドレスは伏せました m( )m
おまけ
Kubernetesを構成する要素
Kubernetesにはいろいろな概念があって難しい。
名称 | 役割 | 現実世界に例えると |
---|---|---|
Container | 1つの役割を実現するもの*1 | テレビ、冷蔵庫、など |
Pod | 1つまたは複数のContainerが協調して1つの機能性を持つ環境 | 寝室、リビング、台所、など |
Worker Node | 1つまたは複数のPodが存在するために必要なもの | 1棟の集合住宅 |
Master Node | Cluster(後述)を管理する要素をもったもの | 集合住宅管理組合 |
Cluster | Master NodeといくつかのWorker Nodesで構成される集合体 | 複数の集合住宅から構成される街 |
- Container vs Pod
- Containerは1つの役割に専念する
- 1つの役割を全うしている限り高機能でもよい
- Podは複数のContainerが協調して動作できる環境になっている
- 多機能はこの単位で担保される
- Containerは1つの役割に専念する
- Pod vs Worker Node
- Podは機能性のある環境だが、それ実在できるためには意味のある単位(Node)が必要
- Worker Nodeは複数のPodを持てるが協調することはなく、単に複数のPodが存在できる程度の意味合いしかない
- Worker Node vs Cluster
- Worker Nodeはさまざまな機能性のバリエーションを持ったPodを持っている
- Clusterが持つWorker Node群はすべて同じ構成のものでバリエーションはない
参考
*1:2つ以上の役割を持つこともできるが通常はやらない。テレビ機能付き冷蔵庫を作るようなもの