M1 Macでk3s

# はじめに
最近私用のMacをMBP14in(M1 Max)に買い替えたので、その上でk3sのmasterノードを動かしてみます。

https://k3s.io/

# 準備
k3sはmacOSをサポートしていないので、Ubuntuインスタンスをmultipassを使って起動します。

```shell
# Homebrewでmultipassをインストール
% brew install --cask multipass 
# k3s-masterという名前でUbuntuインスタンスを起動
% multipass launch -n k3s-master 
Launched: k3s-master
```

# k3sを動かしてみる
```shell
% multipass shell k3s-master
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-91-generic aarch64)
# (以下略)
# 公式の手順にしたがってk3sをインストール
ubuntu@k3s-master:~$ curl -sfL https://get.k3s.io | sh -
[INFO]  Finding release for channel stable
[INFO]  Using v1.21.7+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.21.7+k3s1/sha256sum-arm64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.21.7+k3s1/k3s-arm64
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

# ノードが正常に起動していることを確認
ubuntu@k3s-master:~$ sudo kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k3s-master   Ready    control-plane,master   44s   v1.21.7+k3s1

# busybox Podを試しに動かしてみる
ubuntu@k3s-master:~$ sudo kubectl run test --restart=Never --rm -it --image=busybox -- /bin/sh -c "echo Hello"
Hello
pod "test" deleted
```

# お片付け
アンインストール用のスクリプトも用意されています。

