📌

Raspberry Piにkubeadmでk8sをinstallしてみた

2024/02/26に公開

やりたいこと

Raspberry Piにkubeadmでk8sをインストールする。Raspberry Piは1台でシングルノードクラスターとする。

参考ドキュメント

前提の確認

  1. OSがLinuxであること
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
  1. RAMが2GB以上であること
$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.7Gi       387Mi       2.5Gi        18Mi       940Mi       3.3Gi
Swap:           99Mi          0B        99Mi
  1. 2CPU以上であること
$ cat /proc/cpuinfo
processor	: 0
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 1
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 2
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 3
BogoMIPS	: 108.00
Features	: fp asimd evtstrm crc32 cpuid
CPU implementer	: 0x41
CPU architecture: 8
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

Hardware	: BCM2835
Revision	: c03115
Serial		: 10000000a722100b
Model		: Raspberry Pi 4 Model B Rev 1.5
  1. クラスター内のすべてのマシン間の完全なネットワーク接続
    今回は、シングルノードクラスターなので、マシン間のNW接続は不要です。

  2. 6443ポートが開いていること

$ nc 127.0.0.1 6443
(UNKNOWN) [127.0.0.1] 6443 (?) : Connection refused

開いてないので、FWを設定する

  • ufwをインストールしてポート解放
$ sudo apt-get install ufw
$ sudo ufw enable
$ sudo ufw allow 6443/tcp
  1. swapを無効化すること
sudo swapoff --all
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile
systemctl status dphys-swapfile

設定手順

  1. iptables 関連の設定
  • 以下のコマンドを実行する
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

$ sudo modprobe overlay
$ sudo modprobe br_netfilter

# sysctl params required by setup, params persist across reboots
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Apply sysctl params without reboot
$ sudo sysctl --system
  • br_netfilter, overlay modules のカーネルモジュールがロードされているか確認する
$ lsmod | grep br_netfilter
$ lsmod | grep overlay
  • net.bridge.bridge-nf-call-iptables, net.bridge.bridge-nf-call-ip6tables, net.ipv4.ip_forwardの値が1であること
$ sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
  1. CRIとして「containerd」をインストールする
    https://github.com/containerd/containerd/blob/main/docs/getting-started.md
  • OSを確認
 $  uname -m
aarch64

-> arm64

  • Step 1: Installing containerd
$ sudo tar Cxzvf /usr/local containerd-1.7.13-linux-arm64.tar.gz 
bin/
bin/containerd-shim-runc-v2
bin/ctr
bin/containerd-shim
bin/containerd-shim-runc-v1
bin/containerd
bin/containerd-stress

systemctl daemon-reload
systemctl enable --now containerd
  • Step 2: Installing runc
$ sudo install -m 755 runc.arm64 /usr/local/sbin/runc
  • Step 3: Installing CNI plugins
$ sudo  tar Cxzvf /opt/cni/bin cni-plugins-linux-arm64-v1.4.0.tgz 
./
./loopback
./bandwidth
./ptp
./vlan
./host-device
./tuning
./vrf
./sbr
./tap
./dhcp
./static
./firewall
./macvlan
./dummy
./bridge
./ipvlan
./portmap
./host-local

3.パッケージ インデックスを更新しapt、Kubernetesaptリポジトリを使用するために必要なパッケージをインストールします。

sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
  1. Kubernetes パッケージ リポジトリの公開署名キーをダウンロードする
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
  1. Kubernetesaptリポジトリを追加する
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
  1. パッケージ インデックスを更新しapt、kubelet、kubeadm、kubectl をインストールし、それらのバージョンを固定します
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
  1. コントロールプレーンノードを初期化する
kubeadm init
  1. nodeを確認する
$ kubectl get node
NAME              STATUS   ROLES           AGE   VERSION
raspberry-ikura   Ready    control-plane   85m   v1.29.2
  1. シングルノード構成なので、コントロールプレーンでもPodを起動できるようにする
$ kubectl taint nodes --all node-role.kubernetes.io/control-plane-
node/raspberry-ikura untainted

Discussion