M1 Mac + Raspberry Pi 4でk3s

# はじめに
https://qiita.com/tkuribayashi/items/4eb664631254fa58df57

先日こちらの記事で、Mac上でk3sのmasterノードをセットアップする手順を試してみました。
シングルノード構成をしても何も面白くないので、
今回Raspberry Piを購入し、master-workerの2ノード構成のクラスタを構築してみようと思います。

# Raspberry Piのセットアップ
https://www.raspberrypi.com/software/

こちらからMac用のRaspberry Pi Imagerをダウンロードし、予めフォーマットしておいたmicroSDカードにOSイメージを書き込みます。
![Screen Shot 2021-12-19 at 17.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29025/26caf09b-24a4-2bf5-8538-92ae3a63236d.png)
これが結構時間が掛かる……(時間は計りませんでしたが、10分以上は掛かった気がします)
その間にRaspberry Pi本体とケースの組み立てを行いました。

# SSHとWi-fiの初期設定

今回は、Raspberry Pi用のキーボードやモニタを用意せずに、Macのみを使ってヘッドレスセットアップするため、起動時にWi-Fiに自動的に接続されることと、sshdが有効化されている必要がありました。

まずはWi-Fiの設定。以下の内容のファイルをmicroSDカードに書き込みます。

```shell
touch /Volumes/boot/wpa_supplicant.conf
```

```conf:/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です。

```shell
touch /Volumes/boot/ssh
```

# SSH接続
準備ができたら、microSDカードをRaspberry Piに挿し、電源を入れれば起動します。

```shell
% ssh pi@raspberrypi.local
```
初期パスワードは`raspberry`です。ログインしたら変更しておきましょう。

# k3sインストール

まずはk3s起動時に必要になるため以下の設定を行います。

```shell
pi@raspberrypi:~ $  sudo vi /boot/cmdline.txt

# 末尾に追加(改行を入れずに既存行の末尾に追加すること)
# cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

# 再起動
pi@raspberrypi:~ $  sudo reboot
```


母艦Macの方でmaster起動([先日の記事](https://qiita.com/tkuribayashi/items/4eb664631254fa58df57)参照)


```shell
# masterのIPアドレス確認
% multipass list
Name                    State             IPv4             Image
k3s-master              Running           192.168.64.3     Ubuntu 20.04 LTS
```


Ubuntu上でIPフォワードを有効化する。

```shell:/etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward=1
```

そして、k3sをmasterとして起動。

```shell
# 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のポート開放を設定。

```shell:/etc/ssh/sshd_config
# コメントを外して有効化
AllowTcpForwarding yes
```

```shell
% 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を起動します。

```shell
% ssh pi@raspberrypi.local
```

```shell
# 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が認識されます。

```shell
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をシャットダウンするときは、以下のコマンドを打ってから電源を落としましょう。

```shell
sudo shutdown -h now
```

# おわりに
今回は、とりあえずRaspberry piを使ってk3sのマルチノードクラスタを構築してみました。
今後は、Raspberry pi用のカメラモジュールも購入してあるので、Raspberry piだからこそできるEdgeコンピューティングに挑戦してみようと計画中。