目次

Fedora CoreOS を利用してkubesprayでk8s環境を構築する


以前にCoreOSこと、Container Linuxを利用してお家k8s環境構築をしたことがあるが、この環境をMac mini 2018で稼働しているESXi7環境に移設しようかと考え、移設ではなく新規構築し直すことにした。

Container Linuxの配布が終了していた

最新のContainer Linuxを入手しようとしたところ、Redhatのページに色々なサイトからリンクがあるものの、ダウンロードリンクが見つからない。「これは困った」と調べていたところ、前回構築時にRedhatに買収されていたことを思い出した。

その後、2020年5月26日をもって、Container Linuxとしてのサポートが終了、9月1日以降配布も終了し、現在はFedora CoreOSに統合されていたことがわかった。

2020年5月26日に、CoreOS ContainerLinuxの最終アップデートが公開されました。その日以降に発見されたバグやセキュリティの脆弱性は修正されません。

2020年9月1日以降、CoreOS Container Linuxに関連する公開リソースは削除されるか、読み取り専用になります。OSのダウンロードは削除され、CoreUpdateサーバーはシャットダウンされ、OSイメージはAWS、Azure、およびGoogle ComputeEngineから削除されます。含むGitHubのリポジトリ、問題追跡は、ます、読み取り専用になります。

What was CoreOS and CoreOS Container Linux? より抜粋&日本語訳

後継のFedora CoreOSでも、Container Linux同様、コンテナに特化したLinuxディストリビューションであることから、Fedora CoreOSを利用して環境を作ることにした。

環境

環境 OS インフラ
ESXiホスト vSphere ESXi 7 Mac mini 2018 Corei3(3.6GHz) 64GB
k8s Fedora CoreOS (34.20210611.3.0 stable) 仮想マシン(OVFテンプレート)

Fedora Core OS仮想マシンの作成

まずは公式サイトからダウンロードします。

ダウンロードサイトトップは、Stable版(安定版)を選択できるようになっていますが、これはISOファイルで、ESXi向けではないため、右上の「ダウンロード」リンクを選択します。

Stable,Testing,Nextの3つが選択可能なページに移動しますが、Stableを選択します。

BareMetalのタブを選択し、VMware版を選択します。

初期設定用のIgnitionファイルの作成

Container Linuxと同様、初期設定、構築を自動化するためのIgnitionファイルを作成し読み込ませることでOSの設定が不要となります。

今回はSSH用途の鍵の設定、IPアドレス、ホスト名という最低限の設定とします。

このyamlファイルをもとに、Ignitionファイルを作成します。

yamlファイルからIgnitionファイルを作成をするツールが公式から配布されていました。 

例ではpodmanコマンドですが、注釈にもあるとおりdockerに読みかえることでDocker環境でも操作可能です。

ちなみに、ここの例に記載のある下記コマンド

podman run -i –rm quay.io/coreos/butane:release –pretty –strict < your_config.bu > transpiled_config.ign

podmanをdockerに読み替えてもオプションが違う旨のエラーが出るばかりでした。

原因は、。_< your_config.bu >_の<>をダブルクウォートの代わりと勝手に読み違えていたことが原因でした。
つまり **<>**は括っているわけではなく、ヒアドキュメントとして入力 < 、標準出力の内容を書き出し > であることに気がつくまでに小一時間悩みました。

ESXiへのFedore CoreOSのデプロイ

vSphere Web Clientにログインし、仮想マシンの作成を選択します。

 「OVFファイルまたは、OVAファイルから仮想マシンをデプロイ」を選択します。

vSphere上で分けるための仮想マシン名を入力し、ダウンロードしたOVAファイルを選択します。

 デプロイのオプションはデフォルトのままで、「次へ」を選択します。

Ignition Config Dataには、先程作成したIgnitionファイルをBase64で暗号化した値を入力します。

Mac OSを利用しているので、pbcopyを使います。

base64 fcos1.ign|pbcopy

クリップボードにbase64で暗号化された内容がコピーされているので、何も考えず、Ignition Config DataにCtrl + v で貼り付けます。

Ignition Config Data Encodingには、base64を入力します。

これを3台分繰り返します。

kubesprayを利用してkubernetes環境をセットアップする

いよいよメインです。

Githubから最新版をダウンロードしてきます。

Ansible環境をセットアップするのはなかなかに大変だと思いますので、Readmeに記載のある、セットアップ済みのDockerイメージを利用します。

A simple way to ensure you get all the correct version of Ansible is to use the pre-built docker image from Quay. You will then need to use bind mounts to get the inventory and ssh key into the container, like this:

ただし、こちらの設定はあくまでも参考方法となるためローカル環境に合わせた設定が必要です。

今回は以下のようにしました。

ローカル上のkubesprayのリポジトリルートに移動して、Docker上でマウントします。

1
2
3
4
 docker run --rm -it --mount type=bind,source="$(pwd)"/inventory,dst=/inventory \
                    --mount type=bind,source="${HOME}"/.ssh/id.rsa,dst=/root/.ssh/id.rsa \
                    --mount type=bind,src="$(pwd)",dst=/kubespray \
                    quay.io/kubespray/kubespray:v2.15.1 bash

これでローカル環境をマウントできた状態でdockerコンテナの中で作業ができます。

あとは、Readmeの通りに、
`pip3 install -r requirements.txt

declare -a IPS=(192.168.1.2 192.168.1.3 192.168.1.4)

CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}`

と、Ansible実行用途のhosts.yamlファイルを作成します。

Fedora CoreOS用途のカスタマイズ

ここでAnsibleを実行してk8s環境が構築できると良いのですが、結論から行くと、そのままの設定ではうまく行きませんでした
以下のファイルを書き換えることが必要です。

PRを出せるか、ちょっと悩んだのですが、AnsibleでFedora OSとFedora CoreOSの見分け方、あるいはANsibleでの判定方法をどうすれば良いかパッと思い浮かばなかったので、とりあえず手元で修正してそのままにしています。

そのうちいい案が出たらIssuesをあげてPRを上げるかもしれません。

Ansibleファイルのカスタマイズ

Fedora CoreOSには、/etc/fstab がない

Fedora CoreOSには /etc/fstab がありません。(多分)

なので、_/roles/kubernetes/preinstall/tasks/0010-swapoff.yml_の中にあるRemove swapfile from /etc/fstabのタスクが動きませんので、全てコメントアウトします。

Fedora CoreOSはgrubbyの代わりにrpm-ostreeを利用する

AnsibleはAnsible実行時にDistributionというパラメータの中にある値で OSを判定しているようですが、Fedora OSとFedora CoreOSでこの値が一致している模様です。

そのため、FedoraOS用と判断されて、grubbyを利用してカーネルパラメータを書き換えに行っていますが、grubbyは存在しないためこのタスクが失敗します。

Fedora CoreOSではgrubbyではなくrpm-ostreeを利用する必要があります。

これについては色々と議論されている模様ですが、今のところはrpm-ostreeを利用するしかなさそうです。

Ansible実行時にgrubbyの代わりにrpm-ostreeが利用されれば良いのですが、オプションの値も異なるため、この値を書き換えます。

まとめると以下のようになります。

こちらを反映した上で、playbookを実行することで、k8s環境が構築できます。