```shell
ubuntu@k3s-master:~$ /usr/local/bin/k3s-uninstall.sh
+ id -u
+ [ 1000 -eq 0 ]
+ exec sudo /usr/local/bin/k3s-uninstall.sh
+ id -u
+ [ 0 -eq 0 ]
+ /usr/local/bin/k3s-killall.sh
+ [ -s /etc/systemd/system/k3s.service ]
+ basename /etc/systemd/system/k3s.service
+ systemctl stop k3s.service
+ [ -x /etc/init.d/k3s* ]
+ killtree 2608 2610 2613 3626 3756
+ kill -9 2608 2730 2830 2610 2704 3027 2613 2724 2874 3626 3644 4041 3756 3777 3915 3947
+ do_unmount_and_remove /run/k3s
+ set +x
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/f0962e93fb469f8a20d8faf9f1c074522ad45f8234b5a198ba2106c53c58fb95/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/e4b44c45d6931200e64348e6612b11db121345d1858bef52ecbddcf6bcb63069/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/d16429ff067ab25d92487d173563fb207cd8d1ebf08b86335d9dfcd3b1e4aab3/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/945b58cdb42c4c9cf9e43ebdde6a9a794f15203b57412ca0516138b9b9e3445a/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/81b568c5126e53b1023e2ac248cf6f70d9f33c81291c76e549c3cec671fb91fc/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/3862c9809c4470a3a03920430f3b1b7ee9d806aa96bfc88fe2a3423a61d96812/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/32f5e6729966cb434bf19e3d5cd9db14b91583983069f23476da049b454c6582/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/2fde7f45a4afa9881967d57cc8812d89ef4ef12c98de6f26a20c4af0c4ee733f/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/2ee470601b12f3a9ad9ac1d02a3af5bcab112520c59b7fc8ca8da2c52e5d43d3/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/11fa2a4a8abf0a76a412d10246c38f618b79b32a10bf7d1a7c8f3b82cac38e41/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/07a822304f9b521ade0cdf24c86ad98260984b8bea694860800dc73643908725/rootfs 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.grpc.v1.cri/sandboxes/e4b44c45d6931200e64348e6612b11db121345d1858bef52ecbddcf6bcb63069/shm 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.grpc.v1.cri/sandboxes/d16429ff067ab25d92487d173563fb207cd8d1ebf08b86335d9dfcd3b1e4aab3/shm 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.grpc.v1.cri/sandboxes/81b568c5126e53b1023e2ac248cf6f70d9f33c81291c76e549c3cec671fb91fc/shm 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.grpc.v1.cri/sandboxes/3862c9809c4470a3a03920430f3b1b7ee9d806aa96bfc88fe2a3423a61d96812/shm 
sh -c 'umount "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.grpc.v1.cri/sandboxes/2ee470601b12f3a9ad9ac1d02a3af5bcab112520c59b7fc8ca8da2c52e5d43d3/shm 
+ do_unmount_and_remove /var/lib/rancher/k3s
+ set +x
+ do_unmount_and_remove /var/lib/kubelet/pods
+ set +x
sh -c 'umount "$0" && rm -rf "$0"' /var/lib/kubelet/pods/eb45296f-ce3d-4975-a0a8-034fabdcdb74/volumes/kubernetes.io~projected/kube-api-access-q7wcw 
sh -c 'umount "$0" && rm -rf "$0"' /var/lib/kubelet/pods/60ded7da-90ff-4686-b43e-04d93d40ff8c/volumes/kubernetes.io~projected/kube-api-access-68s6d 
sh -c 'umount "$0" && rm -rf "$0"' /var/lib/kubelet/pods/27eb7e9f-69e3-4500-bc18-15b0a7455d79/volumes/kubernetes.io~projected/kube-api-access-4nb2v 
sh -c 'umount "$0" && rm -rf "$0"' /var/lib/kubelet/pods/2325c86e-a47e-4873-9b5b-73310f6a7714/volumes/kubernetes.io~projected/kube-api-access-zggsc 
sh -c 'umount "$0" && rm -rf "$0"' /var/lib/kubelet/pods/163e2b02-e392-449c-9a3e-6584c4f16a3d/volumes/kubernetes.io~projected/kube-api-access-l44cx 
+ do_unmount_and_remove /var/lib/kubelet/plugins
+ set +x
+ do_unmount_and_remove /run/netns/cni-
+ set +x
sh -c 'umount "$0" && rm -rf "$0"' /run/netns/cni-c9dc24e6-1753-f22d-68ee-26ce89e9822e 
sh -c 'umount "$0" && rm -rf "$0"' /run/netns/cni-c8f3571e-a846-5127-5751-7b1944a84668 
sh -c 'umount "$0" && rm -rf "$0"' /run/netns/cni-a1d2d221-294c-5a9c-b3f5-903ab6e65b2e 
sh -c 'umount "$0" && rm -rf "$0"' /run/netns/cni-7d54cf19-0f7c-d9ae-6bd3-b2f429ca57e3 
sh -c 'umount "$0" && rm -rf "$0"' /run/netns/cni-0a25f41e-40fe-5c4b-1139-fabdda4276a5 
+ xargs -r -t -n 1 ip netns delete
+ grep cni-
+ ip netns show
+ read ignore iface ignore
+ grep master cni0
+ ip link show
+ ip link delete cni0
+ ip link delete flannel.1
+ ip link delete flannel-v6.1
Cannot find device "flannel-v6.1"
+ rm -rf /var/lib/cni/
+ iptables-restore
+ grep -v CNI-
+ grep -v KUBE-
+ iptables-save
+ command -v systemctl
/usr/bin/systemctl
+ systemctl disable k3s
Removed /etc/systemd/system/multi-user.target.wants/k3s.service.
+ systemctl reset-failed k3s
+ systemctl daemon-reload
+ command -v rc-update
+ rm -f /etc/systemd/system/k3s.service
+ rm -f /etc/systemd/system/k3s.service.env
+ trap remove_uninstall EXIT
+ [ -L /usr/local/bin/kubectl ]
+ rm -f /usr/local/bin/kubectl
+ [ -L /usr/local/bin/crictl ]
+ rm -f /usr/local/bin/crictl
+ [ -L /usr/local/bin/ctr ]
+ rm -f /usr/local/bin/ctr
+ rm -rf /etc/rancher/k3s
+ rm -rf /run/k3s
+ rm -rf /run/flannel
+ rm -rf /var/lib/rancher/k3s
+ rm -rf /var/lib/kubelet
+ rm -f /usr/local/bin/k3s
+ rm -f /usr/local/bin/k3s-killall.sh
+ type yum
+ type zypper
+ remove_uninstall
+ rm -f /usr/local/bin/k3s-uninstall.sh
ubuntu@k3s-master:~$ exit
```

ついでにUbuntuインスタンスもお掃除

```shell
% multipass delete k3s-master
% multipass purge
```

# まとめ
Intel Macのときにも試したことがありましたが、M1 Macでも特に差異なく実行することができました。
実際にMacBookを母艦としておうちk8sクラスタを動かすことはあまりないかもしれませんが、PoC的にいろいろ試すことはできそうです。