今年の3月頃、ラズパイで k8sクラスタを組んだ。既に半年以上経っているが、せっかくなので今年のうちに、さわりだけでもまとめておく。

Hardware

予算 5万円として揃えてみた。 しかし現在は、ケーブルの取り回しや、MicroSD の遅さに辟易して追加で購入したものもある… 。ケースもふつうでつまらないので、現在、物色中。k8s の勉強用というより、ガジェット感が強い 😓

買ったもの(2021年3月) 単価 個数
Raspberry Pi 4 8GB 9,000円 4個
GeeekPi Raspberry Pi4クラスターケース 2,499円 1個
RAVPower USB充電器 (60W 6ポート) RP-PC028 2,699円 1個
iFory USBケーブル (TypeC-TypeA) 0.3m 2パック 959円 1個
エレコム スイッチングハブ ギガビット 5ポートEHC-G05PA-SB 2,955円 1個
エレコム LANケーブル 0.15m×2本 822円 2個
東芝 MicroSD 32G TOTF32G-M203BULK-2SET 1,198円 2個
追加分 単価 個数
サンワサプライ 電源コード(2P・L型コネクタ) 1m 471円 1本
Samsung Fit Plus 128GB 400MB/S USB3.1 MUF-128AB/EC 3,313円 4個

Network

1台をmaster node にして、残り3台を worker node に。

とりあえず、有線も無線(WiFi)を設定している。

有線は固定IP、WiFi は DHCP で。普段の操作は、WiFi 経由で行なっている。 スイッチのポートが1つ空いてるので、作業用の端末を有線LAN で繋いだり、シリアルコンソールを 繋いだりすることもある。

OS(Ubuntu ARM 64bit版)

OS は現在、arm64版 Ubuntu 21.04 を USBブートで使用中。ヘッドレスインストールしている。

インストール手順としては、vfat と ext4 が読める OSを準備 (初回はVolumioが入っているラズパイを使った。2回目位以降は、4台中のどれかで実施)。

そのOS上で、

  1. Ubuntu のイメージをダウンロード
  2. ダウンロードしたイメージを、USBメモリに ddで書き込み
  3. USBメモリに書き込まれた 2つパーティションをマウント
  4. マウントポイント配下のディレクトリに、cloud-init と netplan の設定ファイルを設置

なお、設定ファイルの設置は何度もやっているので、簡単なスクリプトにしている。

# イメージダウンロードして USBメモリ(/dev/sdb)に書き込み
curl -O https://cdimage.ubuntu.com/releases/21.04/release/ubuntu-21.04-preinstalled-server-arm64+raspi.img.xz
xzcat ubuntu-21.04-preinstalled-server-arm64+raspi.img.xz | sudo dd of=/dev/sdb bs=1M

# 自動でマウントされなければ、マウントポイント準備してマウント
mount -t vfat,ext4
sudo mkdir -p /media/{system-boot,writable}
sudo mount /dev/sdb1 /media/system-boot
sudo mount /dev/sdb2 /media/writable

# セットアップ用のスクリプト「setup」を準備して、cloud-init と netplan の設定ファイルを設置
bash setup master
# bash setup worker1
# bash setup worker2
# bash setup worker3

# umount
sudo umount /media/{system-boot,writable}

セットアップ用スクリプト「setup」

#!/bin/bash

function user-data(){
cat<<EOD
#cloud-config

hostname: $1

timezone: Asia/Tokyo
locale: ja_JP.UTF-8

ntp:
  servers: [ntp.nict.jp]

#package_update: true
#package_upgrade: true

ssh_pwauth: false
runcmd:
  - ufw limit ssh
  - ufw enable
  - reboot

users:
  - name: harasou
    groups: [adm, audio, cdrom, dialout, dip, floppy, lxd, netdev, plugdev, sudo, video]
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCU6IyyiClAZrIx0hr0Xoh1cUe099BzRE6WexxsbeyrUHN9uKkQN7lK1A73zHEsr1xt+xiCTu6FwnXrlCGplyIm8EKgArB1BeuCK/5ItBrE+ulGOi0TpXWuGLeL50FOyKPiXnNp/PhlFXqKs/feS9sF74a8u2KzDKMq6YCb6Nc5yw==
EOD
}

function netplan() {
cat<<EOD
network:
    ethernets:
        eth0:
            addresses:
                - $1/24
            dhcp4: false
    version: 2
    wifis:
        wlan0:
            access-points:
                <SSID>:
                    password: "<PASSWORD>"
            dhcp4: true
            optional: true
EOD
}

case $1 in
 master) ipaddress="192.168.2.1";   hostname="k8s-master" ;;
worker1) ipaddress="192.168.2.101"; hostname="k8s-worker1" ;;
worker2) ipaddress="192.168.2.102"; hostname="k8s-worker2" ;;
worker3) ipaddress="192.168.2.103"; hostname="k8s-worker3" ;;
      *) exit 1
esac

user-data $hostname | sudo cp -v /dev/stdin /media/system-boot/user-data
netplan $ipaddress | sudo cp -v /dev/stdin /media/writable/etc/netplan/99-static-config.yaml

Kubernetes

肝心の k8s の環境については、いろいろ試していて固定していないので、ある程度まとまったら書く。

Ubuntu も 20.04LTS 使ったり、kubeadm や k0s 使ったり。LXDクラスタや ESXi も試したりして、 かなり遊び場と化して、k8s の運用の知見は全く溜まってない。。。