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>