Rocky Linux 9にMicroK8sをインストールする

# What's？

Rocky Linux 9にMicroK8sをインストールしてみよう、ということで。

# MicroK8s

MicroK8sは、Canonicalが開発している軽量なKubernetesディストリビューションです。

https://microk8s.io/

特徴としては、以下あたりです。

- クラスタが構成できる
- 厳格な分離が可能
- 自動化されたクラスタ作成・管理
- NVIDIA GPUのサポート
- カスタムの起動構成が可能
- アドオン

https://microk8s.io/features

個人的にはアドオンが魅力的で、コンテナイメージのレジストリやダッシュボードなど様々なアドオンが利用できます。

https://microk8s.io/docs/addons

MicroK8sは様々なOSにインストールできますが、Linuxであればsnapパッケージとして簡単にインストールできます。

https://microk8s.io/docs/getting-started

https://microk8s.io/docs/setting-snap-channel

今回はこのMicroK8sをRocky Linux 9にインストールしたいと思います。

# 環境

今回の環境はこちら。

```shell
$ cat /etc/redhat-release
Rocky Linux release 9.5 (Blue Onyx)


$ uname -srvmpio
Linux 5.14.0-503.33.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Mar 19 16:23:31 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
```

# Rocky Linux 9にMicroK8sをインストールする

それでは、Rocky Linux 9にMicroK8sをインストールします。

手順としては、こちらに沿っていくことになりますね。

https://microk8s.io/docs/getting-started

Ubuntu Linuxのようなあらかじめsnapが導入されているディストリビューションはであればいいのですが、そうでない場合はまずsnapのインストールから行います。

```shell
$ sudo dnf install snapd
$ sudo systemctl enable --now snapd.socket
$ sudo ln -s /var/lib/snapd/snap /snap
```

https://qiita.com/charon/items/27983d54116943b66ff3

そしてMicroK8sをインストール。`--classic`をつけてインストールする、classic snapになります。

```shell
$ sudo snap install microk8s --classic
```

注意点として、Rocky Linux 9の場合はsnapをインストールする時に最後の`sudo ln -s /var/lib/snapd/snap /snap`が必要で、これがないとclass snapのインストールに失敗します。

```shell
$ sudo snap install microk8s --classic
error: too early for operation, device not yet seeded or device model not acknowledged
```

インストールしたら、ユーザーのグループ参加と`$HOME/.kube`ディレクトリの作成を行います。

```shell
$ sudo usermod -a -G microk8s $USER
$ mkdir -p ~/.kube
$ chmod 0700 ~/.kube
```

ここまでできたら、シェルに再ログインします。

すると、`microk8s`コマンドが使えるようになっています。

```shell
$ microk8s version
MicroK8s v1.32.2 revision 7731
```

ステータスを確認。

```shell
$ 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
    cis-hardening        # (core) Apply CIS K8s hardening
    community            # (core) The community addons repository
    dashboard            # (core) The Kubernetes dashboard
    gpu                  # (core) Alias to nvidia add-on
    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
    nvidia               # (core) NVIDIA hardware (GPU and network) support
    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
    rook-ceph            # (core) Distributed Ceph storage using Rook
    storage              # (core) Alias to hostpath-storage add-on, deprecated
```

`kubectl`コマンドを使ってみます。

```shell
$ microk8s kubectl get nodes
NAME            STATUS   ROLES    AGE   VERSION
rocky9-server   Ready    <none>   60s   v1.32.2
```

`microk8s kubectl`という指定方法になるのですが、これが面倒な場合は以下のようにエイリアスをつけましょう。

```shell
$ alias kubectl='microk8s kubectl'
```

ちなみにチュートリアルではService間の通信に使うのでdnsアドオンを有効化することが推奨されていましたが

> To start it is recommended to add DNS management to facilitate communication between services.

先ほどステータスを見ると、すでに有効化されていましたね。

```shell
addons:
  enabled:
    dns                  # (core) CoreDNS
```

実際、さらに有効化しようとしても、「すでに有効になっている」と言われます。

```shell
$ microk8s enable dns
Infer repository core for addon dns
Addon core/dns is already enabled
```

コンテナを動かしてみます。

```shell
$ microk8s kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
```

nginxが動いています。

```shell
$ microk8s kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-5869d7778c-48r8c   1/1     Running   0          31s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   3m28s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           31s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-5869d7778c   1         1         1       31s
```

動作確認のために、Serviceを作成。

```shell
$ microk8s kubectl expose deployment nginx --port 80


$ microk8s kubectl get service nginx
NAME    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   10.152.183.125   <none>        80/TCP    36s
```

curlでアクセス。

```shell
$ curl 10.152.183.125
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
```

OKですね。

では、ラベルを確認して

```shell
$ microk8s kubectl get all --show-labels
NAME                         READY   STATUS    RESTARTS   AGE     LABELS
pod/nginx-5869d7778c-48r8c   1/1     Running   0          2m52s   app=nginx,pod-template-hash=5869d7778c

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE     LABELS
service/kubernetes   ClusterIP   10.152.183.1     <none>        443/TCP   5m49s   component=apiserver,provider=kubernetes
service/nginx        ClusterIP   10.152.183.125   <none>        80/TCP    104s    app=nginx

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE     LABELS
deployment.apps/nginx   1/1     1            1           2m52s   app=nginx

NAME                               DESIRED   CURRENT   READY   AGE     LABELS
replicaset.apps/nginx-5869d7778c   1         1         1       2m52s   app=nginx,pod-template-hash=5869d7778c
```

削除。

```shell
$ microk8s kubectl delete all -l app=nginx
pod "nginx-5869d7778c-48r8c" deleted
service "nginx" deleted
deployment.apps "nginx" deleted
replicaset.apps "nginx-5869d7778c" deleted
```

## オマケ

少し追加でコマンドを。

MicroK8sの起動と停止。

```shell
$ microk8s start


$ microk8s stop
```

MicroK8sをデフォルトの状態に戻すには`microk8s reset`を実行します。

```shell
$ microk8s reset
```

これでリソースが削除されるはずなのですが…

```shell
$ microk8s reset
Elevated permissions is needed for this operation. Please run this command with sudo.
```

実際に実行すると、`sudo`をつけなさいと言われます。

そして`sudo`をつけると、今度はコマンドが見つかりませんと言われます。

```shell
$ sudo microk8s reset
sudo: microk8s: コマンドが見つかりません
```

というわけで、実際に実行するならこうですね。

```shell
$ sudo $(which microk8s) reset
```

ちなみに`microk8s reset`した後にステータスを見ると、なぜかdnsアドオンは有効になっていませんでした…。

```shell
$ microk8s status --wait-ready
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    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
    cis-hardening        # (core) Apply CIS K8s hardening
    community            # (core) The community addons repository
    dashboard            # (core) The Kubernetes dashboard
    dns                  # (core) CoreDNS
    gpu                  # (core) Alias to nvidia add-on
    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
    nvidia               # (core) NVIDIA hardware (GPU and network) support
    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
    rook-ceph            # (core) Distributed Ceph storage using Rook
    storage              # (core) Alias to hostpath-storage add-on, deprecated
```

最後はアンインストール方法です。`snap remove`で削除します。

```shell
$ sudo snap remove microk8s
```