Closed12

MultipassでKubernetesクラスタを動かす

kun432kun432

とりあえずマルチノードで動かしたいならVMが良さそう、ということでMultipassを使う。

MultipasssでKubernetesを動かす記事はいろいろある。軽量k8sディストリビューションを使いたい。

minikube / microk8s
https://tech.virtualtech.jp/entry/2022/03/17/104931

k3s
https://zenn.dev/mattn/articles/736874d5a1b7de

kubeadm
https://github.com/yujunliang/multipass-kubernetes

軽量k8sはこの辺を見ていた。

https://www.reddit.com/r/kubernetes/comments/19dcriv/unveiling_the_kubernetes_distros_side_by_side_k0s/

kindとか昔は使ってたけど、Docker-in-Dockerなのでちょっと複雑なのよな。

https://kun432.hatenablog.com/entry/local-kubernetes-with-kind

kun432kun432

軽量k8sディストリビューションがマルチノードに対応してるかどうか。

minikube。ただこれはノードがdockerコンテナになるように思える。

https://minikube.sigs.k8s.io/docs/tutorials/multi_node/

microk8sはできそう。

https://tech.virtualtech.jp/entry/2019/10/25/150802

k3sもいけそう。
https://tech-lab.sios.jp/archives/15620

k0sもあるのね、これもOK
https://harasou.jp/2021/03/18/multipass-k0s-lens/

kubeadmはまあ普通にできる、vagrantはもうアレだけども。

https://zenn.dev/kun432/books/ea7f9f2546e57811d263

kun432kun432

microk8s

canonical製なのね

https://microk8s.io/

GitHubレポジトリの説明を見てみる

https://github.com/canonical/microk8s

MicroK8s

最小で最速のKubernetes

単一パッケージで提供される完全準拠の軽量Kubernetes。42種類のLinuxで動作します。以下の用途に最適です:

  • 開発者用ワークステーション
  • IoT
  • エッジコンピューティング
  • CI/CD

Canonicalは、単一ノードのKubernetesクラスターをプロビジョニングする最も簡単な方法を提供しているかもしれません。– Kelsey Hightower

なぜMicroK8sを選ぶのか?

  • 小さい:
    開発者は、ノートPCやワークステーションで開発する際に、最小のK8sを求めます。MicroK8sはスタンドアロンのKubernetesを提供し、Ubuntu上で動作する場合、Azure AKS、Amazon EKS、Google GKEとの互換性があります。
  • シンプル:
    単一パッケージでインストール可能で、管理や運用を最小限に抑えます。可動部分がなく、シンプルさと確実性を実現。すべての依存関係が含まれています。
  • セキュア:
    セキュリティ問題に対するアップデートが提供され、即時適用やメンテナンスサイクルに合わせたスケジュール設定が可能です。
  • 最新:
    MicroK8sはアップストリームを追跡し、ベータ版、リリース候補版、正式版をアップストリームK8sと同日にリリースします。最新のK8sを追跡することも、1.10以降の任意のリリースバージョンに固定することもできます。
  • 包括的:
    MicroK8sには、一般的なK8s機能やサービス向けのキュレーション済みのマニフェストが含まれています:
    • サービスメッシュ: Istio、Linkerd
    • サーバーレス: Knative
    • 監視: Fluentd、Prometheus、Grafana、Metrics
    • Ingress、DNS、ダッシュボード、クラスタリング
    • Kubernetesの最新バージョンへの自動アップデート
    • AI/ML向けのGPGPUバインディング

MicroK8sを使って楽しいことをしている場合は、MicroK8s in the Wildにぜひ教えてください!

では、Mac向けのチュートリアルに従って進めてみる。

https://ubuntu.com/tutorials/install-microk8s-on-mac-os?&_ga=2.216519382.1314103417.1732808114-1985277247.1732600272#1-overview

すでにmultipassはインストール済みとする。Homebrewでmicrok8sをインストール。

brew install ubuntu/microk8s/microk8s

microk8s環境を初期化。--channelがkubernetesのバージョンなのかな、2025/11/29時点のKubernetesの最新は1.31みたい。イメージをダウンロードしてくるようなので、そこそこ時間がかかる。

