【備忘録】TKG 2.5.2 用の Linux カスタムイメージのビルドで引っかかった箇所のメモ書き

Share on:

Table of contents

概要

諸事情で検証用に Ubuntu Server 24.04 上で TKG 2.5.2 の Management Cluster 用の Photon OS カスタムイメージをビルドしていたのですが、ドキュメントの誤植やハマりどころがあまりにも多かったため (怒りの発散も兼ねて) メモしておきます。

なお、本記事の執筆中に TKG 2.5.3 がリリースされドキュメントが更新されていったため(それでもまだ誤植ありますが)、現在のドキュメントの状態はマシになっている可能性もあること、メモし忘れた箇所もあるかもしれないこと、作業環境起因の可能性もあるため、あくまでも参考レベルとの認識でお願いします。

Linux resource bundle コンテナイメージのリポジトリパス

ドキュメントではバージョンが「linux-resource-bundle:v1.28.11+vmware.1-tkg.3」となっていますが「linux-resource-bundle:v1.28.11_vmware.2-tkg.2」が正しいようです(“+” でなく “_")。

docker run コマンドは以下のようになります(docker pull は省略)。kubernetes の各種バイナリなどは本コンテナからダウンロードされるため、カスタムイメージのビルド前に事前に起動しておくのを忘れずに。

1docker run -d -p 3000:3000 projects.registry.vmware.com/tkg/linux-resource-bundle:v1.28.11_vmware.2-tkg.2

TKG Image Builder for Kubernetes の構成

はじめに Sample Exchange から Image Builder の TKG 用 Configuration Files をダウンロードして unzip します。以降は展開された「TKG-Image-Builder-for-Kubernetes-v1_28_11---vmware_2-tkg_v2_5_2」ディレクトリを作業ディレクトリとしています。

まずは tkg.json 内の pause コンテナイメージのリポジトリパスがおかしいので修正します。(Broadcom 社員向けか何かのリポジトリの書き換え漏れ?)

1sed -i "s/vsphere-docker-dev-local.usw5.packages.broadcom.com/projects.registry.vmware.com/" tkg.json

また、goss のテストの記述で以下の部分が誤っているため行ごと削除します。contains のtypoと思われ、そのまま実行してしまうとエラーになります。

1sed -i "/contents/d" goss/vsphere-photon-v1.28.11+vmware.2-tkg_v2_5_2-goss-spec.yaml

次に、ドキュメントで TKG Image Builder のコンテナイメージのバージョンが「image-builder:v0.1.40+vmware.3」となっていますが「image-builder:v0.1.40_vmware.3」が正しいようです(“+” でなく “_")。

1docker pull projects.registry.vmware.com/tkg/image-builder:v0.1.40_vmware.3

tkg.json と CREDENTIALS.json (以下 vsphere.json) はドキュメントに沿って書きます。

TKG Image Builder for Kubernetes の実行

tkg.json と以下 vsphere.json をドキュメントに沿って書いたら「mkdir -p output; chmod +w output」で output フォルダを作成した後、以下のように TKG Image Builder を実行します。

 1docker run -it --rm \
 2  -v $(pwd)/vsphere.json:/home/imagebuilder/vsphere.json \
 3  -v $(pwd)/tkg.json:/home/imagebuilder/tkg.json \
 4  -v $(pwd)/tkg:/home/imagebuilder/tkg \
 5  -v $(pwd)/goss/vsphere-photon-v1.28.11+vmware.2-tkg_v2_5_2-goss-spec.yaml:/home/imagebuilder/goss/goss.yaml \
 6  -v $(pwd)/metadata.json:/home/imagebuilder/metadata.json \
 7  -v $(pwd)/output:/home/imagebuilder/output \
 8  --network host \
 9  --env PACKER_VAR_FILES="tkg.json vsphere.json" \
10  --env OVF_CUSTOM_PROPERTIES=/home/imagebuilder/metadata.json \
11  --env IB_OVFTOOL=1 \
12  projects.registry.vmware.com/tkg/image-builder:v0.1.40_vmware.3 \
13  build-node-ova-vsphere-photon-3

Image Builder を実行すると Packer Plugin for VMware vSphere の vsphere-iso によるイメージのビルドがおこなわれますが、その中で Kickstart ファイルを公開するための HTTP サーバがリッスンされます。ビルド中の仮想マシンはその実行端末上の HTTP サーバにアクセスして Kickstart ファイルをダウンロードして自動インストールを開始します。

しかし、TKG Image Builder はコンテナとして提供されており、Docker のコンテナネットワーク内で実行されるため、デフォルトだと端末外でビルド中の仮想マシンからアクセスすることができません。このため、docker run に --network host を追記することで docker0 のブリッジを介さずにコンテナをホストネットワークに接続しています。

なお、端末に NIC が複数ある場合、vsphere-iso 側の HTTP サーバのオプション(http_ip, http_port_min, http_port_max)を追記して、ビルド中の仮想マシンがアクセスできるインターフェースの IP アドレスと TCP ポートを明示的に指定します。

1--env PACKER_FLAGS="--var 'http_ip=$HTTP_IP' --var 'http_port_min=$HTTP_PORT_MIN' --var 'http_port_max=$HTTP_PORT_MAX'"

ここまでで上手いこと行けば Photon OS 3,4 のイメージに関してはビルドできるようになるはずです(が Photon 4 は現時点で TKG 2.5 のサポート対象外)。

参考: Photon OS 5 がビルドできない

本当は EOL のベース OS は使いたくないため Photon OS 5 でビルドしたかったのですが、TKG Image Builder v0.1.40_vmware.3 で build-node-ova-vsphere-photon-5 を実行すると、以下のような mkisofs 等が無く ISO が作れない旨のエラーとなります。docker exec でコンテナ内に入ってみると ISO 作成関連のツールがコンテナイメージに入っていないようでした。

1==> vsphere-iso.vsphere: https://packages.vmware.com/photon/5.0/GA/iso/photon-minimal-5.0-dde71ec57.x86_64.iso?checksum=sha512%3A85cddaa8da26c095cf55d3f22f0838ad5d9ae73aa476d0c5c8e54bfbfcb432deaf940733c2cb5af14d1e5b133da65c17f3f4e215bf381d5b8b411d548b66a463 => /home/imagebuilder/.cache/packer/b17d096eb77a9755e990d76033d1c0757322f9bd.iso
2==> vsphere-iso.vsphere: Creating CD disk...
3Build 'vsphere-iso.vsphere' errored after 9 seconds 551 milliseconds: could not find a supported CD ISO creation command (the supported commands are: xorriso, mkisofs, hdiutil, oscdimg)

docker image inspect や docker history でイメージを調べると、最新の upstream のDockerfileに比べて apt-get でインストールされるパッケージが少ない(xorriso も無い)ようだったので、おそらくはパッケージの入れ忘れだろうとは予想しています。

upstream の Kubernetes Image Builder のコンテナイメージを使ったところ問題なくビルドできましたが、Broadcom のリポジトリから提供されている(=Broadcom のサポート対象の)コンテナイメージではないので、Broadcom のサポートが必要な環境での使用は難しいかもしれません。