tkzwhr's notes

tkzwhrの技術、中国語などのメモです。

WSL2でminikubeを動かす

WSL2でhello-minikubeできるようになるまでが長かったのでメモしておく。

前提

  • WSL2に使うゲストOSはUbunts 20.04
  • DockerはWSL2のゲストOSにインストールする
    • ホスト(Windows)の方にはあんまり開発ツールとか入れたくないんだよなぁ・・・

普通にインストール

Ubuntu用のDockerをインストールする。

docs.docker.com

Post-installationに書いてあるとおり、dockerを一般ユーザーでも実行できるようにする。

docs.docker.com

続いてkubectlとminikubeを入れる。

kubernetes.io

kubernetes.io

実行する

クイックスタートの通りにやってみる。

ただし、WSLでは仮想化ツールが使えないので、 minikube実行時に --driver=none を指定してゲストOSのDocker上に直接Kubernetesを構築する。

kubernetes.io

なお、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が起動するようにする。

shikiyura.com

エラーIII: Waiting for systemd...!!!!! が終わらない

qiita.com

ここによると、起動に失敗するプロセスがあると止まってしまう。

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が協調して動作できる環境になっている
      • 多機能はこの単位で担保される
  • Pod vs Worker Node
    • Podは機能性のある環境だが、それ実在できるためには意味のある単位(Node)が必要
    • Worker Nodeは複数のPodを持てるが協調することはなく、単に複数のPodが存在できる程度の意味合いしかない
  • Worker Node vs Cluster
    • Worker Nodeはさまざまな機能性のバリエーションを持ったPodを持っている
    • Clusterが持つWorker Node群はすべて同じ構成のものでバリエーションはない

参考

*1:2つ以上の役割を持つこともできるが通常はやらない。テレビ機能付き冷蔵庫を作るようなもの