microk8s install --channel=1.31

以下のように表示されれば完了している様子。

出力
microk8s (1.31/stable) v1.31.2 from Canonical✓ installed
microk8s-integrator-macos 0.1 from Canonical✓ installed
MicroK8s is up and running. See the available commands with `microk8s --help`.

起動しているか確認

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
    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
    rook-ceph            # (core) Distributed Ceph storage using Rook
    storage              # (core) Alias to hostpath-storage add-on, deprecated

起動しているっぽい。

nodeを見てみる。kubectlコマンドの前にmicrok8sをつけるのがmicrok8sでのCLIらしい。

microk8s kubectl get nodes
出力
NAME          STATUS   ROLES    AGE    VERSION
microk8s-vm   Ready    <none>   118s   v1.31.2

んー、これがControl Planeなのかな?とりあえずserviceも見てみる。

microk8s kubectl get services
出力
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.152.183.1   <none>        443/TCP   3m1s

multipass側からみてみる。

multipass list

なるほど、multipassと連携しているのだね。

出力
Name                    State             IPv4             Image
microk8s-vm             Running           192.168.65.2     Ubuntu 22.04 LTS
                                          10.1.254.64

とりあえずチュートリアルどおりにアプリをデプロイしてみる。

microk8s kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
出力
deployment.apps/kubernetes-bootcamp created

podを見てみる。

microk8s kubectl get pods
出力
NAME                                   READY   STATUS             RESTARTS      AGE
kubernetes-bootcamp-68cfbdbb99-4nxrt   0/1     CrashLoopBackOff   1 (13s ago)   29s

podはデプロイされているが、CrashLoopBackOffになってる。なんか調べてみた感じ、どうもApple Siliconだとkubernetes-bootcampはダメな模様。

https://github.com/kubernetes/website/issues/45131

deploymentsを見てみたけどこんな感じ。

microk8s kubectl get deployments -A
出力
NAMESPACE     NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
default       kubernetes-bootcamp       0/1     1            0           8m49s
kube-system   calico-kube-controllers   1/1     1            1           15m
kube-system   coredns                   1/1     1            1           15m

使い方を知りたいだけなので良しとする。

アドオンでDNSとStorageを有効にする。

microk8s enable dns 

既に有効化されているっぽい。

出力
Infer repository core for addon dns
Addon core/dns is already enabled
microk8s enable storage

こちらはどうやらstorageアドオンはdeprecatedになるらしいのでhostpath-storageを使えとのこと。

出力
Infer repository core for addon storage
DEPRECATION WARNING: 'storage' is deprecated and will soon be removed. Please use 'hostpath-storage' instead.

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.

hostpath-storageを有効してくれてるっぽい。

止めるときはstopで再度上げるときはstart

microk8s stop
出力
Stopped.
microk8s start

ではマルチノード。以下の記事がわかりやすいように思える。

https://devoriales.com/post/267/creating-a-local-multi-node-k8s-cluster-with-microk8s-and-multipass

multipass で Worker node用のVMを2台立ち上げる

multipass launch --name microk8s-vm2 --cpus 1 --mem 2G --disk 10G
multipass launch --name microk8s-vm3 --cpus 1 --mem 2G --disk 10G
multipass list
出力
Name                    State             IPv4             Image
microk8s-vm             Running           192.168.65.2     Ubuntu 22.04 LTS
                                          10.1.254.64
microk8s-vm2            Running           192.168.65.3     Ubuntu 24.04 LTS
microk8s-vm3            Running           192.168.65.4     Ubuntu 24.04 LTS

各VMで準備を行っていく。

Control Plane

multipass shell microk8s-vm
sudo snap install multipass
sudo usermod -a -G microk8s ubuntu
newgrp microk8s
sudo vi /etc/hosts

以下を追加

192.168.64.2 microk8s-vm
192.168.64.3 microk8s-vm2
192.168.64.4 microk8s-vm3

Worker node x 2台

microk8s-vm2/microk8s-vm3
sudo snap install multipass
microk8s-vm2/microk8s-vm3
sudo snap install microk8s --classic --channel=1.31/stable
microk8s-vm2/microk8s-vm3
sudo usermod -a -G microk8s ubuntu
newgrp microk8s
microk8s-vm2/microk8s-vm3
sudo vi /etc/hosts

