先日、Raspberry Pi 4でFedora CoreOSを起動してみました。
CoreOSはMobyエンジンを搭載しており、DockerとPodmanのどちらも使用する事ができます。
ベアメタルとしてコンテナを動かして使うこともできますし、クラスタを構築してノード(PC)を複数追加して、その中でコンテナを動かすこともできそうです。
その準備としまして。CoreOSの初期設定ファイル、butaneファイルを作っておこうと思います。
※23.6.17追記:下記の内容を追記しました。
- syctlによるIPv4フォワーディング有効化(Ansibleで必要)
- pythonの自動インストール(Ansibleで必要)
- ssh-keygenによるssh認証
- トランスパイル
※23.6.24追記:IgnitionにてGPTパーティションを作成できることを確認できました。
- ルートパーティションの容量変更
※23.7.6追記: Kubesprayでkubernetesクラスタを構築する際に、calicoを使用するための設定を追加しました。
- sysctlによるrp_filter有効化(calicoで必要)
※23.7.13追記: ファイルディスクリプタの制限を解除するスクリプトを追加しました。
目次
- 1 CoreOS用Butane初期設定ファイル覚書
- 1.1 設定マージ用
- 1.2 ユーザ設定 users.bu
- 1.3 ネットワーク設定 network.bu
- 1.4 ホスト名設定 hostname.bu
- 1.5 タイムゾーン設定 timezone.bu
- 1.6 キーボード設定 keyboard.bu
- 1.7 zarmにswapを作成 swaponzram.bu
- 1.8 パスワードでSSHログイン enable-passwords.bu
- 1.9 IPv4フォワーディング有効 sysctl.bu
- 1.10 rp_filter有効 reverse-path-filter.bu
- 1.11 python自動インストール rpm-ostree-python.bu
- 1.12 パーティション設定 storage.bu
- 1.13 ファイルディスクリプタの制限解除 LimitNOFILE.bu
- 1.14 コンテナ実行設定 container.bu
- 2 butaneファイルからignitionファイル作成
CoreOS用Butane初期設定ファイル覚書
Butaneの仕様はこちらになります。
Fedora CoreOSのほか、Flatcar、OpenShift、RHEL for Edgeの設定を作成する事が可能です。OSの指定は、yamlファイルのvariant項目で設定するようです。(Fedora CoreOSの場合variant: fcos
というわけで、この記事の記載した設定ファイルはFedora CoreOS用になります。
設定マージ用
CoreOSを構築するとき、設定ファイルであるIgnitionファイルを1つだけ指定します。
とはいえ、設定ファイルは最初から1つに混ぜ込んで作らずに、複数のbutaneファイルに分けておいたほうが、管理はしやすいように思えます。
どこかのタイミング、Butaneのyamlファイルか、トランスパイルしたIgnitionのjsonファイルか、どこかでマージするか、親子関係を作る必要があります。
適切なタイミングがどこか?まだ答えがでておらず、githubのissueもOpenの状態のようです。
この記事では、Butaneのmerge機能を使うとどうなるか、実験しようかなと思います。(まだ試していない
※23.6.11実際に試しました。個々のbuファイルを予めignにトランスパイルしておいて、mergeの中でignファイルを指定すれば、正しく動きます。
cat << EOF | tee config.bu
variant: fcos
version: 1.5.0
ignition:
config:
merge:
- local: users.ign
- local: storage.ign
- local: network.ign
- local: hostname.ign
- local: timezone.ign
- local: keyboard.ign
- local: swaponzram.ign
- local: enable-passwords.ign
- local: sysctl.ign
- local: reverse-path-filter.ign
- local: rpm-ostree-python.ign
- local: LimitNOFILE.ign
# - local: container.ign
EOF
では、これらの細かいbutaneファイルの覚書を記録しておこうと思います。
ユーザ設定 users.bu
cat << EOF | tee users.bu
variant: fcos
version: 1.5.0
passwd:
users:
- name: core
password_hash: <生成したパスワードのhash>
ssh_authorized_keys:
- ssh-ed25519 <ed25519キー>
EOF
CoreOSでは、一般的なrootユーザではなく、coreユーザが管理ユーザとなるようです。
ssh-rsaキーが一般的なのでしょうか。パスワードでログインしたい場合は、次のコマンドでパスワードのハッシュを生成し、butaneファイルを作っておきます。
podman run -ti --rm quay.io/coreos/mkpasswd --method=yescrypt
sudo dnf install -y mkpasswd
※23.6.17追記: rsaキーではなく、より信頼性の高いed25519キーの作成はこちら
ssh-keygen -t ed25519 -C ""
お勧めの方法は、パスワードのハッシュを作成し、password_hashの行を作成。
もしコントール用のマシンがあれば、そちらでed25519キーを作成し、ssh_authorized_keys行も追加しておく方法がお勧めです。
後述のenable-passwords.buを有効にすれば、パスワードでもSSHログインできるようになります。(セキュリティに配慮して使用してください
Ansibleを使用する場合は、sshキーは必須です。コントロールノード(指令を出すマシン)を決めて、そちらでsshキーを生成、パブリックキーをusers.buに入れておきましょう。
ネットワーク設定 network.bu
静的IPアドレスを設定したい場合、次のようなbutaneファイルになります。
address1等、xxxの部分を適宜変更しておいてください。
cat << EOF | tee network.bu
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/NetworkManager/system-connections/end0.nmconnection
mode: 0600
contents:
inline: |
[connection]
id=end0
type=ethernet
interface-name=end0
[ipv4]
address1=192.168.xxx.15/24,192.168.xxx.1
dns=192.168.xxx.1;
dns-search=
may-fail=false
method=manual
EOF
path項目のネットワーク設定ファイルのパスや、id項目のネットワークデバイス名end0等は、いちどCoreOSを起動・ログインして、確認しておくのも良いかもしれません。
※23.6.11追記:記事は最初デバイス名をeth0で作成しましたが、Raspberry Pi 4のEthernetデバイスは正しく設定されなかったため、end0に変更しました。Fedora CoreOS 38.20230514.3.0にて確認しました。
address1項目はIPアドレス/サブネットマスクとゲートウェイアドレスになります。
ホスト名設定 hostname.bu
cat << EOF | tee hostname.bu
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/hostname
mode: 0644
contents:
inline: pi4cos1
EOF
このサンプルでは「pi4cos1」というホスト名を設定しています。
タイムゾーン設定 timezone.bu
cat << EOF | tee timezone.bu
variant: fcos
version: 1.5.0
storage:
links:
- path: /etc/localtime
target: ../usr/share/zoneinfo/Asia/Tokyo
EOF
キーボード設定 keyboard.bu
cat << EOF | tee keyboard.bu
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/vconsole.conf
mode: 0644
contents:
inline: KEYMAP=jp106
EOF
日本語キーボードを接続する場合、こちらも必須かと思います。
zarmにswapを作成 swaponzram.bu
cat << EOF | tee swaponzram.bu
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/systemd/zram-generator.conf
mode: 0644
contents:
inline: |
# This config file enables a /dev/zram0 device with the default settings
[zram0]
EOF
swapをzramに作る設定になります。こちらは必要な場合のみ、使用する感じでしょうか。
クラスタを構築する場合は、swapはつくらない場合が多いと思います。
パスワードでSSHログイン enable-passwords.bu
cat << EOF | tee enable-passwords.bu
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/ssh/sshd_config.d/20-enable-passwords.conf
mode: 0644
contents:
inline: |
# Fedora CoreOS disables SSH password login by default.
# Enable it.
# This file must sort before 40-disable-passwords.conf.
PasswordAuthentication yes
EOF
コメントに記載があるように、Fedora CoreOSは、既定ではパスワードではSSHログインできないそうです。こちらの設定を使用すると、パスワード認証が有効になります。
IPv4フォワーディング有効 sysctl.bu
※23.6.17追記
こちらはAnsibleのマネージドノード(命令を受ける側)で必要になります。
cat << EOF | tee sysctl.bu
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/sysctl.d/90-sysrq.conf
contents:
inline: |
net.ipv4.ip_forward=1
EOF
rp_filter有効 reverse-path-filter.bu
※23.7.6追記: こちらはKubernetesでcalicoを使用する場合に必要になります。
cat << EOF | tee reverse-path-filter.bu
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/sysctl.d/reverse-path-filter.conf
contents:
inline: |
net.ipv4.conf.all.rp_filter=1
EOF
詳細はこちらになります。
python自動インストール rpm-ostree-python.bu
※23.6.17追記
実際に自動でpythonがインストールされることを確認しました。
※23.7.1追記
pip,libselinux-python3もインストールするように変更しました。
※23.7.18追記
kubesprayでhelmをインストールする場合、python3-pyyamlが必要なようです。
cat << EOF|tee rpm-ostree-python.bu
variant: fcos
version: 1.5.0
systemd:
units:
# installing python as a layered package with rpm-ostree
- name: layer-python.service
enabled: true
contents: |
[Unit]
Description=Layer python as with rpm-ostree
After=systemd-machine-id-commit.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/bash -c "/usr/bin/rpm-ostree install --reboot python pip libselinux-python3 python3-pyyaml"
[Install]
WantedBy=multi-user.target
EOF
ログイン可能になった後、しばらく経つと自動で再起動されて、rpm-ostreeにてインストールしたパッケージが使用可能になりました。
パーティション設定 storage.bu
※23.6.24追記:正しくパーティション構成されることを確認できました。
cat << EOF | tee storage.bu variant: fcos version: 1.5.0 storage: disks: - device: /dev/disk/by-id/coreos-boot-disk wipe_table: false partitions: - label: root number: 4 size_mib: 65535 resize: true - label: ceph size_mib: 0 filesystems: - device: /dev/disk/by-partlabel/root wipe_filesystem: true format: xfs label: root - device: /dev/disk/by-partlabel/ceph wipe_filesystem: true format: xfs label: ceph EOF
ファイルディスクリプタの制限解除 LimitNOFILE.bu
※23.7.13追記
CoreOSで開けるファイルの数の制限をなくす内容ですが。
まだ実際に動作試験をしていません。動かない可能性もありますのでご注意を。
cat << EOF | tee LimitNOFILE.bu
variant: fcos
version: 1.5.0
storage:
files:
- path: /etc/systemd/system/containerd.service.d/override.conf
contents:
inline: |
[Service]
LimitNOFILE=1048576
EOF
コンテナ実行設定 container.bu
最後がこちら。(ない
systemdのサービスを作成する設定になるかと思いますが、実行したいサービスにより内容が異なります。
基本的には、dockerやpodmanでコンテナを実行する感じでしょうか。
サーバとしてサービスを動かしたい場合は、該当するイメージでコンテナを起動したり。クラスタを作る場合はkubernetesコントローラのコンテナを実行したり。
また必要に応じてetcd等のサービスを起動可能のようです。
まあ、まだどのコンテナを動かそうか決めておりませんため。
以上の設定で起動して、coreユーザでログインしてみて考えたいと思います。
butaneファイルからignitionファイル作成
※23.6.17追記
butaneコマンドのエイリアスを作っておきます。
#エイリアスを作っておきます
alias butane='podman run --rm --interactive \
--security-opt label=disable \
--volume ${PWD}:/pwd --workdir /pwd \
quay.io/coreos/butane:release'
実際のトランスパイルのコマンドはこちらになります。
butane --pretty --strict users.bu > users.ign
butane --pretty --strict network.bu > network.ign
butane --pretty --strict hostname.bu > hostname.ign
butane --pretty --strict timezone.bu > timezone.ign
butane --pretty --strict keyboard.bu > keyboard.ign
butane --pretty --strict swaponzram.bu > swaponzram.ign
butane --pretty --strict enable-passwords.bu > enable-passwords.ign
butane --pretty --strict sysctl.bu > sysctl.ign
butane --pretty --strict reverse-path-filter.bu > reverse-path-filter.ign
butane --pretty --strict rpm-ostree-python.bu > rpm-ostree-python.ign
# butane --pretty --strict container.bu > container.ign
local:を使用する場合、トランスパイル時に-dオプションが必要のようです。config.buのトランスパイルのみ、下記のコマンドになります。
butane --pretty --strict -d . config.bu > config.ign
作成したconfig.ignを見ると、各ignファイルが圧縮されて埋め込まれているようです。
Fedora CoreOSのブートメディア作成時、config.ignファイルを使用します。
とりあえずCoreOSを起動して様子を見たい、という場合は、ユーザ設定のusers.buファイルのみ使用して、Ignitionファイルを作れば、coreユーザでログイン可能になりますのでお勧めです。
具体的な手順は、次回の記事にて。それではごきげんよう!
※23.6.11具体的な手順の記事はこちらです。