K3s on Raspberry Pi4を構築してみる

はじめに

前回から半年以上経ってしまった...
それはそうとして冬休みなので、段ボールに眠っていたRaspberry Pi4を使っておうちKubernetesをした。
その時のログをとりあえず備忘録的に書き残しておく。
k8s自体はたくさんクラウドで作ったので、k3sでさくっと作っていく。

機材

機材はCyberAgnetのDeveloprBlog「おうちKubernetesインターン」を実施しましたを参考

機材名 個数 URL 備考
Raspberry Pi4 3 https://raspberry-pi.ksyic.com/main/index/pdp.id/549/pdp.open/549
micro SDカード 32GB 3 https://www.amazon.co.jp/dp/B07MTCJHP6
積載ケース 1 www.amazon.co.jp/dp/B07TJZ2HDG
PoE スイッチ 1 https://www.amazon.co.jp/dp/B0763TGBTS
PoE HAT 3 https://www.amazon.co.jp/dp/B07JPXR9ZN サードパーティ製PoE HAT
六角スペーサー 1 https://www.amazon.co.jp/dp/B0166GCHD4 PoE HAT装着すると積載ケースに付属のスペーサーだと入らないので購入
LANケーブル 0.15m 3 https://www.amazon.co.jp/dp/B00FZTNJQI/
Raspberry Pi3 1 お家に転がってたもの k8sクラスタへの踏み台(不要だったかも)

構成

ざっくりと。

f:id:tm3log:20210101232809p:plain
物理構成
NASはPVあたりに使おうかなぁという気持ちがあり、図として組み込んだ

実物はこちら

f:id:tm3log:20210101233314j:plain
Raspberry Pi4+Pi3
JumpもPoE化 or 追加Pi4購入&交換するかなぁ
それとスペーサーが60mmもあるので、高い...公式PoEに変える検討しよ

SDカードにOSイメージを焼く

今回焼くイメージはRaspberry Pi OSとした /etc/os-release

$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

手順
www.youtube.com

SSH有効化

デフォルメでSSHが無効になっているので、SSHを有効化しておく。
SDカードをイメージを焼くに使ったMacBookマウントした状態で以下を実行

$ touch /Volumes/boot/ssh

これを3回

構成情報

アドレスは以下の通り

ホスト名 eth0 wlan0
k3s-jump 192.168.110.50 192.168.11.50
k3s-master 192.168.110.51 192.168.11.51
k3s-worker01 192.168.110.52 192.168.11.52
k3s-worker02 192.168.110.53 192.168.11.53

初期設定

お家ルーターに一度繋ぎ、Wifi&IPの設定してから無線LAN経由でsshで作業。 参考にさせていただいたページ
blog.nownabe.com blog.nownabe.com

# change root
$ sudo su -

# 64bitモードに変更
$ echo "arm_64bit=1" >> /boot/config.txt
$ cat /boot/config.txt | grep arm?_64
arm_64bit=1

# hosts追加
$ vim /etc/hosts
$ grep k3s /etc/hosts
192.168.110.50 k3s-jump
192.168.110.51 k3s-master
192.168.110.52 k3s-worker01
192.168.110.53 k3s-worker02

# ipv6の停止
$ echo net.ipv6.conf.all.disable_ipv6 = 1 >> /etc/sysctl.conf
$ tail -1 /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
$ sysctl -p

# cgroupsのMemory Subsystem を有効化
$ vim ./boot/cmdline.txt
(末尾に追記)
cgroup_memory=1 cgroup_enable=memory cgroup_enable=cpuset

# vimをインストール
$ apt install -y vim

# ホスト名の設定
$ hostnamectl set-hostname <hostname>

# IPアドレスの設定
$ vim /etc/dhcpcd.conf
(追記内奥).
interface eth0
static ip_address=<eth0.ip>/24
interface wlan0
static ip_address=<wlan0.ip>/24
static routers=<wlan0.gateway>
static domain_name_servers=<wlan0.gateway> 8.8.8.8 4.4.4.4

