hirano00o's blog

技術的な記録、日常の記録

Kubernetes The Hard Way for RaspberryPi 5 〜準備編〜

数ヶ月前にRaspberry Pi 5が日本でも発売された。以前からRaspberry Piを利用したおうちKubernetesに興味があり、Raspberry Pi 5を3台購入し構築した。Raspberry Piを利用したKubernetes The Hard WayはCyberAgentのリポジトリ が有名で今回参考にした。

github.com

構築時のバージョンはv1.29(最新はv1.30)だが、リポジトリで利用されているバージョンは古く、すでに廃止されているパラメータなどがあった。今回は、リポジトリで公開されている手順やスクリプトを一部改変したv1.29での手順を紹介する。また1から構築したのでRaspberryPiのセットアップから始める。

(CHANGELOGを見る限りではv1.30でも構築可能)

手順が長いため3回に分ける。今回はHard way前の準備編。

2回目はetcdkube-apiserverkube-controller-managerkube-schedulerのデプロイ。

3回目はkubeletkube-proxyCoreDNSのデプロイ。

購入したもの

購入したものと組み上がったもの。価格は購入時の金額、-は家にあったもの。

商品名 価格(税込み)/個 個数 備考
Raspberry Pi 5/8GB 14080 3
アクティブクーラー 公式 for Pi5 990 3
GeeekPi6層RaspberryPi4クラスターケース 2299 1 ボードの形や穴の場所は変わらないので利用可
microSD 64GB(KIOXIA) 740 2
microSD 128GB(SanDisk) 2960 1 1台だけGUIを入れる予定のため大きいサイズ
TP-Link スイッチングハブ ギガ 5ポート PoEハブ(TL-SG1005P) 4586 1 Raspberry Pi 5用のPoE HATは未発売だが今後を見据えてPoE対応ハブを利用。WiFiが繋がれば不要。
USB-C接続できる電源 - 3 5V3Aで動作するため、家に余っているものを利用。推奨5V5A。
LANケーブル - 4
電源タップ - 1
microHDMI変換アダプタとHDMIケーブル - 1 GUI操作する場合は必要

セットアップ

大まかに下記の工程で進める。

  1. SDカードにOSイメージを書き込み
  2. 初期設定と事前準備
    1. Localeの設定
    2. rootパスワード、sudoersの設定
    3. IPの固定
    4. hostsの設定
    5. Swap off設定
    6. カーネルパラメータ設定
    7. cgroup有効化

OSイメージの書き込み

https://www.raspberrypi.com/software/ をダウンロードしてSDに書き込む。GUI不要ならRaspberry Pi OS Liteを選択する。また書き込む前に下記を設定しておくと楽。

  • WiFiの設定
  • ユーザの設定
  • Timezoneの設定
  • sshの設定

初期設定と事前準備

最低限の設定のみ。

Localeの設定

sudo raspi-config

イギリスのロケールを外し、 en_US.UTF-8ja_JP.UTF-8をチェックしてOKを押下する。

パスワードとsudoers設定

sudo su -
passwd
# <rootのパスワードにしたい文字列を入力>

vi /etc/sudoers.d/010_pi-nopasswd # <1行目をコメントアウトする>
exit
su -
# <先ほど設定したパスワードを入れてrootになれたらOK>

IPの固定とhostsの設定

nmcliでIPを固定する。(いつから/etc/sysconfigが無くなったのだろうか...)

nmcli connection show
# NAME           UUID                                  TYPE      DEVICE 
# 有線接続        <UUID>                                ethernet  eth0
nmcli connection modify <UUID> connection.id eth0 # modifyすることで <NAME>.nmconnection ファイルが作成される
nmcli connection modify eth0 ipv4.addresses 10.105.138.201/22 # <IPアドレス>/<サブネットマスク>
nmcli connection modify eth0 ipv4.gateway 10.105.136.1 # <ネットワークアドレス>
nmcli connection modify eth0 ipv4.dns 10.105.136.1,8.8.8.8 # 複数設定する場合は `,` で繋げる
nmcli connection modify eth0 ipv4.method manual
nmcli -f ipv4 connection show eth0
nmcli connection up eth0

hostsを追記(自身とその他ノード分)する。

vi /etc/hosts
# 127.0.1.1            rs01
# 10.105.138.202   rs02
# 10.105.138.203   rs03

参考: https://zenn.dev/technicarium/articles/9d3ee150a3cf04

Swap off設定

Swapが有効化されているとkubeletが起動しないためoffにする。

swapon --show
# NAME      TYPE SIZE USED PRIO
# /var/swap file 100M   0B   -2
sudo dphys-swapfile swapoff
swapon --show
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile

カーネルパラメータの設定

https://kubernetes.io/docs/setup/production-environment/container-runtimes/#install-and-configure-prerequisites を参考にしたが、現在はmodprobeの設定は不要に見える。実際には設定したので残しておく。

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

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

sudo sysctl --system

# 以下設定されていることを確認
lsmod | grep br_netfilter
# br_netfilter           81920  0
# bridge                229376  1 br_netfilter
# ipv6                  589824  72 bridge,br_netfilter
lsmod | grep overlay
# overlay               147456  0
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

cgroupの有効化

cgroupのMemory Subsystemを有効化する。

sudo apt -y upgrade
sudo apt -y install socat conntrack ipset
# ついでに2回目以降で必要なパッケージもインストールしておく
sudo apt install golang-cfssl containerd runc

sudo vi /boot/firmware/cmdline.txt
# cgroup_memory=1 cgroup_enable=memory を行末に追記する

有効化後は再起動する。

構成

これから構築するKubernetesクラスタの構成を示す。

名前 サブネット 備考
自宅 10.105.136.0/22
Pod 10.0.0.0/16 ここから各ノードに割り当てる
ClusterIP用 10.10.0.0/24
ホスト名 IPアドレス Pod用サブネット ログインユーザ 備考
rs01 10.105.138.201 10.0.1.0/24 hirano00o Master, Worker兼用
rs02 10.105.138.202 10.0.2.0/24 hirano00o Worker
rs03 10.105.138.203 10.0.3.0/24 hirano00o Worker
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/"

終わりに

今回はRaspberry Piのセットアップまで完了した。設定自体は多くないので1台1台進めてもいいが、ターミナル等のブロードキャスト機能を使って実施すると楽。設定内容が多い場合はAnsible playbookを作成すると良い。