🐌

【WSL2 Ubuntu22.04】minikube をインストールしてみた

2023/11/17に公開

はじめに

何番煎じかわかりませんが、minikubeをWSL2 Ubuntuにインストールしてみます。
kindをインストールしてみたんですけど、ちょっと私には早すぎたようで。。😔

スタートに書いてある通りに進めていきます。
https://minikube.sigs.k8s.io/docs/start/

環境

Windows11
Ubuntu 22.04.3 LTS

インストール

インストールは簡単。
プラットフォームやらを選択していくとコマンドを用意してくれるので、それを叩くだけです。
今回はこの選択です。

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 89.3M  100 89.3M    0     0  29.2M      0  0:00:03  0:00:03 --:--:-- 29.2M
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Optional::インストールしたので手元のファイルは削除しました
$ rm minikube-linux-amd64

クラスターのスタート

絵文字がいっぱい。

$ minikube start
😄  minikube v1.32.0 on Ubuntu 22.04 (amd64)
✨  Automatically selected the docker driver. Other choices: ssh, none
📌  Using Docker driver with root privileges
❗  For an improved experience it's recommended to use Docker Engine instead of Docker Desktop.
Docker Engine installation instructions: https://docs.docker.com/engine/install/#server
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.28.3 preload ...
    > preloaded-images-k8s-v18-v1...:  403.35 MiB / 403.35 MiB  100.00% 33.77 M
    > gcr.io/k8s-minikube/kicbase...:  453.90 MiB / 453.90 MiB  100.00% 37.15 M
🔥  Creating docker container (CPUs=2, Memory=2200MB) ...
🐳  Preparing Kubernetes v1.28.3 on Docker 24.0.7 ...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔗  Configuring bridge CNI (Container Networking Interface) ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

クラスターを操作

kubectlはインストール済みなので、作ったクラスターにアクセスしてみます。

$ kubectl get po -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-5dd5756b68-6rtqf           1/1     Running   0          14h
kube-system   etcd-minikube                      1/1     Running   0          14h
kube-system   kube-apiserver-minikube            1/1     Running   0          14h
kube-system   kube-controller-manager-minikube   1/1     Running   0          14h
kube-system   kube-proxy-ndt95                   1/1     Running   0          14h
kube-system   kube-scheduler-minikube            1/1     Running   0          14h
kube-system   storage-provisioner                1/1     Running   0          14h

minikube kubectl を組み合わせて使えるみたいですけど、必要に迫られたら設定することにしよう。

storage-provisioner あたりは起動に時間がかかることもあるみたいです。

クラスターの状態はdashboardで確認できるようです。
起動してみます。

$ minikube dashboard
🔌  Enabling dashboard ...
    ▪ Using image docker.io/kubernetesui/dashboard:v2.7.0
    ▪ Using image docker.io/kubernetesui/metrics-scraper:v1.0.8
💡  Some dashboard features require the metrics-server addon. To enable all features please run:

        minikube addons enable metrics-server


🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
🎉  Opening http://127.0.0.1:45661/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
grep: /proc/sys/fs/binfmt_misc/WSLInterop: No such file or directory
WSL Interopability is disabled. Please enable it before using WSL.
grep: /proc/sys/fs/binfmt_misc/WSLInterop: No such file or directory
[error] WSL Interoperability is disabled. Please enable it before using WSL.
/usr/bin/x-www-browser: line 163: /mnt/c/Windows/System32/reg.exe: cannot execute binary file: Exec format error
/usr/bin/x-www-browser: line 216: /mnt/c/Windows/System32/reg.exe: cannot execute binary file: Exec format error
/usr/bin/x-www-browser: line 149: /mnt/c/Windows/System32/chcp.com: cannot execute binary file: Exec format error
/usr/bin/x-www-browser: line 156: /mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe: cannot execute binary file: Exec format error
/usr/bin/x-www-browser: line 149: /mnt/c/Windows/System32/chcp.com: cannot execute binary file: Exec format error
/usr/bin/xdg-open: 882: firefox: not found
/usr/bin/xdg-open: 882: iceweasel: not found
/usr/bin/xdg-open: 882: seamonkey: not found
/usr/bin/xdg-open: 882: mozilla: not found
/usr/bin/xdg-open: 882: epiphany: not found
/usr/bin/xdg-open: 882: konqueror: not found
/usr/bin/xdg-open: 882: chromium: not found
/usr/bin/xdg-open: 882: chromium-browser: not found
/usr/bin/xdg-open: 882: google-chrome: not found
grep: /proc/sys/fs/binfmt_misc/WSLInterop: No such file or directory
WSL Interopability is disabled. Please enable it before using WSL.
grep: /proc/sys/fs/binfmt_misc/WSLInterop: No such file or directory
[error] WSL Interoperability is disabled. Please enable it before using WSL.
/usr/bin/www-browser: line 216: /mnt/c/Windows/System32/reg.exe: cannot execute binary file: Exec format error
/usr/bin/www-browser: line 149: /mnt/c/Windows/System32/chcp.com: cannot execute binary file: Exec format error
/usr/bin/www-browser: line 156: /mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe: cannot execute binary file: Exec format error
/usr/bin/www-browser: line 149: /mnt/c/Windows/System32/chcp.com: cannot execute binary file: Exec format error
/usr/bin/xdg-open: 882: links2: not found
/usr/bin/xdg-open: 882: elinks: not found
/usr/bin/xdg-open: 882: links: not found
/usr/bin/xdg-open: 882: lynx: not found
/usr/bin/xdg-open: 882: w3m: not found
xdg-open: no method available for opening 'http://127.0.0.1:45661/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/'

