🎨

【MS Learnやってみた】WSL2 Ubuntu に MicroK8s をインストールする

2023/07/14に公開

MS Learn の Kubernetes 入門 にて、Kubernetes勉強中です。
https://learn.microsoft.com/ja-jp/training/paths/intro-to-kubernetes-on-azure/

全然わかってない😂ですが、ここでは、『演習 - Kubernetes クラスターの機能を調べる。』をやってみました。
以下の演習の内容通りに進めていくので、詳しいことはご本家を参照してください。
https://learn.microsoft.com/ja-jp/training/modules/intro-to-kubernetes/5-exercise-kubernetes-functionality?pivots=linux

環境

  • WSL2 Ubuntu 20.04

1. MicroK8s をインストールする

bash
$ sudo snap install microk8s --classic
microk8s (1.27/stable) v1.27.2 from Canonical✓ installed

だいぶ、Learn とバージョンが違う🤔

2. クラスターを準備する

クラスターにインストールされているアドオンの状態を表示します。

bash
$ 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にインストールすることで回避することができます。ムズカシイネー🤷‍♀️

bash
$ 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

https://github.com/canonical/microk8s/issues/3911
https://github.com/docker/for-win/issues/13318

  1. Docker Desktop をアンインストール
  2. 最新のDocker Desktopインストーラーをダウンロード
    https://www.docker.com/products/docker-desktop/
  3. PowerShell を開いて、ダウンロードフォルダに移動
PowerShell
cd "C:\Users\ユーザ名\Downloads\"
  1. Docker Desktop をインストール
PowerShell
Start-Process "Docker Desktop Installer.exe" -Verb RunAs -Wait -ArgumentList "install --installation-dir=C:\Docker\"

DNS、ダッシュボード、およびレジストリ アドオンを有効にします。

DNSはすでにenabledになってるので、ダッシュボードとレジストリですね。

bash
$ 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を確認してみます。

bash
$ 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 コマンドのエイリアスを作成

言われるがままにエイリアスを作成します。

bash
$ sudo snap alias microk8s.kubectl kubectl
Added:
  - microk8s.kubectl as kubectl

クラスター ノードの情報を表示する

  1. クラスターで実行されているノードを確認します。
    MicroK8s が単一ノードのクラスターらしいので、一つしか表示されないはず。
bash
$ sudo kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
xxxxname   Ready    <none>   35m   v1.27.2

もうちょっと詳細情報も表示できるそうで、ノードのIPアドレスを表示するには -o wide を追加します。

bash
$ 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
  1. クラスターで実行されているサービスを調べます。
bash
$ 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 をつける。

bash
$ 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 サーバーをインストールする

ここらへんからポッドが出てきますね。

  1. NGINX デプロイを作成する
bash
$ sudo kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
  1. デプロイに関する情報をフェッチする
bash
$ sudo kubectl get deployments
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           66s

1個が準備完了状態を意味するんだそうです。

  1. クラスターのポッドに関する情報をフェッチする
bash
$ sudo kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-77b4fdf86c-29s8m   1/1     Running   0          2m17s

ポッドが実行中を意味するそうです。
なんかすぐできちゃって実感がわかない。。

5. Web サイトのインストールをテストする

デプロイしたnginxサーバがちゃんとインストールされているか確認します。

  1. ポッドのアドレスを見つけるには、-o wide パラメーターを渡します。
bash
$ 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>
  1. Web サイトにアクセスするには、wget を実行します。
bash
$ 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 サーバーのデプロイをスケーリングする

つまりインスタンスを増やすってことかな。

  1. nginxポッドの合計を3にします。
bash
$ sudo kubectl scale --replicas=3 deployments/nginx
deployment.apps/nginx scaled

めっちゃ速い。

  1. 実行中のポッドの数を確認
bash
$ 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だったので、ここでは外してます。

  1. クラスターからアドオンを削除
bash
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.
  1. VM から MicroK8s を削除する
bash
$ sudo snap remove microk8s
microk8s removed

これでこの演習は一通り終わりです。
雰囲気がつかめたかな・・・?

Discussion