数ヶ月前にRaspberry Pi 5が日本でも発売された。以前からRaspberry Piを利用したおうちKubernetesに興味があり、Raspberry Pi 5を3台購入し構築した。Raspberry Piを利用したKubernetes The Hard WayはCyberAgentのリポジトリ が有名で今回参考にした。
構築時のバージョンはv1.29(最新はv1.30)だが、リポジトリで利用されているバージョンは古く、すでに廃止されているパラメータなどがあった。今回は、リポジトリで公開されている手順やスクリプトを一部改変したv1.29での手順を紹介する。また1から構築したのでRaspberryPiのセットアップから始める。
(CHANGELOGを見る限りではv1.30でも構築可能)
手順が長いため3回に分ける。今回はHard way前の準備編。
2回目はetcd
、kube-apiserver
、kube-controller-manager
、kube-scheduler
のデプロイ。
3回目はkubelet
、kube-proxy
、CoreDNS
のデプロイ。
購入したもの
購入したものと組み上がったもの。価格は購入時の金額、-
は家にあったもの。
商品名 | 価格(税込み)/個 | 個数 | 備考 |
---|---|---|---|
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操作する場合は必要 |
セットアップ
大まかに下記の工程で進める。
- SDカードにOSイメージを書き込み
- 初期設定と事前準備
- Localeの設定
- rootパスワード、sudoersの設定
- IPの固定
- hostsの設定
- Swap off設定
- カーネルパラメータ設定
- cgroup有効化
OSイメージの書き込み
https://www.raspberrypi.com/software/ をダウンロードしてSDに書き込む。GUI不要ならRaspberry Pi OS Lite
を選択する。また書き込む前に下記を設定しておくと楽。
- WiFiの設定
- ユーザの設定
- Timezoneの設定
- sshの設定
初期設定と事前準備
最低限の設定のみ。
Localeの設定
sudo raspi-config
イギリスのロケールを外し、 en_US.UTF-8
とja_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を作成すると良い。