❌  Exiting due to HOST_BROWSER: failed to open browser: exit status 3

dashboardの起動はできているみたい(URLにアクセスすると表示される)なんですが、ブラウザを自動起動するようになっていて、そのexeを叩くのに失敗しているみたいです。
ついでに直します。直し方はこちらのサイトを参照で。ありがとうございます。

https://tech.buty4649.net/entry/2023/04/21/170643

$ echo ":WSLInterop:M::MZ::/init:PF" | sudo tee /usr/lib/binfmt.d/WSLInterop.conf
:WSLInterop:M::MZ::/init:PF
$ sudo systemctl restart systemd-binfmt

$ ls -lah /proc/sys/fs/binfmt_misc/WSLInterop
-rw-r--r-- 1 root root 0 Nov 17 10:21 /proc/sys/fs/binfmt_misc/WSLInterop

もう一度dashboard を起動してみます。

$ minikube dashboard
🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
🎉  Opening http://127.0.0.1:42093/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...

minikube専用ってわけではないのね。

クラスターのところには何やらいっぱいありますね。ふむふむ。(わからない)

アプリケーションのデプロイ

サービス

まずはお手軽なサービスに直接アクセスするサンプルのデプロイから。
8080ポートで公開します。

$ kubectl create deployment hello-minikube --image=kicbase/echo-server:1.0
$ kubectl expose deployment hello-minikube --type=NodePort --port=8080
$ kubectl get services hello-minikube
NAME             TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort   10.111.124.186   <none>        8080:31986/TCP   8s

minikube でブラウザでアクセスできるようにします。なんと便利な。一部文字化けしてるけど。

