【MS Learnやってみた】WSL2 Ubuntu に MicroK8s をインストールする
MS Learn の Kubernetes 入門 にて、Kubernetes勉強中です。
全然わかってない😂ですが、ここでは、『演習 - Kubernetes クラスターの機能を調べる。』をやってみました。
以下の演習の内容通りに進めていくので、詳しいことはご本家を参照してください。
環境
- WSL2 Ubuntu 20.04
1. MicroK8s をインストールする
$ sudo snap install microk8s --classic
microk8s (1.27/stable) v1.27.2 from Canonical✓ installed
だいぶ、Learn とバージョンが違う🤔
2. クラスターを準備する
クラスターにインストールされているアドオンの状態を表示します。
$ sudo microk8s.status --wait-ready
microk8s is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
addons:
enabled:
dns # (core) CoreDNS
ha-cluster # (core) Configure high availability on the current node
helm # (core) Helm - the package manager for Kubernetes
helm3 # (core) Helm 3 - the package manager for Kubernetes
disabled:
cert-manager # (core) Cloud native certificate management
community # (core) The community addons repository
dashboard # (core) The Kubernetes dashboard
gpu # (core) Automatic enablement of Nvidia CUDA
host-access # (core) Allow Pods connecting to Host services smoothly
hostpath-storage # (core) Storage class; allocates storage from host directory
ingress # (core) Ingress controller for external access
kube-ovn # (core) An advanced network fabric for Kubernetes
mayastor # (core) OpenEBS MayaStor
metallb # (core) Loadbalancer for your Kubernetes cluster
metrics-server # (core) K8s Metrics Server for API access to service metrics
minio # (core) MinIO object storage
observability # (core) A lightweight observability stack for logs, traces and metrics
prometheus # (core) Prometheus operator for monitoring and logging
rbac # (core) Role-Based Access Control for authorisation
registry # (core) Private image registry exposed on localhost:32000
storage # (core) Alias to hostpath-storage add-on, deprecated
ここもだいぶ変わってますね。
cannot parse mountinfo: incorrect number of tail fields, expected 3 but found 4 とエラーが出た場合
以下のようなエラーが出た場合、2023/07/14現在、WindowsのDocker DesktopをC:\Dockerにインストールすることで回避することができます。ムズカシイネー🤷♀️
$ sudo microk8s.status --wait-ready
2023/07/14 14:57:14.900035 system_key.go:129: cannot determine nfs usage in generateSystemKey: cannot parse mountinfo: incorrect number of tail fields, expected 3 but found 4
2023/07/14 14:57:14.905058 cmd_run.go:1046: WARNING: cannot create user data directory: cannot determine SELinux status: failed to obtain SELinux mount path: incorrect number of tail fields, expected 3 but found 4
- Docker Desktop をアンインストール
- 最新のDocker Desktopインストーラーをダウンロード
https://www.docker.com/products/docker-desktop/ - PowerShell を開いて、ダウンロードフォルダに移動
cd "C:\Users\ユーザ名\Downloads\"
- Docker Desktop をインストール
Start-Process "Docker Desktop Installer.exe" -Verb RunAs -Wait -ArgumentList "install --installation-dir=C:\Docker\"
DNS、ダッシュボード、およびレジストリ アドオンを有効にします。
DNSはすでにenabledになってるので、ダッシュボードとレジストリですね。
$ sudo microk8s.enable dashboard registry
Infer repository core for addon dashboard
Infer repository core for addon registry
WARNING: Do not enable or disable multiple addons in one command.
This form of chained operations on addons will be DEPRECATED in the future.
Please, enable one addon at a time: 'microk8s enable <addon>'
Enabling Kubernetes Dashboard
Infer repository core for addon metrics-server
Enabling Metrics-Server
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
clusterrolebinding.rbac.authorization.k8s.io/microk8s-admin created
Metrics-Server is enabled
Applying manifest
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
secret/microk8s-dashboard-token created
If RBAC is not enabled access the dashboard using the token retrieved with:
microk8s kubectl describe secret -n kube-system microk8s-dashboard-token
Use this token in the https login UI of the kubernetes-dashboard service.
In an RBAC enabled setup (microk8s enable RBAC) you need to create a user with restricted
permissions as shown in:
https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
Infer repository core for addon hostpath-storage
Enabling default storage class.
WARNING: Hostpath storage is not suitable for production environments.
A hostpath volume can grow beyond the size limit set in the volume claim manifest.
deployment.apps/hostpath-provisioner created
storageclass.storage.k8s.io/microk8s-hostpath created
serviceaccount/microk8s-hostpath created
clusterrole.rbac.authorization.k8s.io/microk8s-hostpath created
clusterrolebinding.rbac.authorization.k8s.io/microk8s-hostpath created
Storage will be available soon.
The registry will be created with the size of 20Gi.
Default storage class will be used.
namespace/container-registry created
persistentvolumeclaim/registry-claim created
deployment.apps/registry created
service/registry created
configmap/local-registry-hosting configured
なんかWARNINGが出てますが、もう一回statusを確認してみます。
$ sudo microk8s.status --wait-ready
microk8s is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
addons:
enabled:
dashboard # (core) The Kubernetes dashboard
dns # (core) CoreDNS
ha-cluster # (core) Configure high availability on the current node
helm # (core) Helm - the package manager for Kubernetes
helm3 # (core) Helm 3 - the package manager for Kubernetes
hostpath-storage # (core) Storage class; allocates storage from host directory
metrics-server # (core) K8s Metrics Server for API access to service metrics
registry # (core) Private image registry exposed on localhost:32000
storage # (core) Alias to hostpath-storage add-on, deprecated
disabled:
cert-manager # (core) Cloud native certificate management
community # (core) The community addons repository
gpu # (core) Automatic enablement of Nvidia CUDA
host-access # (core) Allow Pods connecting to Host services smoothly
ingress # (core) Ingress controller for external access
kube-ovn # (core) An advanced network fabric for Kubernetes
mayastor # (core) OpenEBS MayaStor
metallb # (core) Loadbalancer for your Kubernetes cluster
minio # (core) MinIO object storage
observability # (core) A lightweight observability stack for logs, traces and metrics
prometheus # (core) Prometheus operator for monitoring and logging
rbac # (core) Role-Based Access Control for authorisation
無事、有効になってました。
3. Kubernetes クラスターを調べる
microk8s.kubectl コマンドのエイリアスを作成
言われるがままにエイリアスを作成します。
$ sudo snap alias microk8s.kubectl kubectl
Added:
- microk8s.kubectl as kubectl
クラスター ノードの情報を表示する
- クラスターで実行されているノードを確認します。
MicroK8s が単一ノードのクラスターらしいので、一つしか表示されないはず。
$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
xxxxname Ready <none> 35m v1.27.2
もうちょっと詳細情報も表示できるそうで、ノードのIPアドレスを表示するには -o wide を追加します。
$ sudo kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
xxxxname Ready <none> 40m v1.27.2 172.17.222.160 <none> Ubuntu 20.04.5 LTS 5.15.90.1-microsoft-standard-WSL2 containerd://1.6.15
- クラスターで実行されているサービスを調べます。
$ sudo kubectl get services -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 68m <none>
先ほど追加したアドオンもサービスらしいので、本当は全部表示して欲しいらしい(らしいばっかり)
名前空間ごとにどうやらサービスがインストールされてたりするっぽいので、すべての名前空間のサービスを表示するには、以下のように --all-namespaces をつける。
$ sudo kubectl get services -o wide --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 70m <none>
kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 70m k8s-app=kube-dns
kube-system metrics-server ClusterIP 10.152.183.107 <none> 443/TCP 25m k8s-app=metrics-server
kube-system kubernetes-dashboard ClusterIP 10.152.183.103 <none> 443/TCP 25m k8s-app=kubernetes-dashboard
kube-system dashboard-metrics-scraper ClusterIP 10.152.183.209 <none> 8000/TCP 25m k8s-app=dashboard-metrics-scraper
アドオンはkube-system にインストールされるんですね。
4.クラスターに Web サーバーをインストールする
ここらへんからポッドが出てきますね。
- NGINX デプロイを作成する
$ sudo kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
- デプロイに関する情報をフェッチする
$ sudo kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 66s
1個が準備完了状態を意味するんだそうです。
- クラスターのポッドに関する情報をフェッチする
$ sudo kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-77b4fdf86c-29s8m 1/1 Running 0 2m17s
ポッドが実行中を意味するそうです。
なんかすぐできちゃって実感がわかない。。
5. Web サイトのインストールをテストする
デプロイしたnginxサーバがちゃんとインストールされているか確認します。
- ポッドのアドレスを見つけるには、-o wide パラメーターを渡します。
$ sudo kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-77b4fdf86c-29s8m 1/1 Running 0 4m18s 10.1.34.73 xxxxname <none> <none>
- Web サイトにアクセスするには、wget を実行します。
$ wget 10.1.34.73
--2023-07-14 16:09:29-- http://10.1.34.73/
Connecting to 10.1.34.73:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 615 [text/html]
Saving to: ‘index.html’
index.html 100%[==============================================================================================>] 615 --.-KB/s in 0s
2023-07-14 16:09:29 (216 MB/s) - ‘index.html’ saved [615/615]
お、index.html が落ちてきました。よさそうですね。
6. クラスターでの Web サーバーのデプロイをスケーリングする
つまりインスタンスを増やすってことかな。
- nginxポッドの合計を3にします。
$ sudo kubectl scale --replicas=3 deployments/nginx
deployment.apps/nginx scaled
めっちゃ速い。
- 実行中のポッドの数を確認
$ sudo kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-77b4fdf86c-29s8m 1/1 Running 0 9m11s 10.1.34.73 xxxxname <none> <none>
nginx-77b4fdf86c-f4d9r 1/1 Running 0 56s 10.1.34.74 xxxxname <none> <none>
nginx-77b4fdf86c-wczfd 1/1 Running 0 56s 10.1.34.75 xxxxname <none> <none>
増えてますねー。これは楽だ。
7. MicroK8s をアンインストールする
後始末をします。dnsはもともとenabledだったので、ここでは外してます。
- クラスターからアドオンを削除
sudo microk8s.disable dashboard registry
Infer repository core for addon dashboard
Infer repository core for addon registry
WARNING: Do not enable or disable multiple addons in one command.
This form of chained operations on addons will be DEPRECATED in the future.
Please, disable one addon at a time: 'microk8s disable <addon>'
Disabling Dashboard
serviceaccount "kubernetes-dashboard" deleted
service "kubernetes-dashboard" deleted
secret "kubernetes-dashboard-certs" deleted
secret "kubernetes-dashboard-csrf" deleted
secret "kubernetes-dashboard-key-holder" deleted
configmap "kubernetes-dashboard-settings" deleted
role.rbac.authorization.k8s.io "kubernetes-dashboard" deleted
clusterrole.rbac.authorization.k8s.io "kubernetes-dashboard" deleted
rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard" deleted
clusterrolebinding.rbac.authorization.k8s.io "kubernetes-dashboard" deleted
deployment.apps "kubernetes-dashboard" deleted
service "dashboard-metrics-scraper" deleted
deployment.apps "dashboard-metrics-scraper" deleted
Dashboard is disabled
Disabling the private registry
namespace "container-registry" deleted
persistentvolumeclaim "registry-claim" deleted
deployment.apps "registry" deleted
service "registry" deleted
configmap "local-registry-hosting" deleted
configmap/local-registry-hosting created
The registry is disabled. Use 'microk8s disable hostpath-storage:destroy-storage' to free the storage space.
- VM から MicroK8s を削除する
$ sudo snap remove microk8s
microk8s removed
これでこの演習は一通り終わりです。
雰囲気がつかめたかな・・・?
Discussion