TL;DR
- ラズパイを使っておうち k8s を構築した際の手順メモ
環境
- マスター: ラズベリーパイ4 × 1
- ワーカー: ラズベリーパイ5 × 1
手順メモ
IP アドレスの固定
sudo nmcli connection modify 'Wired connection 1' ipv4.method manual ipv4.addresses 192.168.0.10/24 ipv4.gateway 192.168.0.1 ipv4.dns 1.1.1.1
sudo nmcli device disconnect "Wired connection 1" && sudo nmcli device connect "Wired connection 1"
sudo nmcli device disconnect eth0 && sudo nmcli device connect eth0
cgroup でメモリの有効化
- RaspberryOS のような、エッジ用 OS だとデフォルト無効化されていることが多いらしい
vim /boot/firmware/cmdline.txt
Change -> cgroup_memory=1 cgroup_enable=memory
cat /proc/cgroups
スワップ無効化
sudo swapoff --all
sudo systemctl stop dphys-swapfile
sudo systemctl disable dphys-swapfile
systemctl status dphys-swapfile
ip フォワーディング有効化
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
containerd.io のインストール
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
cat /etc/apt/sources.list.d/docker.list
sudo apt-get install containerd.io
kubelet kubeadm kubectl のインストール
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
Kubelet が systemd を cgroup ドライバーとして使用するよう設定
vim /etc/default/kubelet
KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
systemctl daemon-reload
systemctl restart kubelet
Containerd が systemd を cgroup ドライバーとして使用するよう設定
containerd config default | sudo tee /etc/containerd/config.toml
vim /etc/containerd/config.toml
Change -> SystemdCgroup = true
クラスター作成(マスター)
sudo kubeadm init --pod-network-cidr=10.1.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get pods --all-namespaces
クラスターに Join(ワーカー)
sudo kubeadm join 192.168.0.10:6443 --token <トークン> --discovery-token-ca-cert-hash sha256:<ハッシュ値>
calico の有効化
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml
curl https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/custom-resources.yaml -O
Change -> cidr: 10.1.0.0/16
kubectl create -f custom-resources.yaml
watch kubectl get pods -n calico-system
最終確認
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready control-plane 17m v1.30.2
k8s-worker-1 Ready <none> 11m v1.30.2
その他
コンテナリポジトリは GitHub レジストリを利用
CD は ArgoCD(Image Updater)を使って自動デプロイ
- Helm か Kustomize を利用してないと動かないことに気がつかずにハマった
ストレージは Longhorn を使って保存場所を意識しないで良いように
ログ管理は Grafana と loki を利用