以下を追加

192.168.64.2 microk8s-vm
192.168.64.3 microk8s-vm2
192.168.64.4 microk8s-vm3

これで準備OK

では、Control Planeでトークンを発行する。

microk8s-vm
microk8s add-node
出力
From the node you wish to join to this cluster, run the following:
microk8s join 192.168.65.2:25000/9c7f935e7259007853208c75c1805119/63684754c2ce

Use the '--worker' flag to join a node as a worker not running the control plane, eg:
microk8s join 192.168.65.2:25000/9c7f935e7259007853208c75c1805119/63684754c2ce --worker

If the node you are adding is not reachable through the default interface you can use one of the following:
microk8s join 192.168.65.2:25000/9c7f935e7259007853208c75c1805119/63684754c2ce
microk8s join 10.16.162.1:25000/9c7f935e7259007853208c75c1805119/63684754c2ce
microk8s join fde6:612c:4719:1f8f:5054:ff:feda:e91d:25000/9c7f935e7259007853208c75c1805119/63684754c2ce
microk8s join fd42:316a:2d17:a67a::1:25000/9c7f935e7259007853208c75c1805119/63684754c2ce

上記のうち、2つ目の--workerがついたものをWorker Node x 2でそれぞれ実行する

microk8s-vm2/microk8s-vm3
microk8s join 192.168.65.2:25000/9c7f935e7259007853208c75c1805119/63684754c2ce --worker
出力
Contacting cluster at 192.168.65.2

The node has joined the cluster and will appear in the nodes list in a few seconds.

This worker node gets automatically configured with the API server endpoints.
If the API servers are behind a loadbalancer please set the '--refresh-interval' to '0s' in:
    /var/snap/microk8s/current/args/apiserver-proxy
and replace the API server endpoints with the one provided by the loadbalancer in:
    /var/snap/microk8s/current/args/traefik/provider.yaml

Successfully joined the cluster.

microk8s-vm2はクラスタに追加されたっぽいのだが、microk8s-vm3のほうはこうなった

出力
Contacting cluster at 192.168.65.2
Connection failed. Invalid token (500).

お、どうやらWorker Nodeごとにトークンを発行する必要があるみたい。

❗Generate a new token on control plane node (microk8s-vm) since you cannot use the same token. This has to be done for each node you want to join to the cluster

再度生成し直して実行したら、microk8s-vm3もクラスタに追加された。

ではホストから確認する。

microk8s kubectl get nodes

クラスタに追加されている

出力
NAME           STATUS   ROLES    AGE     VERSION
microk8s-vm    Ready    <none>   67m     v1.31.2
microk8s-vm2   Ready    <none>   3m50s   v1.31.2
microk8s-vm3   Ready    <none>   61s     v1.31.2

別のチュートリアルにkubernetes-dashboardのデプロイが載っていた。

https://ubuntu.com/tutorials/installing-microk8s-on-apple-m1-silicon?&_ga=2.152875897.1314103417.1732808114-1985277247.1732600272#2-enabling-things

microk8s enable dashboard
出力
Infer repository core for addon dashboard
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

Adding argument --authentication-token-webhook to nodes.
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
microk8s dashboard-proxy
出力
Checking if Dashboard is running.

Infer repository core for addon dashboard
Waiting for Dashboard to come up.
Dashboard will be available at https://192.168.65.2:10443
Use the following token to login:
eyJhbGciOiJSUzI1NiIsImtpZCI6IkpCTGl2UjdpT0hJWDFfamd0VnFXWHJseGNnUW9tTkM0LWRJR1BHaGI5YXcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJtaWNyb2s4cy1kYXNoYm9hcmQtdG9rZW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGVmYXVsdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImY0MTFlYjgzLWQ3NTAtNDVlZS1iODgyLWY5MTNkODg4NzI1ZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpkZWZhdWx0In0.1QoqbufKT1dhPQ0ul_NrLtH0LdWVItvBkCMOlRCs1y44nUJme642FQ3XImIeWADNDuVsWzjH8uXipKJyf17h3BorxT3ooy7YMIkDILT9-jQmB5y8JtVE9PmN2kYRp5F2kNwpfe6I3mzfBR38gq6-m5o0MsSFXqNf1ZKYcHUwKMPQilpebhitDSMzZeTeIoqNuRablaHHqzv8VfuhAAjZP8PhzX6Fp02HP6Qc-dgsmzWg0VdpZl5ovy-Iz2eOHuFXavlVB4m7SplVfEG9w_INgw4RXimeBVeXRwwsfhePEmLmL8ivpxpWxf48VQrQL30M0-g0bjzuHReY1FmYcGAhEQ
Forwarding from 0.0.0.0:10443 -> 8443