$ minikube service hello-minikube
|-----------|----------------|-------------|---------------------------|
| NAMESPACE |      NAME      | TARGET PORT |            URL            |
|-----------|----------------|-------------|---------------------------|
| default   | hello-minikube |        8080 | http://192.168.49.2:31986 |
|-----------|----------------|-------------|---------------------------|
🏃  Starting tunnel for service hello-minikube.
|-----------|----------------|-------------|------------------------|
| NAMESPACE |      NAME      | TARGET PORT |          URL           |
|-----------|----------------|-------------|------------------------|
| default   | hello-minikube |             | http://127.0.0.1:44597 |
|-----------|----------------|-------------|------------------------|
🎉  Opening service default/hello-minikube in default browser...
�p�����[�^�[�̏������Ⴂ�܂� - ""
❗  Because you are using a Docker driver on linux, the terminal needs to be open to run it.

もしくはポートフォワードさせるやり方で。

$ kubectl port-forward service/hello-minikube 7080:8080
Forwarding from 127.0.0.1:7080 -> 8080
Forwarding from [::1]:7080 -> 8080
Handling connection for 7080
Handling connection for 7080

http://localhost:7080/ でアクセスできます。

ロードバランサー

ロードバランサーでのアクセスをする場合。

アプリをデプロイします。

$ kubectl create deployment balanced --image=kicbase/echo-server:1.0
deployment.apps/balanced created
$ kubectl expose deployment balanced --type=LoadBalancer --port=8080
service/balanced exposed

別のウインドウターミナルで minikube tunnel を実行。

$ minikube tunnel
✅  Tunnel successfully started

📌  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...

🏃  Starting tunnel for service balanced.

元のターミナルで CLUSTER-IP を確認します。

$ kubectl get services balanced
NAME       TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
balanced   LoadBalancer   10.96.78.248   127.0.0.1     8080:30420/TCP   2m1s

http://<EXTERNAL-IP>:8080 でアクセスできるようになります。
つまり http://127.0.0.1:8080/

お手軽ですね。

イングレス

最後はイングレスのパターン。

まずはイングレスのaddonを有効にします。

$ minikube addons enable ingress
💡  ingress is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.
You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS
    ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.9.4
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20231011-8b53cabe0
🔎  Verifying ingress addon...
🌟  The 'ingress' addon is enabled

単純なエコー サーバー サービスと、これらのサービスにルーティングする Ingress オブジェクトのマニュフェストが用意されているので、それを使ってデプロイします。

中身はこれ。

ingress-example.yaml
kind: Pod
apiVersion: v1
metadata:
  name: foo-app
  labels:
    app: foo
spec:
  containers:
    - name: foo-app
      image: 'kicbase/echo-server:1.0'
---
kind: Service
apiVersion: v1
metadata:
  name: foo-service
spec:
  selector:
    app: foo
  ports:
    - port: 8080
---
kind: Pod
apiVersion: v1
metadata:
  name: bar-app
  labels:
    app: bar
spec:
  containers:
    - name: bar-app
      image: 'kicbase/echo-server:1.0'
---
kind: Service
apiVersion: v1
metadata:
  name: bar-service
spec:
  selector:
    app: bar
  ports:
    - port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
    - http:
        paths:
          - pathType: Prefix
            path: /foo
            backend:
              service:
                name: foo-service
                port:
                  number: 8080
          - pathType: Prefix
            path: /bar
            backend:
              service:
                name: bar-service
                port:
                  number: 8080
---
$ kubectl apply -f https://storage.googleapis.com/minikube-site-examples/ingress-example.yaml
pod/foo-app created
service/foo-service created
pod/bar-app created
service/bar-service created
ingress.networking.k8s.io/example-ingress created

作成されたイングレス

$ kubectl get ingress
NAME              CLASS   HOSTS   ADDRESS        PORTS   AGE
example-ingress   nginx   *       192.168.49.2   80      24s

WSL2民はこのままだとアクセスできないので、先ほどやった minikube tunnel を使ってトンネリングします。
別のターミナルでトンネルさせて、127.0.0.1 でアクセスできるようにします。ポートは80です。

$ minikube tunnel
✅  Tunnel successfully started

📌  NOTE: Please do not close this terminal as this process must stay alive for the tunnel to be accessible ...

🏃  Starting tunnel for service balanced.
❗  The service/ingress example-ingress requires privileged ports to be exposed: [80 443]
🔑  sudo permission will be asked for it.
🏃  Starting tunnel for service example-ingress.

http://127.0.0.1/foo

http://127.0.0.1/bar

良いですね🤗

クラスターの管理

一部だけ少し。

Kubernetesを一時停止

デプロイしたアプリケーションには影響はないそうです。

$ minikube pause
⏸️  Pausing node minikube ... 
⏯️  Paused 18 containers in: kube-system, kubernetes-dashboard, storage-gluster, istio-operator

pod にアクセスできなくなりました。

$ kubectl get po -A
Unable to connect to the server: net/http: TLS handshake timeout

一時停止したインスタンスの一時停止を解除

$ minikube unpause
⏸️  Unpausing node minikube ... 
⏸️  Unpaused 18 containers in: kube-system, kubernetes-dashboard, storage-gluster, istio-operator

podの一覧が取得できるようになりました。

$ kubectl get po -A
NAMESPACE              NAME                                         READY   STATUS      RESTARTS   AGE
default                balanced-dc9897bb7-5mmqn                     1/1     Running     0          37m
default                bar-app                                      1/1     Running     0          28m
default                foo-app                                      1/1     Running     0          28m
default                hello-minikube-7f54cff968-8zz7p              1/1     Running     0          80m
ingress-nginx          ingress-nginx-admission-create-kcxpb         0/1     Completed   0          30m
ingress-nginx          ingress-nginx-admission-patch-kqw46          0/1     Completed   1          30m
ingress-nginx          ingress-nginx-controller-7c6974c4d8-q2wgq    1/1     Running     0          30m
kube-system            coredns-5dd5756b68-6rtqf                     1/1     Running     0          17h
kube-system            etcd-minikube                                1/1     Running     0          17h
kube-system            kube-apiserver-minikube                      1/1     Running     0          17h
kube-system            kube-controller-manager-minikube             1/1     Running     0          17h
kube-system            kube-proxy-ndt95                             1/1     Running     0          17h
kube-system            kube-scheduler-minikube                      1/1     Running     0          17h
kube-system            storage-provisioner                          1/1     Running     0          17h
kubernetes-dashboard   dashboard-metrics-scraper-7fd5cb4ddc-x4p62   1/1     Running     0          158m
kubernetes-dashboard   kubernetes-dashboard-8694d4445c-n7kml        1/1     Running     0          158m

addon の一覧を表示

チェックが入っているのが有効なaddon

$ minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |
| auto-pause                  | minikube | disabled     | minikube                       |
| cloud-spanner               | minikube | disabled     | Google                         |
| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |
| dashboard                   | minikube | enabled ✅   | Kubernetes                     |
| default-storageclass        | minikube | enabled ✅   | Kubernetes                     |
| efk                         | minikube | disabled     | 3rd party (Elastic)            |
| freshpod                    | minikube | disabled     | Google                         |
| gcp-auth                    | minikube | disabled     | Google                         |
| gvisor                      | minikube | disabled     | minikube                       |
| headlamp                    | minikube | disabled     | 3rd party (kinvolk.io)         |
| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |
| inaccel                     | minikube | disabled     | 3rd party (InAccel             |
|                             |          |              | [info@inaccel.com])            |
| ingress                     | minikube | enabled ✅   | Kubernetes                     |
| ingress-dns                 | minikube | disabled     | minikube                       |
| inspektor-gadget            | minikube | disabled     | 3rd party                      |
|                             |          |              | (inspektor-gadget.io)          |
| istio                       | minikube | disabled     | 3rd party (Istio)              |
| istio-provisioner           | minikube | disabled     | 3rd party (Istio)              |
| kong                        | minikube | disabled     | 3rd party (Kong HQ)            |
| kubeflow                    | minikube | disabled     | 3rd party                      |
| kubevirt                    | minikube | disabled     | 3rd party (KubeVirt)           |
| logviewer                   | minikube | disabled     | 3rd party (unknown)            |
| metallb                     | minikube | disabled     | 3rd party (MetalLB)            |
| metrics-server              | minikube | disabled     | Kubernetes                     |
| nvidia-device-plugin        | minikube | disabled     | 3rd party (NVIDIA)             |
| nvidia-driver-installer     | minikube | disabled     | 3rd party (Nvidia)             |
| nvidia-gpu-device-plugin    | minikube | disabled     | 3rd party (Nvidia)             |
| olm                         | minikube | disabled     | 3rd party (Operator Framework) |
| pod-security-policy         | minikube | disabled     | 3rd party (unknown)            |
| portainer                   | minikube | disabled     | 3rd party (Portainer.io)       |
| registry                    | minikube | disabled     | minikube                       |
| registry-aliases            | minikube | disabled     | 3rd party (unknown)            |
| registry-creds              | minikube | disabled     | 3rd party (UPMC Enterprises)   |
| storage-provisioner         | minikube | enabled ✅   | minikube                       |
| storage-provisioner-gluster | minikube | disabled     | 3rd party (Gluster)            |
| storage-provisioner-rancher | minikube | disabled     | 3rd party (Rancher)            |
| volumesnapshots             | minikube | disabled     | Kubernetes                     |
|-----------------------------|----------|--------------|--------------------------------|

すべてのクラスターの削除

$ minikube delete --all
🔥  Deleting "minikube" in docker ...
🔥  Removing /home/user/.minikube/machines/minikube ...
💀  Removed all traces of the "minikube" cluster.
🔥  Successfully deleted all profiles

Docker desktop からの minikube が消えてました。

おわりに

minikube はいろいろ用意されていて、私みたいにインフラはなんちゃってレベルの人にはとても良さそうですね。
頑張って使うぞー

Discussion