Raspberry PiでRKE2クラスタ構築
RKE2
はKubernetes構築ツールです。
いつの間にかARM64をサポート
していたので構築してみました。
事前準備
まずはノードを準備します。
Raspberry Pi ImagerでUbuntu Server 22.04.3 LTS(64bit)をmicroSDにインストールします。
以下設定メモ
root@ubuntu:~# vi /etc/netplan/99_config.yaml
root@ubuntu:~# cat /etc/netplan/99_config.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.0.51/24
nameservers:
addresses: [192.168.0.254]
routes:
- to: default
via: 192.168.0.254
root@ubuntu:~# netplan apply
root@ubuntu:~# hostnamectl set-hostname k8s1
root@ubuntu:~# reboot
ubuntu@k8s1:~$ sudo apt update && sudo apt upgrade -y
ubuntu@k8s1:~$ cat << _EOF_ | sudo tee -a /etc/hosts
192.168.0.51 k8s1
192.168.0.52 k8s2
_EOF_
192.168.0.51 k8s1
192.168.0.52 k8s2
今回はrke2-server1台、rke2-agent1台で構築してみます。
一応、OS情報です。
root@k8s1:~# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
root@k8s1:~# uname -m
aarch64
サーバーノードインストール
ドキュメントのクイックスタート
を参考に進めてみましたが、
そのままだとエラーになりました。
root@k8s1:~# curl -sfL https://get.rke2.io | sh -
[INFO] finding release for channel stable
[INFO] using v1.26.10+rke2r2 as release
[INFO] downloading checksums at https://github.com/rancher/rke2/releases/download/v1.26.10+rke2r2/sha256sum-arm64.txt
curl: (22) The requested URL returned error: 404
ARM64サポートのissue
に書いてありますが、
1.27以降のサポートなので、バージョンを指定する必要があります。
最新のv1.28.3+rke2r2はcanalがRunningにならなかったので、1.27で構築しました。
root@k8s1:~# export INSTALL_RKE2_VERSION=v1.27.7+rke2r2
root@k8s1:~# curl -sfL https://get.rke2.io | sh -
[INFO] using v1.27.7+rke2r2 as release
[INFO] downloading checksums at https://github.com/rancher/rke2/releases/download/v1.27.7+rke2r2/sha256sum-arm64.txt
[INFO] downloading tarball at https://github.com/rancher/rke2/releases/download/v1.27.7+rke2r2/rke2.linux-arm64.tar.gz
[INFO] verifying tarball
[INFO] unpacking tarball file to /usr/local
root@k8s1:~# systemctl enable rke2-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/rke2-server.service → /usr/local/lib/systemd/system/rke2-server.service.
root@k8s1:~# systemctl start rke2-server.service
kubectlも追加でインストールされますので、 こちら を参考にPodが確認できます。
root@k8s1:~# export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
/var/lib/rancher/rke2/bin/kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s1 Ready control-plane,etcd,master 3m25s v1.27.7+rke2r2
root@k8s1:~# /var/lib/rancher/rke2/bin/kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system cloud-controller-manager-k8s1 1/1 Running 3 (46s ago) 6m10s
kube-system etcd-k8s1 1/1 Running 0 5m59s
kube-system helm-install-rke2-canal-2cq2g 0/1 Completed 0 6m14s
kube-system helm-install-rke2-coredns-f9ncw 0/1 Completed 0 6m14s
kube-system helm-install-rke2-ingress-nginx-g88vf 0/1 Completed 0 6m14s
kube-system helm-install-rke2-metrics-server-pssrl 0/1 Completed 0 6m14s
kube-system helm-install-rke2-snapshot-controller-crd-2dggz 0/1 Completed 0 6m13s
kube-system helm-install-rke2-snapshot-controller-cx7jk 0/1 Completed 1 6m14s
kube-system helm-install-rke2-snapshot-validation-webhook-2nmrj 0/1 Completed 0 6m13s
kube-system kube-apiserver-k8s1 1/1 Running 0 5m50s
kube-system kube-controller-manager-k8s1 1/1 Running 3 (46s ago) 6m12s
kube-system kube-proxy-k8s1 1/1 Running 0 6m5s
kube-system kube-scheduler-k8s1 1/1 Running 3 (44s ago) 6m12s
kube-system rke2-canal-q64sj 2/2 Running 0 5m4s
kube-system rke2-coredns-rke2-coredns-autoscaler-6f97df447-292sc 1/1 Running 0 5m51s
kube-system rke2-coredns-rke2-coredns-f6c9f9649-jvsxb 1/1 Running 0 5m51s
kube-system rke2-ingress-nginx-controller-qt45c 1/1 Running 0 2m9s
kube-system rke2-metrics-server-6d79d977db-ktbkc 1/1 Running 0 3m2s
kube-system rke2-snapshot-controller-7d6476d7cb-gt2tx 1/1 Running 0 2m48s
kube-system rke2-snapshot-validation-webhook-5649fbd66c-nhrtr 1/1 Running 0 3m2s
エージェントノードインストール
RKE2ではworkerのことをAgentと言うみたいですね。
事前にサーバーノードでAgent登録のためのトークンを取得します。
root@k8s1:~# cat /var/lib/rancher/rke2/server/node-token
K107a822b347a46600aa8ca68f97a0caf9279c87068c250a3e0b47ecd4fac2bbe29::server:2a453cfb2cb55f5d130e32754e82fead
2台目のRaspberry Piでタイプを変更してインストールスクリプトを実行します。
root@k8s2:~# export INSTALL_RKE2_VERSION=v1.27.7+rke2r2
root@k8s2:~# curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh -
[INFO] using v1.27.7+rke2r2 as release
[INFO] downloading checksums at https://github.com/rancher/rke2/releases/download/v1.27.7+rke2r2/sha256sum-arm64.txt
[INFO] downloading tarball at https://github.com/rancher/rke2/releases/download/v1.27.7+rke2r2/rke2.linux-arm64.tar.gz
[INFO] verifying tarball
[INFO] unpacking tarball file to /usr/local
root@k8s2:~# systemctl enable rke2-agent.service
Created symlink /etc/systemd/system/multi-user.target.wants/rke2-agent.service → /usr/local/lib/systemd/system/rke2-agent.service.
サービスを起動する前に設定ファイルを作成します。
serverはサーバーノードのIP、tokenは先ほど取得した文字列です。
root@k8s2:~# mkdir -p /etc/rancher/rke2/
root@k8s2:~# vim /etc/rancher/rke2/config.yaml
root@k8s2:~# cat /etc/rancher/rke2/config.yaml
server: https://192.168.0.51:9345
token: K107a822b347a46600aa8ca68f97a0caf9279c87068c250a3e0b47ecd4fac2bbe29::server:2a453cfb2cb55f5d130e32754e82fead
root@k8s2:~# systemctl start rke2-agent.service
今回サーバーノード1台なのでIP直に書いてますが、
複数にする場合
L4ロードバランサーなどを使うようにと書いてあります。
kube-vip
と言うのが使えそうなので今度試してみたいですね。
エージェントが登録できれば以下のようになると思います。
root@k8s1:~# /var/lib/rancher/rke2/bin/kubectl get pod -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system cloud-controller-manager-k8s1 1/1 Running 3 (24m ago) 30m 192.168.0.51 k8s1 <none> <none>
kube-system etcd-k8s1 1/1 Running 0 30m 192.168.0.51 k8s1 <none> <none>
kube-system helm-install-rke2-canal-2cq2g 0/1 Completed 0 30m 192.168.0.51 k8s1 <none> <none>
kube-system helm-install-rke2-coredns-f9ncw 0/1 Completed 0 30m 192.168.0.51 k8s1 <none> <none>
kube-system helm-install-rke2-ingress-nginx-g88vf 0/1 Completed 0 30m 10.42.0.5 k8s1 <none> <none>
kube-system helm-install-rke2-metrics-server-pssrl 0/1 Completed 0 30m 10.42.0.6 k8s1 <none> <none>
kube-system helm-install-rke2-snapshot-controller-crd-2dggz 0/1 Completed 0 30m 10.42.0.4 k8s1 <none> <none>
kube-system helm-install-rke2-snapshot-controller-cx7jk 0/1 Completed 1 30m 10.42.0.2 k8s1 <none> <none>
kube-system helm-install-rke2-snapshot-validation-webhook-2nmrj 0/1 Completed 0 30m 10.42.0.3 k8s1 <none> <none>
kube-system kube-apiserver-k8s1 1/1 Running 0 30m 192.168.0.51 k8s1 <none> <none>
kube-system kube-controller-manager-k8s1 1/1 Running 3 (24m ago) 30m 192.168.0.51 k8s1 <none> <none>
kube-system kube-proxy-k8s1 1/1 Running 0 30m 192.168.0.51 k8s1 <none> <none>
kube-system kube-proxy-k8s2 1/1 Running 0 5m2s 192.168.0.52 k8s2 <none> <none>
kube-system kube-scheduler-k8s1 1/1 Running 3 (24m ago) 30m 192.168.0.51 k8s1 <none> <none>
kube-system rke2-canal-bt87f 2/2 Running 0 5m2s 192.168.0.52 k8s2 <none> <none>
kube-system rke2-canal-q64sj 2/2 Running 0 29m 192.168.0.51 k8s1 <none> <none>
kube-system rke2-coredns-rke2-coredns-autoscaler-6f97df447-292sc 1/1 Running 0 30m 10.42.0.8 k8s1 <none> <none>
kube-system rke2-coredns-rke2-coredns-f6c9f9649-gbzvg 1/1 Running 0 4m52s 10.42.1.2 k8s2 <none> <none>
kube-system rke2-coredns-rke2-coredns-f6c9f9649-jvsxb 1/1 Running 0 30m 10.42.0.7 k8s1 <none> <none>
kube-system rke2-ingress-nginx-controller-qt45c 1/1 Running 0 26m 10.42.0.13 k8s1 <none> <none>
kube-system rke2-ingress-nginx-controller-tdmmh 1/1 Running 0 2m29s 10.42.1.3 k8s2 <none> <none>
kube-system rke2-metrics-server-6d79d977db-ktbkc 1/1 Running 0 27m 10.42.0.10 k8s1 <none> <none>
kube-system rke2-snapshot-controller-7d6476d7cb-gt2tx 1/1 Running 0 26m 10.42.0.12 k8s1 <none> <none>
kube-system rke2-snapshot-validation-webhook-5649fbd66c-nhrtr 1/1 Running 0 27m 10.42.0.9 k8s1 <none> <none>
root@k8s1:~# /var/lib/rancher/rke2/bin/kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s1 Ready control-plane,etcd,master 31m v1.27.7+rke2r2
k8s2 Ready <none> 5m47s v1.27.7+rke2r2
サーバーノードのtaintsについて
こちら
に書いてあるのですが、
デフォルト設定だとコントロールプレーンもtaintsがつかないので、ワークロードのPodが起動されます。
RKE2の設定ファイルでtaintsを付けることができます。
root@k8s1:~# /var/lib/rancher/rke2/bin/kubectl describe node k8s1 | grep -i taint
Taints: <none>
root@k8s1:~# /var/lib/rancher/rke2/bin/kubectl create deploy nginx --image=nginx --replicas=2
deployment.apps/nginx created
root@k8s1:~# /var/lib/rancher/rke2/bin/kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-77b4fdf86c-c4qrv 1/1 Running 0 82s 10.42.0.15 k8s1 <none> <none>
nginx-77b4fdf86c-d9gnj 1/1 Running 0 82s 10.42.1.4 k8s2 <none> <none>