上記のURL+トークンでdashboardにアクセスしてみるとこんな感じ。

ただし、追加したworker nodeの上げ下げについては、microk8sのCLI認識しているのはControl Planeだけなので、

microk8s stop

したとしても、Worker Nodeは起動している。

multipass list
出力
Name                    State             IPv4             Image
microk8s-vm             Stopped           --               Ubuntu 22.04 LTS
microk8s-vm2            Running           192.168.65.3     Ubuntu 24.04 LTS
                                          10.1.169.192
microk8s-vm3            Running           192.168.65.4     Ubuntu 24.04 LTS
                                          10.1.83.0

クラスタを全停止したい場合はmultipass側のCLIで止める必要がある。

multipass stop microk8s-vm2
multipass stop microk8s-vm3

とはいえ、昔vagrant+kubeadmでやったときよりもだいぶ簡単にできちゃうなぁ。便利だわ。

あと、K8S触るのめちゃめちゃ久しぶりだけどすっかり色々忘れてる。あれだけがっつり仕事でやってたのになぁ・・・もっかい勉強し直しだなー。ただそれでもK8Sはやっぱり楽しい。

チュートリアルは他にもあるので参考になりそう。

https://microk8s.io/tutorials

ドキュメントはこちら

https://microk8s.io/docs

kun432kun432

multipassをVM基盤として使うならば同じcanonical製のmicrok8sを使うのがまあ無難よなーと思いつつも、一応他のものも試してみる。

kun432kun432

k3s

こちらはRANCHER製というか今はSUSEか。

https://k3s.io/

GitHubレポジトリの説明を見てみる

https://github.com/k3s-io/k3s/

K3s - 軽量Kubernetes

軽量で、プロダクション対応のKubernetes。インストールが簡単で、メモリ消費は半分以下。100MB未満の単一バイナリに収まります。

適している用途:

  • エッジコンピューティング
  • IoT
  • CI(継続的インテグレーション)
  • 開発環境
  • ARMアーキテクチャ
  • Kubernetesの組み込み
  • Kubernetesクラスターに関する高度な知識が不要な状況

K3sとは?

K3sは完全準拠でプロダクション対応のKubernetesディストリビューションです。以下の変更が加えられています:

  1. 単一バイナリにパッケージ化。
  2. sqlite3をデフォルトのストレージバックエンドとしてサポート。他にもetcd3、MariaDB、MySQL、Postgresをサポート。
  3. Kubernetesとその他のコンポーネントを単一の簡素なランチャーでラップ。
  4. デフォルトで安全性を確保。軽量環境向けに適切な初期設定を提供。
  5. OS依存性を最小化。必要なのは健全なカーネルとcgroupマウントのみ。
  6. kubelet API用のポート公開が不要。WebSocketトンネルを介してコントロールプレーンノードにAPIを公開。

K3sは以下の技術を一つの統合ディストリビューションにまとめています:

  • Containerd & runc(コンテナランタイム)
  • Flannel(CNI:Container Network Interface)
  • CoreDNS(DNSサービス)
  • Metrics Server(メトリクス収集)
  • Traefik(Ingressコントローラー)
  • Klipper-lb(組み込みサービスロードバランサープロバイダー)
  • Kube-router(ネットワークポリシー用コントローラー)
  • Helm-controller(HelmマニフェストのCRD駆動型デプロイを実現)
  • Kine(etcdを他のデータベースに置き換えるためのデータストアシム)
  • Local-path-provisioner(ローカルストレージを使用したボリュームプロビジョニング)
  • ホストユーティリティ: iptables/nftables、ebtables、ethtool、socat

