環境
デバイス | Raspberry Pi 4 model B |
OS | Raspberry Pi OS (64 bit) |
Raspberry Pi Imager | version 1.9.6 |
Raspberry PiのOSの用意
Raspberry Pi Imagerを使う。
今回はRaspberry Pi OS (64 bit)
を使用した。
まだ用意ができていない人は以下のサイトを参考にして準備してください。
Raspiのセットアップでやっといた方がいいこと
-
ネットワークを使えるようにしておくこと (GUIがいいです絶対)
-
sshを使えるようにしておくこと
自前のマシンからsshして作業するとはやいsudo apt install openssh-server sudo systemctl status ssh # 起動していなかった場合 sudo systemctl enable ssh sudo systemctl start ssh
sshの仕方
ssh [username]@[ip address]
k8sに必要なパッケージインストール
sudo apt update
# HTTPS通信を行うパッケージインストール
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# k8sの公開リポジトリの公開署名キーのダウンロード
# GPGキーをバイナリ形式に変換して保存する
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# aptリポジトリの登録
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# k8sのインストール
# 必ずupdateを行うこと
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
# k8sのバージョン固定
sudo apt-mark hold kubelet kubeadm kubectl
k8sの公開リポジトリのURL確認
k8sの公開リポジトリの公開署名キーのURLをチェック(2025-09-19)curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key
[結果]
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)
.....(文字の羅列が続く)
cgroupドライバの設定
cgroupについては以下の記事がわかりやすいだろう。
# 個人的には vi よりも nano が好き
sudo nano /etc/default/kubelet
中身を以下のように変更する
- KUBELET_EXTRA_ARGS=
+ KUBELET_EXTRA_ARGS=--cgroup-driver=cgroupfs
まどうせ一行しかないから迷うことはない。
設定できたかの確認
cat /etc/default/kubelet
kubeletの起動
まずは状態確認から
sudo systemctl status kubelet --no-pager
○ kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; preset: enab>
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: inactive (dead)
Docs: https://kubernetes.io/docs/
動いていないことがわかる
次に起動操作に入る
sudo systemctl daemon-reload
sudo systemctl restart kubelet
起動できたことを確認
sudo systemctl status kubelet --no-pager
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; preset: enab>
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Sat 2025-09-20>
Docs: https://kubernetes.io/docs/
Process: 9500 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_>
Main PID: 9500 (code=exited, status=1/FAILURE)
CPU: 211ms
Active
欄でctivating (auto-restart)
になっているが問題ない
kubeadm init 実行
memory cgroup の有効化
# swap領域をオフにする
sudo swapoff -a
# 再起動後も無効化(該当行をコメントアウト)
sudo sed -i.bak -E 's/^(.*\sswap\s.*)$/# \1/' /etc/fstab
sudo nano /boot/firmware/cmdline.txt
以下の行を追記
一行ファイルなので改行しないこと
半角スペースで追記すること
cgroup_memory=1 cgroup_enable=memory cgroup_enable=cpuset
追記できたら再起動
sudo reboot
再起動後、有効化できているか確認
grep . /sys/fs/cgroup/cgroup.controllers 2>/dev/null || true
# cpuset cpu io memory pids
mount | grep cgroup
# cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
controller
にmemory
が入っていること、cgroup2
でmount
できていることを確認
containerdのインストール
sudo apt install -y containerd
# 必要モジュールの自動ロード
echo -e "overlay\nbr_netfilter" | sudo tee /etc/modules-load.d/k8s.conf
sudo modprobe overlay
sudo modprobe br_netfilter
# 必要な sysctl
sudo tee /etc/sysctl.d/99-kubernetes-cri.conf >/dev/null <<'EOF'
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
containerdの設定
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
# SystemdCgroup=true にする
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
containerdの自動起動&起動確認
sudo systemctl enable --now containerd
sudo systemctl status containerd --no-pager
# ソケットができたか確認
ls -l /var/run/containerd/containerd.sock
kudeadm init 実行
# 一旦 kubelet を止める
sudo systemctl stop kubelet
# 止まっていることを確認
sudo systemctl status kubelet
# ipフォワーディング有効化
sudo sysctl -w net.ipv4.ip_forward=1
# デーモンのリロード
sudo systemctl daemon-reload
# kubeadm init 実行
sudo kubeadm init --kubernetes-version v1.30.14 --pod-network-cidr=10.244.0.0/16
kubelet
の動作確認
sudo systemctl status kubelet --no-pager
kubectlをrootユーザ以外でも実行可能にする
export KUBECONFIG=/etc/kubernetes/admin.conf
sudo chown mainte:mainte /etc/kubernetes/admin.conf
# chown: invalid user: ‘mainte:mainte’
CNIの適用
はい恒例
わからない人はこれ見てね
# KUBECONFIG が固定されていることもある
unset KUBECONFIG
mkdir -p $HOME/.kube
sudo install -o $(id -u) -g $(id -g) -m 600 /etc/kubernetes/admin.conf $HOME/.kube/config
# Flannel の適用
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/refs/heads/master/Documentation/kube-flannel.yml
Kubernetes動作確認
さぁ最終段階。
admin@admin:~ $ kubectl get ns
NAME STATUS AGE
default Active 42m
kube-flannel Active 40m
kube-node-lease Active 42m
kube-public Active 42m
kube-system Active 42m
こんな感じで表示されたら完璧です。今回はここまで
再起動したら死んだ人用
再起動したら詰んだからメモ結論としてcontainerd/runc
はsystemd cgroup
を期待してるのに、kubelet
がcgroupfs
形式で作ろうとしてるミスマッチ。要はcgroup
ドライバ不一致だった。以下復旧コード
sudo sed -i 's/--cgroup-driver=[^" ]*/--cgroup-driver=systemd/g' /var/lib/kubelet/kubeadm-flags.env
sudo sed -i 's|^KUBELET_EXTRA_ARGS=.*|KUBELET_EXTRA_ARGS=--cgroup-driver=systemd|' /etc/default/kubelet
grep '^KUBELET_EXTRA_ARGS' /etc/default/kubelet
sudo cp -a /var/lib/kubelet/config.yaml /var/lib/kubelet/config.yaml.bak
if grep -q '^cgroupDriver:' /var/lib/kubelet/config.yaml; then
sudo sed -i 's/^cgroupDriver:.*/cgroupDriver: systemd/' /var/lib/kubelet/config.yaml
else
echo 'cgroupDriver: systemd' | sudo tee -a /var/lib/kubelet/config.yaml
fi
grep -n 'SystemdCgroup' /etc/containerd/config.toml
# => SystemdCgroup = true になっていること
sudo systemctl daemon-reload
sudo systemctl restart containerd
sudo systemctl restart kubelet
確認ね
sudo journalctl -u kubelet -b --no-pager | grep -i 'cgroup driver'
# 何も表示されなくてok
sudo ss -lntp | grep 6443 || echo "no 6443"
# LISTEN 0 4096 *:6443 *:* users:(("kube-apiserver",pid=13531,fd=3))
参考