【WSL2 Ubuntu22.04】minikube をインストールしてみた
はじめに
何番煎じかわかりませんが、minikubeをWSL2 Ubuntuにインストールしてみます。
kindをインストールしてみたんですけど、ちょっと私には早すぎたようで。。😔
スタートに書いてある通りに進めていきます。
環境
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を叩くのに失敗しているみたいです。
ついでに直します。直し方はこちらのサイトを参照で。ありがとうございます。
$ 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 オブジェクトのマニュフェストが用意されているので、それを使ってデプロイします。
中身はこれ。
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.
良いですね🤗
クラスターの管理
一部だけ少し。
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