これらの技術は無効化や他の技術への置き換えが可能です。

さらに、K3sはKubernetes運用を簡略化するため、以下の機能を提供します:

  • KubernetesコンポーネントのTLS証明書管理
  • ワーカーノードとサーバーノード間の接続管理
  • ローカルマニフェストからのKubernetesリソースのリアルタイム自動デプロイ
  • 組み込みのetcdクラスター管理

Quick-Start Guideはこちら
https://docs.k3s.io/quick-start

こちらは基本的にNode用のVMをmultipassで用意する感じになる。まずControl Planeから。

multipass launch --name k3s-master --cpus 2 --memory 2G --disk 10G

k3sをインストール

multipass exec k3s-master -- bash -c "curl -sfL https://get.k3s.io | sh -"

/etc/rancher/k3s/k3s.yamlにkubeconfigが用意されるので、ホスト側からだとこんな感じかな。

multipass exec k3s-master sudo KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl get nodes
出力
NAME         STATUS   ROLES                  AGE     VERSION
k3s-master   Ready    control-plane,master   3m16s   v1.30.6+k3s1

おー、もう上がってる。

ではWorker Node x2をmultipassで用意する

multipass launch --name k3s-worker1 --cpus 1 --memory 2G --disk 10G
multipass launch --name k3s-worker2 --cpus 1 --memory 2G --disk 10G

IPアドレスを確認

multipass list
出力
Name                    State             IPv4             Image
k3s-master              Running           192.168.65.5     Ubuntu 24.04 LTS
                                          10.42.0.0
                                          10.42.0.1
k3s-worker1             Running           192.168.65.6     Ubuntu 24.04 LTS
k3s-worker2             Running           192.168.65.7     Ubuntu 24.04 LTS

各VMの/etc/hostsを修正

multipass exec k3s-master -- bash -c 'echo -e "192.168.65.5\tk3s-master\n192.168.65.6\tk3s-worker1\n192.168.65.7\tk3s-worker2\n" | sudo tee -a /etc/hosts'
multipass exec k3s-worker1 -- bash -c 'echo -e "192.168.65.5\tk3s-master\n192.168.65.6\tk3s-worker1\n192.168.65.7\tk3s-worker2\n" | sudo tee -a /etc/hosts'
multipass exec k3s-worker2 -- bash -c 'echo -e "192.168.65.5\tk3s-master\n192.168.65.6\tk3s-worker1\n192.168.65.7\tk3s-worker2\n" | sudo tee -a /etc/hosts'

worker x 2台をクラスタに追加する。まずControl Planeのトークンを確認する。

multipass exec k3s-master sudo cat /var/lib/rancher/k3s/server/node-token

こんな感じの出力が返ってくる。

出力
K10fd31391207cb698b5c20837777ef691cfadca6a631151339639a213d56b8169f::server:9d68da6b064da23667d421b688b2459a

これを使って、workerにk3sをインストールする。K3S_URLのホスト名はhostsで指定したcontrol planeのホスト名を指定する。

multipass exec k3s-worker1 -- bash -c "curl -sfL https://get.k3s.io | K3S_URL=https://k3s-master:6443 K3S_TOKEN=K10fd31391207cb698b5c20837777ef691cfadca6a631151339639a213d56b8169f::server:9d68da6b064da23667d421b688b2459a sh -"

登録されたっぽい。

出力
[INFO]  Finding release for channel stable
[INFO]  Using v1.30.6+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.30.6+k3s1/sha256sum-arm64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.30.6+k3s1/k3s-arm64
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO]  systemd: Enabling k3s-agent unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.
[INFO]  systemd: Starting k3s-agent

もう1台も。

multipass exec k3s-worker2 -- bash -c "curl -sfL https://get.k3s.io | K3S_URL=https://k3s-master:6443 K3S_TOKEN=K10fd31391207cb698b5c20837777ef691cfadca6a631151339639a213d56b8169f::server:9d68da6b064da23667d421b688b2459a sh -"

control planeに確認してみる。

