MultipassでKubernetesクラスタを動かす
とりあえずマルチノードで動かしたいならVMが良さそう、ということでMultipassを使う。
MultipasssでKubernetesを動かす記事はいろいろある。軽量k8sディストリビューションを使いたい。
minikube / microk8s
k3s
kubeadm
軽量k8sはこの辺を見ていた。
kindとか昔は使ってたけど、Docker-in-Dockerなのでちょっと複雑なのよな。
軽量k8sディストリビューションがマルチノードに対応してるかどうか。
minikube。ただこれはノードがdockerコンテナになるように思える。
microk8sはできそう。
k3sもいけそう。
k0sもあるのね、これもOK
kubeadmはまあ普通にできる、vagrantはもうアレだけども。
こんなのもあるのか。
まあちょっと今回はこちらはパスで。
順番にやってみることにする。
microk8s
canonical製なのね
GitHubレポジトリの説明を見てみる
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向けのチュートリアルに従って進めてみる。
すでに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はダメな模様。
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
ではマルチノード。以下の記事がわかりやすいように思える。
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台
sudo snap install multipass
sudo snap install microk8s --classic --channel=1.31/stable
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
これで準備OK
では、Control Planeでトークンを発行する。
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 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のデプロイが載っていた。
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はやっぱり楽しい。
チュートリアルは他にもあるので参考になりそう。
ドキュメントはこちら
multipassをVM基盤として使うならば同じcanonical製のmicrok8sを使うのがまあ無難よなーと思いつつも、一応他のものも試してみる。
k3s
こちらはRANCHER製というか今はSUSEか。
GitHubレポジトリの説明を見てみる
K3s - 軽量Kubernetes
軽量で、プロダクション対応のKubernetes。インストールが簡単で、メモリ消費は半分以下。100MB未満の単一バイナリに収まります。
適している用途:
- エッジコンピューティング
- IoT
- CI(継続的インテグレーション)
- 開発環境
- ARMアーキテクチャ
- Kubernetesの組み込み
- Kubernetesクラスターに関する高度な知識が不要な状況
K3sとは?
K3sは完全準拠でプロダクション対応のKubernetesディストリビューションです。以下の変更が加えられています:
- 単一バイナリにパッケージ化。
- sqlite3をデフォルトのストレージバックエンドとしてサポート。他にもetcd3、MariaDB、MySQL、Postgresをサポート。
- Kubernetesとその他のコンポーネントを単一の簡素なランチャーでラップ。
- デフォルトで安全性を確保。軽量環境向けに適切な初期設定を提供。
- OS依存性を最小化。必要なのは健全なカーネルとcgroupマウントのみ。
- 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はこちら
こちらは基本的に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だけは意識しないでいいだけ)ので、どうせ別管理ならこちらのほうが手っ取り早いかもしれないね。
あとものすごくシンプルなスクリプトを用意してくれている方がいた。
あと、k3sをラップするユーティリティもあるみたい。sshの設定が前提になるようなので今回は使用しなかったが、そこさえクリアすれば手元で簡単にできるみたい。
こちらはk3sをDocker上で実行するもの。D-in-Dだと思うので、今回のスコープには含めない。
k0s
こちらはMirantisが主導っぽいのかな?
GitHubレポジトリの説明
k0s - Team LensによるゼロフリクションKubernetes
概要
k0sは、Kubernetesクラスターを構築するために必要なすべての機能を備えたオールインワンのKubernetesディストリビューションで、使いやすさを考慮して単一のバイナリとしてパッケージ化されたオープンソースソフトウェアです。そのシンプルな設計、柔軟なデプロイメントオプション、控えめなシステム要件により、k0sは以下の環境に適しています。
- あらゆるクラウド
- ベアメタル
- エッジおよびIoT
k0sは、CNCF認定のKubernetesディストリビューションをインストールして運用する際の複雑さを大幅に軽減します。k0sを使えば、新しいクラスターを数分でブートストラップでき、開発者の負担をゼロにします。そのため、Kubernetesに関する特別なスキルや専門知識がなくても、誰でも簡単に始められます。
k0sはホストOSカーネル以外に依存関係を持たない単一のバイナリとして提供されます。追加のソフトウェアパッケージや設定なしで、任意のLinuxで動作します。セキュリティの脆弱性やパフォーマンスの問題もk0sディストリビューション内で直接修正可能で、クラスターを最新かつ安全な状態に保つのが非常に簡単です。
主な特徴
- 認定済みで100%アップストリームのKubernetes
- 多様なインストール方法: 単一ノード、マルチノード、エアギャップ、Docker
- 自動ライフサイクル管理 (k0sctlを使用): アップグレード、バックアップ、リストア
- 控えめなシステム要件: 1 vCPU、1 GB RAM
- 単一バイナリで提供され、カーネル以外の外部ランタイム依存なし
- コントロールプレーンの分離がデフォルトの柔軟なデプロイメントオプション
- 単一ノードから大規模で高可用性のクラスターまでスケーラブル
- カスタムContainer Network Interface (CNI)プラグインをサポート: Kube-Routerがデフォルト、Calicoを事前設定された代替として提供
- カスタムContainer Runtime Interface (CRI)プラグインをサポート: containerdがデフォルト
- Container Storage Interface (CSI)を使用してすべてのKubernetesストレージオプションをサポート
- 多様なデータストアバックエンドをサポート: etcd(マルチノードクラスターのデフォルト)、SQLite(単一ノードクラスターのデフォルト)、MySQL、PostgreSQL
- x86-64、ARM64、ARMv7をサポート
- Konnectivityサービス、CoreDNS、Metrics Serverを含む
Quick Start Guideはこちらだけど
マルチノードは以下の日本語の記事がまんま参考になる。
とりあえず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の手順に従ったもののように思える。
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
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
[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の扱いがもしかすると特別なのかも?
と思ったけども、
When you run the controller, you can pass --enable-worker flag so the controller also starts kubelet etc
なるほど、READMEに書いてあった以下の文、
- コントロールプレーンの分離がデフォルトの柔軟なデプロイメントオプション
はこういうことか。以下に詳しく載っている。
あと、日本語記事でも紹介されているが、LensというクラスタをGUI管理できるIDEが用意されている。これは便利そう。
まとめ
以下の3つを試したのだけど、
- microk8s
- k3s
- k0s
どれを選んでも、少なくとも以前kubeadmで頑張っていたときに比べると格段に楽ちん。
ちなみにクラウドだと、主要クラウドベンダー以外にもこんなにある。