blog(unstable)

k8s Cluster on Raspberry Pi

February 10, 2021

category : 技術

tags :


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


なにやったのか?

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

構成

作業環境

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でインストール
    1. ルータに有線で接続してssh
      1. 新ユーザ作ってpiユーザ消す
      2. パスワード→鍵認証はやらない(raspbianをこのあと使わないので)
  4. 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セットやったのは秘密)

本作業フェイズ

各マシンにホスト名ふったりユーザ作ったり

Kubernetesまわりガーっとインストール

#!/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のセットアップ前半戦
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

動いた!

その他もろもろ

つらかったこと

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

結論

参考記事


補足

重要なものだけ補足

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

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

We noticed that there was no Arch Linux ARM mirror in Japan, so we're sponsoring one now 😊

If you're in Japan or nearby, feel free to point your pacman.d/mirrorlist at https://t.co/GM69rZE3tC!https://t.co/erKHtHwFfX pic.twitter.com/m0opnupc5i

— Asahi Linux (@AsahiLinux@treehouse.systems) (@AsahiLinux) November 18, 2021