multipass exec k3s-master sudo KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl get nodes
出力
NAME          STATUS   ROLES                  AGE    VERSION
k3s-master    Ready    control-plane,master   31m    v1.30.6+k3s1
k3s-worker1   Ready    <none>                 112s   v1.30.6+k3s1
k3s-worker2   Ready    <none>                 5s     v1.30.6+k3s1

おー、マルチノードのクラスタがもうできた。

こちらはmultipassとk3sの操作は全く別。ただし、microk8sでもマルチノードの場合はmultipassの操作を全部ラップしてくれるわけではない(control planeだけは意識しないでいいだけ)ので、どうせ別管理ならこちらのほうが手っ取り早いかもしれないね。

あとものすごくシンプルなスクリプトを用意してくれている方がいた。

https://gist.github.com/shaposhnikoff/eba08e1affaf6869ca4ea64219b23a94

kun432kun432

あと、k3sをラップするユーティリティもあるみたい。sshの設定が前提になるようなので今回は使用しなかったが、そこさえクリアすれば手元で簡単にできるみたい。

https://github.com/alexellis/k3sup

こちらはk3sをDocker上で実行するもの。D-in-Dだと思うので、今回のスコープには含めない。

https://k3d.io/v5.4.6/

kun432kun432

k0s

こちらはMirantisが主導っぽいのかな?

https://k0sproject.io/

GitHubレポジトリの説明

https://github.com/k0sproject/k0s

k0s - Team LensによるゼロフリクションKubernetes

概要

k0sは、Kubernetesクラスターを構築するために必要なすべての機能を備えたオールインワンのKubernetesディストリビューションで、使いやすさを考慮して単一のバイナリとしてパッケージ化されたオープンソースソフトウェアです。そのシンプルな設計、柔軟なデプロイメントオプション、控えめなシステム要件により、k0sは以下の環境に適しています。

  • あらゆるクラウド
  • ベアメタル
  • エッジおよびIoT

k0sは、CNCF認定のKubernetesディストリビューションをインストールして運用する際の複雑さを大幅に軽減します。k0sを使えば、新しいクラスターを数分でブートストラップでき、開発者の負担をゼロにします。そのため、Kubernetesに関する特別なスキルや専門知識がなくても、誰でも簡単に始められます。

k0sはホストOSカーネル以外に依存関係を持たない単一のバイナリとして提供されます。追加のソフトウェアパッケージや設定なしで、任意のLinuxで動作します。セキュリティの脆弱性やパフォーマンスの問題もk0sディストリビューション内で直接修正可能で、クラスターを最新かつ安全な状態に保つのが非常に簡単です。

主な特徴

Quick Start Guideはこちらだけど

https://docs.k0sproject.io/stable/install/

マルチノードは以下の日本語の記事がまんま参考になる。

https://harasou.jp/2021/03/18/multipass-k0s-lens/

とりあえずControl Plane + Worker Node x 2をmultipassで用意。

multipass launch --name k0s-master --cpus 2 --memory 2G --disk 10G
multipass launch --name k0s-worker1 --cpus 1 --memory 2G --disk 10G
multipass launch --name k0s-worker2 --cpus 1 --memory 2G --disk 10G
multipass list
出力
Name                    State             IPv4             Image
k0s-master              Running           192.168.65.8     Ubuntu 24.04 LTS
k0s-worker1             Running           192.168.65.9     Ubuntu 24.04 LTS
k0s-worker2             Running           192.168.65.10    Ubuntu 24.04 LTS

ではまずControl Planeから。

k0sのインストール

multipass exec k0s-master -- bash -c "curl --proto '=https' --tlsv1.2 -sSf https://get.k0s.sh | sudo sh"
出力
Downloading k0s from URL: https://github.com/k0sproject/k0s/releases/download/v1.31.2+k0s.0/k0s-v1.31.2+k0s.0-arm64
k0s is now executable in /usr/local/bin
You can use it to complete the installation of k0s on this node,
see https://docs.k0sproject.io/stable/install/ for more information.

で次に進めようと思うと、Quick Start Guideと上記の日本語の記事の手順を見ているとコマンドが違うのだけど、どうやらManual Installの手順に従ったもののように思える。

https://docs.k0sproject.io/stable/k0s-multi-node/

