k8s Cluster on Raspberry Pi

kei-s16/k8s-arch-rpi-cluster.md を元に加筆・修正を行ったものです
基本的に2021年頭の情報になっており、すでに時代遅れであったり、間違いに気づいて実際の運用では改善済のものが記事には含まれています


なにやったのか?

rpi4 * 3 で k8s クラスタを作る

構成

  • rpi 4 (4GB)
    Arch Linux (ARM)

作業環境

Raspbianイメージ焼くところ

Windowsの世界

もろもろの雑用

Arch on WSL2

kei@Win-Desktop-wsl
OS: Arch Linux on Windows 10 x86_64
Kernel: 5.4.72-microsoft-standard-WSL2
Shell: zsh 5.8
CPU: AMD Ryzen 7 3800X (16) @ 3.892GHz
Memory: 279MiB / 12733MiB
ArchLinux for ARM64がんばるところRaspbian(32bit)

Kubernetesがんばるところ

ArchLinux ARM(64bit) on Raspberry Pi

作業手順

下準備フェイズ

  1. 組み立てやってテンション上げる
  2. メインのLANにぶらさげるLANのセットアップ
  3. Raspbian を headlessでインストール
    ルータに有線で接続してssh
    新ユーザ作ってpiユーザ消す
  4. パスワード→鍵認証はやらない(raspbianをこのあと使わないので)



Raspbian 上 で ArchLinux ARM を焼く

# $はすべて sudo
$ fdisk /dev/sda
# いいかんじにパーティション切る

$ mkfs.vfat /dev/sda1
$ mkdir boot
$ mount /dev/sda1 boot

$ mkfs.ext4 /dev/sda2
$ mkdir root
$ mount /dev/sda2 root

# イメージ落とす
$ wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz

# ここから先はsuする
$ su
% bsdtar -xpf ArchLinuxARM-rpi-4-latest.tar.gz -C root
% sync

# 64bit かつ rpi4 なので
% sed -i 's/mmcblk0/mmcblk1/g' root/etc/fstab

% mv root/boot/* boot

# マウントしたらちゃんとアンマウントしようね
% umount boot root

# これを3セット (さらに別用途で---1セットやったのは秘密)
本作業フェイズ各マシンにホスト名ふったりユーザ作ったりpacman -Syyu めっちゃ重い(国内ミラーなさそう)pacman -S sudoホスト名変えた
kisaragimogamikumanosudoersいじった公開鍵認証以外封じたKubernetesまわりガーっとインストールAnsibleでやろうとしたが、pacmanだけでなくyayも使うのでちょっと厳しかった
ので横着してシェルスクリプト書いたが横着しすぎてコケた
ので最終的に半手作業……#!/bin/bash -eu
pacman -S git base base-devel --noconfirm
mkdir ~/build/
cd ~/build
git clone https://aur.archlinux.org/yay.git
cd ~/build/yay
makepkg -si --noconfirm
cd ~/
yay -S docker kubelet-bin kubeadm-bin kubectl-bin ebtables ethtool socat conntrack-tools cni-plugins --noconfirm
Kubernetesセットアップ全体構成kisaragi : Mastermogami : nodekumano : nodeお船じゃないよ

kisaragiのセットアップ前半戦

sudo kubeadm init --pod-network-cidr=10.244.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 apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
mogami & kumanoのセットアップsudo systemctl enable kubelet.service
sudo systemctl start kubelete.service
sudo kubeadm join {いろんなひみつのオプション}
kisaragiのセットアップ後半戦クラスターにノードを参加させる

kubectl label node mogami node-role.kubernetes.io/worker=worker
kubectl label node kumano node-role.kubernetes.io/worker=worker
kisaragi% kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:28:09Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/arm64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.2", GitCommit:"faecb196815e248d3ecfb03c680a4507229c2a56", GitTreeState:"clean", BuildDate:"2021-01-13T13:20:00Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/arm64"}}}
なんかpod動かしてみるオレオレDocker Registry置くことにした

deployment.yml

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: docker-registry
labels:
app: docker-registry
spec:
replicas: 1
selector:
matchLabels:
app: docker-registry
template:
metadata:
labels:
app: docker-registry
spec:
hostNetwork: true
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
nodeSelector:
kubernetes.io/hostname: kisaragi
containers:
- name: docker-registry
image: registry:2.7.1
ports:
- containerPort: 5000
volumeMounts:
- name: registry
mountPath: /var/lib/registry
volumes:
- name: registry
hostPath:
type: Directory
path: /mnt/exthdd/registry
これをデプロイして、外からpull & pushしてみる

sudo docker pull hello-world
sudo docker tag hello-world kisaragi.local:5000/hello-world
sudo docker push kisaragi.local:5000/hello-world
動いた!

その他もろもろ

つらかったこと

  • アップデートで再起動かけたら kubectl コケた
    masterで systemctl enable kubelet 忘れてた

一瞬世界から孤立したサーバを産み落としてしまった

  • ~/.ssh/authorized_keys を消してしまった
  • 別マシンでSDカードをマウントして authorized_keys を作ることでごまかした
    chmod {ユーザ名}:sudo authorized_keys 忘れずにね

やらなかったこと(今後やりたいこと)

  • PoE(USBケーブル邪魔じゃね?)
  • ノード台数の拡張
  • 無線LANルータがちょっと残念だったので改善
    ラズパイルータにしちゃう

結論

  • ArchLinuxはいいぞ
  • k8sはいいぞ
  • 横着はよくないぞ

参考記事


補足

重要なものだけ補足

pacman -Syyu めっちゃ重い(国内ミラーなさそう)

という記述がありましたが、2021/11/18にAsahi Linuxが国内ミラーを作成してくれました!