おうちで Flatcar Linux 使って Kubernetes クラスタをやっていく
最終的には Kuberenetes クラスタにしたい。
k8s distro は無難に kubeadm かなぁ。
ストレージ戦略
- USB Flash Drive: OS
- SSD: LVM で LV 切る
/var/lib/containerd/
- あとは TopoLVM で PV 用
マシン構成
TX1320 M1(Xeon E3-1220 v3 3.1GHz, 16GB RAM)が3台ある。
ヘタに HA 組むと LB もめんどいので、素朴に
- control-plane (single node)
- worker node (1)
- worker node (2)
でいいかなぁと諦めている。
まずはディスクの構成をやっていく。
LVM の LV を /
にマウントしたい(上記では /var/lib/containerd/
と書いたが、よく考えたらすべての stateful data は全部 SSD に書きたい)。
以下のマニュアルは RAID 用だが、予め SSD に VG と LV 作っておいて ROOT
ってラベル付けておいたらいけるんではないか。やってみる。
そうそう、USB メモリの方にある ROOT
ラベルは剥がしておかないといけない。
下準備
まずは ./flatcar-install -D
でイメージを落としておく。
このあと何度も USB メモリを書きまくるので都度ダウンロードしていると時間がもったいない。
このように焼く。
sudo ./flatcar-install -f flatcar_production_image.bin.bz2 -d /dev/disk/by-id/usb-SanDisk_SanDisk_3.2_Gen1_A200175378701A36-0:0 -i ignition.json
Ignition の試行錯誤なら flatcar-install
スクリプトの write_ignition
だけ呼べばそこだけ上書きできる説ある。
part-9 に ROOT
ってラベルが付いちゃってるので剥がす。
$ sudo e2label /dev/disk/by-id/usb-SanDisk_SanDisk_3.2_Gen1_A200175378701A36-0:0-part9
ROOT
ためしに part-9 (旧 ROOT) をマウントしてみたらいろいろ入ってるけどラベル剥がして大丈夫なのかな。
ROOT ラベル付きのパーティションに fs がいなかったら勝手にフォーマットしてこれらのファイルを作るのかもしれない。
わからんのでやってみる。
SSD に PV(LVM の Physical Volume のほう) 作ろうとしたら ddf_raid_member
signature があると言われた。そういえば TX1320 M1 には RAID コントローラが乗っているのだった。
SSD は1枚しか刺していないので事実上 RAID コントローラーは使っていないのだが、RAID のメンバーシップ情報だけは焼かれてしまっているらしい。
ひとまず ddf_raid_member
を wipe せずに PV を作ればいい気がする。
この SSD はかつてこの RAID コントローラーに接続されて使われていたものなのでメンバーシップ情報が既に書いてあって便利だが、新品の SSD をプロビジョニングするときはめんどいなぁ。
RAID コントローラーをバイパスできないものか。
pvcreate
でこのように言われる。
WARNING: ddf_raid_member signature detected on /dev/disk/by-id/ata-SanDisk_SDSSDA480G_172378450006 at offset 480103980544. Wipe it? [y/n]:
wipe しないと pv 作れないのかぁ。どうしたものかな
USB メモリが速すぎて bz2 の decompress が flatcar-install のボトルネックになってたので予め decompress しておくことにした
e2label で名前変えても GPT の名前は変わらないので parted で name 9 unused
した
ddf_raid_member
signature を wipe してしまったので OS からディスクが見えないねぇ。
手作業で SSD を初期化するのは諦めて、Ignition 内で PV, VG, LV を作るようにしないとダメかも。できるのかな。
Flatcar Linux のブートシーケンス的に、Ignition が走る段階だと LVM のボリュームは見えてないっぽい。
困ったなぁ。
initramfs に LVM が入ってないのが悪い気がする。これ簡単に自前で作れるのかな
いや、LVM は入ってるのか。vgchange -ay
相当の操作が必要なのかもしれない。
Ignition の前に入り込む余地はあるのだろうか
OEM
パーティションに grub.cfg
を作り、次の値を書き込んだ
set linux_append="rd.lvm.vg=flatcar-vg"
BOOT
の grub.cfg
が OEM
パーティションの grub.cfg
を読んでくれるっぽい雰囲気なので、これでいけるかもしれない。
あ、悲しい……
rootfs を LV にするのを諦め、/var/lib/containerd
などは別途丁寧に LV に逃がすこととし(これは真の rootfs がマウントされたあとの世界でやるので簡単)、rootfs は物理パーティションで10GBくらいくれてやることにする……敗北……
パーティションは手積みするとして、その他 kubeadm 入れるとか containerd 動かすとかは Ignition で書ける気がする
rootfs を物理パーティションにしたところ、何事もなかったかのように起動した。そりゃそうだ。
Kubernetes までの道のり
- kubeadm インストール
- kubelet インストール
- kubectl インストール
- containerd 設定
- kubeadm 流す
- 各種 plugin インストール
長い。
このようなわけで、無事別マシンで flatcar-install
を実行して SSD を焼けるようになった。
USB メモリは不要になったし、自動化もしやすくなった。
flatcar-install した直後のディスクの GPT はディスクの容量を使い切れていない(=backup table が末尾にない)ので、これを直さないとディスク容量を活用できない。
これを parted で直すと GRUB がパーティションを見失う。
そのため、gdisk を用いて直す。
直すついでに LVM のパーティションを作る。
直し方 & LVM パーティション追加
-
x
extra functionality (experts only) -
e
relocate backup data structures to the end of the disk -
v
verify disk- 念のため確認しておく。
No problems found.
なら OK
- 念のため確認しておく。
-
m
return to main menu -
n
add a new partition- Partition number:
10
- First sector: (default)
- Last sector: (default)
- Hex code or GUID:
8e00
(LVM)
- Partition number:
-
w
write table to disk and exit
VG 作成
sudo vgcreate flatcar-vg /dev/disk/by-id/<blahblah>-part10
ディスク取り外し
deactivate VG
sudo vgchange -an flatcar-vg
detach disk
sudo bash -c 'echo 1 > /sys/block/sdN/device/delete'
GPT を編集してもブートするようになったので、次は /var/lib/containerd
用の LV を作って mount するようにやってみる。
そもそも containerd はデフォルトだと動いてない(入ってはいる)
core@localhost ~ $ sudo systemctl status containerd
○ containerd.service - containerd container runtime
Loaded: loaded (8;;file://localhost/run/systemd/system/containerd.service^G/run/systemd/system/containerd.service8;;^G; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: 8;;https://containerd.io^Ghttps://containerd.io8;;^G
Container Linux Config の config.yaml にこんな感じで追記
systemd:
units:
- name: var-lib-containerd.mount
enable: true
contents: |
[Unit]
Description=Mount LV containerd to /var/lib/containerd
Before=local-fs.target
[Mount]
What=/dev/flatcar-vg/containerd
Where=/var/lib/containerd
Type=ext4
[Install]
WantedBy=local-fs.target
- name: containerd.service
enabled: true
dropins:
- name: 10-wait-containerd.conf
contents: |
[Unit]
After=var-lib-containerd.mount
Requires=var-lib-containerd.mount
gdisk でパーティションを作ったあと、LV を作る。
sudo lvcreate -n containerd -L 20g flatcar-vg
mkfs 忘れてた。
sudo mkfs.ext4 /dev/flatcar-vg/containerd
containerd は動くようになった。
kubeadm の要件を満たすべく、いろいろな設定ファイルを焼いていく作業に移る。
- br_netfilter をロードする
- containerd で systemd cgroup driver を使う
これらの設定ファイルは Ingnition で焼く。
アップグレード作業のことを考えると、kubectl/kubelet/kubeadm のインストールは Ignition ではなく Itamae でやるべきな気がしてきた。