You can manually set up k0s nodes by creating a multi-node cluster that is locally managed on each node. This involves several steps, to first install each node separately, and to then connect the node together using access tokens.

なるほど、シングルノードであればQuick Start Guideの手順が簡単なのでそれに従えばいいけど、自分はマルチノードを試したいので、Manual Installの手順を見ていく。

設定ファイルを作成する

multipass exec k0s-master -- sudo mkdir -p /etc/k0s
multipass exec k0s-master -- sudo bash -c "k0s config create > /etc/k0s/k0s.yaml"

設定ファイルはこういう内容だった

multipass exec k0s-master -- cat /etc/k0s/k0s.yaml
/etc/k0s/k0s.yaml
apiVersion: k0s.k0sproject.io/v1beta1
kind: ClusterConfig
metadata:
  name: k0s
spec:
  api:
    address: 192.168.65.8
    k0sApiPort: 9443
    port: 6443
    sans:
    - 192.168.65.8
    - fde6:612c:4719:1f8f:5054:ff:feed:59b5
    - fe80::5054:ff:feed:59b5
  controllerManager: {}
  extensions:
    helm:
      concurrencyLevel: 5
  installConfig:
    users:
      etcdUser: etcd
      kineUser: kube-apiserver
      konnectivityUser: konnectivity-server
      kubeAPIserverUser: kube-apiserver
      kubeSchedulerUser: kube-scheduler
  konnectivity:
    adminPort: 8133
    agentPort: 8132
  network:
    clusterDomain: cluster.local
    dualStack:
      enabled: false
    kubeProxy:
      iptables:
        minSyncPeriod: 0s
        syncPeriod: 0s
      ipvs:
        minSyncPeriod: 0s
        syncPeriod: 0s
        tcpFinTimeout: 0s
        tcpTimeout: 0s
        udpTimeout: 0s
      metricsBindAddress: 0.0.0.0:10249
      mode: iptables
      nftables:
        minSyncPeriod: 0s
        syncPeriod: 0s
    kuberouter:
      autoMTU: true
      hairpin: Enabled
      metricsPort: 8080
    nodeLocalLoadBalancing:
      enabled: false
      envoyProxy:
        apiServerBindPort: 7443
        konnectivityServerBindPort: 7132
      type: EnvoyProxy
    podCIDR: 10.244.0.0/16
    provider: kuberouter
    serviceCIDR: 10.96.0.0/12
  scheduler: {}
  storage:
    etcd:
      peerAddress: 192.168.65.8
    type: etcd
  telemetry:
    enabled: true

k0sのsystemd unitファイルを作成

multipass exec k0s-master -- sudo k0s install controller -c /etc/k0s/k0s.yaml

以下に作成されている

multipass exec k0s-master -- cat /etc/systemd/system/k0scontroller.service
/etc/systemd/system/k0scontroller.service
[Unit]
Description=k0s - Zero Friction Kubernetes
Documentation=https://docs.k0sproject.io
ConditionFileIsExecutable=/usr/local/bin/k0s

After=network-online.target
Wants=network-online.target

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/local/bin/k0s controller --config=/etc/k0s/k0s.yaml

RestartSec=10
Delegate=yes
KillMode=process
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
LimitNOFILE=999999
Restart=always

[Install]
WantedBy=multi-user.target

k0sを起動。Quick Start Guideではk8s startで起動するようなのだけど、systemdに登録してあるのでsystemctlで。

multipass exec k0s-master -- sudo systemctl start k0scontroller
multipass exec k0s-master -- sudo systemctl status k0scontroller
出力
● k0scontroller.service - k0s - Zero Friction Kubernetes
     Loaded: loaded (/etc/systemd/system/k0scontroller.service; enabled; preset: enabled)
     Active: active (running) since Sat 2024-11-30 12:15:36 JST; 14s ago
       Docs: https://docs.k0sproject.io
   Main PID: 3791 (k0s)
      Tasks: 57
     Memory: 626.2M (peak: 626.7M)
        CPU: 8.146s
     CGroup: /system.slice/k0scontroller.service
(snip)

k0sの状態を確認してみる。

