はじめに
先日こちらの記事で、Mac上でk3sのmasterノードをセットアップする手順を試してみました。
シングルノード構成をしても何も面白くないので、
今回Raspberry Piを購入し、master-workerの2ノード構成のクラスタを構築してみようと思います。
Raspberry Piのセットアップ
こちらからMac用のRaspberry Pi Imagerをダウンロードし、予めフォーマットしておいたmicroSDカードにOSイメージを書き込みます。
これが結構時間が掛かる……(時間は計りませんでしたが、10分以上は掛かった気がします)
その間にRaspberry Pi本体とケースの組み立てを行いました。
SSHとWi-fiの初期設定
今回は、Raspberry Pi用のキーボードやモニタを用意せずに、Macのみを使ってヘッドレスセットアップするため、起動時にWi-Fiに自動的に接続されることと、sshdが有効化されている必要がありました。
まずはWi-Fiの設定。以下の内容のファイルをmicroSDカードに書き込みます。
touch /Volumes/boot/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid="ここに接続先のssid"
psk="ここに接続キー"
key_mgmt=WPA-PSK
priority=2
}
sshdの有効化は、以下の空ファイル設置のみでOKです。
touch /Volumes/boot/ssh
SSH接続
準備ができたら、microSDカードをRaspberry Piに挿し、電源を入れれば起動します。
% ssh pi@raspberrypi.local
初期パスワードはraspberry
です。ログインしたら変更しておきましょう。
k3sインストール
まずはk3s起動時に必要になるため以下の設定を行います。
pi@raspberrypi:~ $ sudo vi /boot/cmdline.txt
# 末尾に追加(改行を入れずに既存行の末尾に追加すること)
# cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
# 再起動
pi@raspberrypi:~ $ sudo reboot
母艦Macの方でmaster起動(先日の記事参照)
# masterのIPアドレス確認
% multipass list
Name State IPv4 Image
k3s-master Running 192.168.64.3 Ubuntu 20.04 LTS
Ubuntu上でIPフォワードを有効化する。
net.ipv4.ip_forward=1
そして、k3sをmasterとして起動。
# Raspberry pi→Mac→Ubuntuで接続できるようにExternal IPを設定
K3S_EXTERNAL_IP=192.168.64.3
ubuntu@k3s-master:~$ export INSTALL_K3S_EXEC="--node-ip=$K3S_EXTERNAL_IP --node-external-ip=$K3S_EXTERNAL_IP"
# k3s masterインストール&起動
ubuntu@k3s-master:~$ curl -sfL https://get.k3s.io | sh -
# node tokenを取得
ubuntu@k3s-master:~$ sudo cat /var/lib/rancher/k3s/server/node-token
今回は、Raspberry pi→Mac→Ubuntuの経路でagent→masterの接続を行うため、Macのポート開放を設定。
# コメントを外して有効化
AllowTcpForwarding yes
% echo "
rdr pass on lo0 inet proto tcp from any to self port 6443 -> 192.168.64.3 port 6443
rdr pass on en0 inet proto tcp from any to any port 6443 -> 192.168.64.3 port 6443
rdr pass on en1 inet proto tcp from any to any port 6443 -> 192.168.64.3 port 6443
" | sudo pfctl -ef -
最後に、Raspberry piでk3s agentを起動します。
% ssh pi@raspberrypi.local
# agentとしてk3sを起動するための設定
pi@raspberrypi:~ $ export K3S_TOKEN={master側で取得したnode tokenを貼り付け}
pi@raspberrypi:~ $ export K3S_URL={https://<MacのIP>:6443}
# 上記環境変数を設定しておくと、自動的にagentとして起動してくれる
pi@raspberrypi:~ $ curl -sfL https://get.k3s.io | sh -
注意点として、k3sではmDNSが使えないため、xxx.localの名前解決はできず、K3S_URLにはIPを直接指定する必要があります。
上記が完了すれば、無事master側からもagent nodeが認識されます。
ubuntu@k3s-master:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
raspberrypi Ready <none> 10m v1.22.5+k3s1
k3s-master Ready control-plane,master 13m v1.22.5+k3s1
# 試しにDeployment作成
ubuntu@k3s-master:~$ sudo kubectl create deploy my-dep --image=nginx --replicas=
# raspberrypiにもPodが作成されていることが分かる
ubuntu@k3s-master:~$ sudo kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-5b7868d854-chm2n 1/1 Running 0 6m19s 10.42.0.7 k3s-master <none> <none>
my-dep-5b7868d854-hlw6s 1/1 Running 0 6m20s 10.42.1.3 raspberrypi <none> <none>
my-dep-5b7868d854-n6bmt 1/1 Running 0 6m19s 10.42.1.4 raspberrypi <none> <none>
シャットダウン
Raspberry piをシャットダウンするときは、以下のコマンドを打ってから電源を落としましょう。
sudo shutdown -h now
おわりに
今回は、とりあえずRaspberry piを使ってk3sのマルチノードクラスタを構築してみました。
今後は、Raspberry pi用のカメラモジュールも購入してあるので、Raspberry piだからこそできるEdgeコンピューティングに挑戦してみようと計画中。