はじめに
Raspberry PiでKubernetesクラスタを構築する記事はたくさんありますが、備忘のため試行錯誤してうまくいった結果をまとめます。アプリケーションをデプロイして動かせるように、FlannelやIngressのインストールまでしました。
64ビット版のLinuxを使っているのがポイントです。
ハードウェア
以下の部品を組み合わせて作成。
- Raspberry Pi 4 Model B/8GB 3台
- microSDカード 32GB 3枚
- ケース https://www.amazon.co.jp/dp/B07TJ15YL1
- USB電源アダプタ https://www.amazon.co.jp/dp/B00Z8Z7WEE
- USBケーブル 3本 https://www.amazon.co.jp/dp/B0748DTSD2
1台がマスターノードで2台がワーカーノード。
一番下の段にUSB電源アダプタを入れようとしましたがサイズが合わず入りませんでした・・・
ソフトウェア
Arch Linux
どうせなら64ビット版のOSを使いたいと思いいろいろ調べた結果、以下を参考にしてArch Linux ARMの64ビット版のインストールに成功。
https://raspberrypi.stackexchange.com/questions/111011/aarch64-or-armv8-with-arch-on-a-raspberry-pi-4
ここからファイルをダウンロードして、後は手順通りにSDカードに書き込み。
今見たら公式ページに「AArch64 Installation」の記述があったので、今は公式のファイルを使ってインストールできそうです。
あとはWiFi接続など一通りのOSの設定を実施。
Docker / Kubernetes
全ノードに必要なパッケージをインストール。AURのパッケージもインストールする必要があるので、AURヘルパーであるyayを利用。
$ yay -S docker kubelet-bin kubeadm-bin kubectl-bin ebtables ethtool socat conntrack-tools
マスターノードでkubeadmを実行してKubernetesのクラスタを構築。
# kubeadm init --pod-network-cidr=10.244.0.0/16
kubectlを使えるようにするための設定方法が表示されるので、表示されたコマンドを実行。
また、ワーカーノードをKubernetesクラスタに参加させる方法が表示されるので、表示されたコマンドをワーカーノードで実行。
Flannel
全ノードにcni-pluginsをインストール。
$ yay -S cni-plugins
cni-pluginsのインストール場所が異なるため、Flannelがうまく動くようにシンボリックリンクを作成。
# mkdir /opt/cni
# ln -s /usr/lib/cni /opt/cni/bin
Flannelをインストール。vxlanをhost-gwに変更するとうまくいきました。
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ cat kube-flannel.yml | sed "s/vxlan/host-gw/" > kube-flannel-hostgw.yml
$ kubectl apply -f kube-flannel-hostgw.yml
MetalLB
ServiceのタイプをLoadBalancerにした場合、クラウドでは外部公開用のIPアドレスを自動で割り当ててくれるようですが、オンプレではうまく動きません。そのため、オンプレでも外部公開用のIPアドレスが自動で割り振られるようにMetalLBを手順に従ってインストール。
ここを参考にL2モードの設定をして、LAN内のある範囲のIPアドレスが割り当てられるようにしました。
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml
$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml
$ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
$ wget https://raw.githubusercontent.com/metallb/metallb/main/manifests/example-layer2-config.yaml
$ mv example-layer2-config.yaml metallb-config.yaml
$ vim metallb-config.yaml
$ kubectl apply -f metallb-config.yaml
Ingress
リバースプロキシの構成を作れるようにするため、NGINX Ingress Controllerを手順に従ってインストール。
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/cloud/deploy.yaml
さいごに
アプリケーションをデプロイして動かせる状態になったので、自宅サーバで動かしているアプリケーションはこのKubernetesクラスタに移すようにしていきたいです。