📌
Raspberry Piにkubeadmでk8sをinstallしてみた
やりたいこと
Raspberry Piにkubeadmでk8sをインストールする。Raspberry Piは1台でシングルノードクラスターとする。
参考ドキュメント
- kubernetes公式
- containerd
- https://docs.docker.com/engine/install/ubuntu/
前提の確認
- 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/"
- 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
- 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
-
クラスター内のすべてのマシン間の完全なネットワーク接続
今回は、シングルノードクラスターなので、マシン間のNW接続は不要です。 -
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
- swapを無効化すること
sudo swapoff --all
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile
systemctl status dphys-swapfile
設定手順
- 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
- 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
- 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
- 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
- パッケージ インデックスを更新しapt、kubelet、kubeadm、kubectl をインストールし、それらのバージョンを固定します
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
- コントロールプレーンノードを初期化する
kubeadm init
- nodeを確認する
$ kubectl get node
NAME STATUS ROLES AGE VERSION
raspberry-ikura Ready control-plane 85m v1.29.2
- シングルノード構成なので、コントロールプレーンでもPodを起動できるようにする
$ kubectl taint nodes --all node-role.kubernetes.io/control-plane-
node/raspberry-ikura untainted
Discussion