# SSID/Wifiのパスワード設定 
$ raspi-config
System Options -> S1 Wireless LANを選択して、情報を入力し再起動される

これを3台分実施
再起動後、さらにsshdの変更と作業ユーザー作成を行う

$ ssh pi@<wlan0.ip>
$ sudo su- 

# sshdの設定変更
$ vim /etc/ssh/sshd_config
(編集内容)
PermitRootLogin no
PasswordAuthentication no
$ systemctl restart sshd

# 作業ユーザー作成
$ useradd -m tm3exe
$ usermod -aG sudo tm3exe
$ passwd tm3exe

# 作業ユーザーに変更して、sshの設定
$ su - tm3exe
$ mkdir .ssh
$ cat <your_authpubkey> >> ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

# デフォルトユーザーpiのパスワード削除
$ sudo passwd -d pi

# swapの停止
$ sudo swapoff --all
$ sudo apt-get purge -y --auto-remove dphys-swapfile
$ sudo rm -fr /var/swap
$ free -h
              total        used        free      shared  buff/cache   available
Mem:          912Mi       169Mi       401Mi        13Mi       341Mi       666Mi
Swap:            0B          0B          0B <- 0BになっていればOK

K3sのインストール(共通)

やることは前記事と変わらず、Nodeを追加する部分だけが追加で必要。

# Master/Worker両方に実施
$ sudo su -
$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable servicelb" sh -
(~snip~)
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service ¨ /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

# Node取得
$ kubectl beget nodes
NAME         STATUS   ROLES    AGE     VERSION
k3s-master   Ready    master   3m16s   v1.19.5+k3s2

Workerの追加

参考にさせていただいたページ
qiita.com

# Masterのみ
# TOKENの取得
$ cat /var/lib/rancher/k3s/server/node-token
K10560f5b4981b71a2c7886935ea74b52540b698b0bb0c22a6232d3884e10f18333::server:7a988ded50e84665f0cb547d45f75f52

# Workerのみ
# k3sの停止
$ sh /usr/local/bin/k3s-killall.sh
$ systemctl stop k3s

# k3s-agentのservice設定
cat <<EOF > /etc/systemd/system/k3s-agent.service
[Unit]
Description=Lightweight Kubernetes Agent
Documentation=https://k3s.io
After=network-online.target

[Service]
Type=simple
EnvironmentFile=/etc/sysconfig/k3s-agent
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe nf_conntrack
ExecStartPre=-/sbin/modprobe overlay
ExecStartPre=-/sbin/modprobe vxlan
ExecStart=/usr/local/bin/k3s agent --server \$SERVER --token \$TOKEN
Delegate=yes
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
EOF

# デーモン設定
$ mkdir /etc/sysconfig/
$ cat <<EOF > /etc/sysconfig/k3s-agent
SERVER=https://k3s-master:6443
TOKEN=K10560f5b4981b71a2c7886935ea74b52540b698b0bb0c22a6232d3884e10f18333::server:7a988ded50e84665f0cb547d45f75f52 
EOF

$ systemctl daemon-reload
$ systemctl start k3s-agent
$ systemctl status k3s-agent
$ systemctl enable k3s-agent

しばらくすると

$ kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
k3s-master     Ready    master   6m40s   v1.19.5+k3s2
k3s-worker02   Ready    <none>   14s     v1.19.5+k3s2
k3s-worker01   Ready    <none>   14s     v1.19.5+k3s2

無事追加!

最後に

今回眠りに眠らせていたRaspbeyPi4をおうちKubernetesすることができた。
ちょっとした検証とかbotとか捗る環境にはなったと思う。
あとやり方は前記事と同じなので掲載しないが、MetalLBも導入した。
次はGitOps環境作りをやりたいな~(armイメージあるかなぁ..)