0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry Piでk8sの導入まで

Last updated at Posted at 2025-09-19

環境

デバイス 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)

controllermemoryが入っていること、cgroup2mountできていることを確認

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/runcsystemd cgroupを期待してるのに、kubeletcgroupfs形式で作ろうとしてるミスマッチ。要は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)) 

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?