multipass exec k0s-master -- sudo k0s status
出力
Version: v1.31.2+k0s.0
Process ID: 3791
Role: controller
Workloads: false
SingleNode: false

kubectlもk0sに組み込まれているのでそれも実行してみる。

multipass exec k0s-master -- sudo k0s kubectl get nodes

が、こちらは何も出力されないなぁ、どうもまだこの時点ではクラスタではないのかもしれない。

出力
No resources found

とりあえず進める。Worker Node用のトークンを作成。ホスト側にファイルが保存される。

multipass exec k0s-master -- sudo k0s token create --role=worker  > token-worker

ではここからWorker Nodeを準備する。基本的にはControl Planeと同じような手順だけど、

k0sのインストール

multipass exec k0s-worker1 -- bash -c "curl --proto '=https' --tlsv1.2 -sSf https://get.k0s.sh | sudo sh"
multipass exec k0s-worker2 -- bash -c "curl --proto '=https' --tlsv1.2 -sSf https://get.k0s.sh | sudo sh"

設定ファイルを作成

multipass exec k0s-worker1 -- sudo mkdir -p /etc/k0s
multipass exec k0s-worker1 -- sudo bash -c "k0s config create > /etc/k0s/k0s.yaml"
multipass exec k0s-worker2 -- sudo mkdir -p /etc/k0s
multipass exec k0s-worker2 -- sudo bash -c "k0s config create > /etc/k0s/k0s.yaml"

で、workerでもk0sを起動するのだが、ここで先程のトークンが必要になる。ホスト側に出力しておいたトークンをworkerにアップロード。

multipass transfer token-worker k0s-worker1:token-worker
multipass transfer token-worker k0s-worker2:token-worker

そして、/etc/k0s以下に配置する

multipass exec k0s-worker1 -- sudo mv token-worker /etc/k0s/.
multipass exec k0s-worker2 -- sudo mv token-worker /etc/k0s/.

systemd unitファイルを作成。workerでは、ここでk0s installの引数がworkerになり、先ほどのトークンを指定するという形になる様子。ちなみに-cはworkerのオプションには今はない様子。

multipass exec k0s-worker1 -- sudo k0s install worker --token-file /etc/k0s/token-worker
multipass exec k0s-worker2 -- sudo k0s install worker --token-file /etc/k0s/token-worker

では起動。k0s install workerだとk0sworkerというサービス名になる。

multipass exec k0s-worker1 -- sudo systemctl start k0sworker
multipass exec k0s-worker2 -- sudo systemctl start k0sworker

状態確認

multipass exec k0s-worker1 -- sudo k0s status
出力
Version: v1.31.2+k0s.0
Process ID: 2768
Role: worker
Workloads: true
SingleNode: false
Kube-api probing successful: true
Kube-api probing last error:
multipass exec k0s-worker2 -- sudo k0s status
出力
Version: v1.31.2+k0s.0
Process ID: 2227
Role: worker
Workloads: true
SingleNode: false
Kube-api probing successful: true
Kube-api probing last error:

kubectlで再度確認してみる。

multipass exec k0s-master -- sudo k0s kubectl get nodes

workerは表示されている。なるほど・・・

出力
NAME          STATUS   ROLES    AGE     VERSION
k0s-worker1   Ready    <none>   2m23s   v1.31.2+k0s
k0s-worker2   Ready    <none>   2m19s   v1.31.2+k0s

ドキュメントにはControl Planeを追加する手順も記載されているので、恐らくだけど1台目のControl Planeの扱いがもしかすると特別なのかも?

と思ったけども、

https://github.com/k0sproject/k0s/issues/4854

When you run the controller, you can pass --enable-worker flag so the controller also starts kubelet etc

なるほど、READMEに書いてあった以下の文、

  • コントロールプレーンの分離がデフォルトの柔軟なデプロイメントオプション

はこういうことか。以下に詳しく載っている。

https://github.com/k0sproject/k0s/blob/main/docs/networking.md#controller-worker-communication

kun432kun432

まとめ

以下の3つを試したのだけど、

  • microk8s
  • k3s
  • k0s

どれを選んでも、少なくとも以前kubeadmで頑張っていたときに比べると格段に楽ちん。

このスクラップは21日前にクローズされました