Red HatでOpenShiftのサポートエンジニアをしている林です。
OpenShift 4をベアメタル、KVMなどで構築(UPI)するには、RHEL CoreOS(RHCOS)のマシンを起動する必要があります。そのための方法は大雑把に言って以下の二つです。
- RHCOSのインストーラーイメージを起動し、インストールメニューでIgnitionやカーネルイメージのURLを指定する
- PXEブートで、Ignitionやカーネルイメージの場所が指定されたブート構成ファイルを使用する
どちらにしても、Ignitionやカーネルイメージなどの資源をホストする環境を用意する必要があります。
MatchBoxは、RHCOSをネットワークブートする際に必要なIgnitionやカーネルイメージ、iPXEスクリプトなどをホストしてくれるWebアプリケーションです。
MACアドレスなどのマシン属性を引数にして様々なIgnitionやスクリプトを返してくれるので、例えばKVMでMACアドレスを指定して起動すれば、ユーザー入力なしでRHCOSの起動が完了します。
この記事では、MatchBoxを使って、KVM上でRHCOSを自動インストールして起動する手順を紹介します。
ちなみに、マッチ箱(MatchBox)でRHCOSを点火(Ignition)して起動する、的なアナロジーみたいですね。センスに溢れすぎてて震える。
マシン構成
今回紹介するマシン構成は以下の通りです。
- KVMホスト / base.examle.com
- PXEインフラ用VM / pxe.example.com
- dnsmasq(tftp)
- MatchBox
- RHCOSのVM / coreos.example.com
PXE環境としてdnsmasqでDHCP Proxy / tftpサーバーを立てて、さらにMatchBoxも同居している構成ですね。
なお、KVMの各VMはブリッジネットワークで起動しています。
MatchBox環境のセットアップ
大体はGitHub上の手順に従えばセットアップできます。
https://github.com/poseidon/matchbox/blob/v0.8.0/Documentation/deployment.md
MatchBoxのインストール、起動
まず、PXEインフラVMにMatchBoxをインストールして起動します。
## MatchBoxのダウンロードとインストール [cloud-user@pxe.example.com ~]$ curl -OL https://github.com/poseidon/matchbox/releases/download/v0.8.0/matchbox-v0.8.0-linux-amd64.tar.gz [cloud-user@pxe.example.com ~]$ tar -xzf matchbox-v0.8.0-linux-amd64.tar.gz [cloud-user@pxe.example.com ~]$ cd matchbox-v0.8.0-linux-amd6 [cloud-user@pxe.example.com ~]$ sudo cp matchbox /usr/local/bin [cloud-user@pxe.example.com ~]$ sudo cp contrib/systemd/matchbox-local.service /etc/systemd/system/matchbox.service ## MatchBoxの起動に必要なディレクトリとユーザーを作成 [cloud-user@pxe.example.com ~]$ sudo mkdir /etc/matchbox [cloud-user@pxe.example.com ~]$ sudo mkdir -p /var/lib/matchbox/{assets,groups,ignition,profiles} [cloud-user@pxe.example.com ~]$ sudo useradd -U -r matchbox ## MatchBoxの起動 [cloud-user@pxe.example.com ~]$ sudo systemctl daemon-reload [cloud-user@pxe.example.com ~]$ sudo systemctl enable --now matchbox.service [cloud-user@pxe.example.com ~]$ systemctl status matchbox ## ipxeのブートスクリプトを取得できることを確認 [cloud-user@pxe.example.com ~]$ curl http://localhost:8080/boot.ipxe #!ipxe chain ipxe?uuid=${uuid}&mac=${mac:hexhyp}&domain=${domain}&hostname=${hostname}&serial=${serial}
MatchBoxにRHCOS起動用のリソースを配置する
次に、MatchBoxでホストする、RHCOSの起動に必要なリソースをダウンロードしてMatchBoxから取得できるようにします。
[cloud-user@pxe.example.com ~]$ sudo su - [root@pxe.example.com ~]# cd /var/lib/matchbox/assets [root@pxe.example.com ~]# RHCOS_BASEURL=https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/ [root@pxe.example.com ~]# curl -OL ${RHCOS_BASEURL}/4.1/latest/rhcos-4.1.0-x86_64-installer-initramfs.img [root@pxe.example.com ~]# curl -OL ${RHCOS_BASEURL}/4.1/latest/rhcos-4.1.0-x86_64-installer-kernel [root@pxe.example.com ~]# curl -OL ${RHCOS_BASEURL}/4.1/latest/rhcos-4.1.0-x86_64-metal-bios.raw.gz ## 確認 [root@pxe.example.com ~]# curl -O http://localhost:8080/assets/rhcos-4.1.0-x86_64-installer-initramfs.img [root@pxe.example.com ~]# curl -O http://localhost:8080/assets/rhcos-4.1.0-x86_64-installer-kernel [root@pxe.example.com ~]# curl -O http://localhost:8080/assets/rhcos-4.1.0-x86_64-metal-bios.raw.gz
MatchBoxにRHCOS起動用のプロファイルを作成する
MatchBoxは、URLの引数にMACアドレスなどを渡すことで、RHCOS起動に必要な様々な情報を返してくれるWebサーバーです。 そのために、まず起動構成やIgnitionの情報などを記載したプロファイルを作成します。
[root@pxe.example.com ~]# cat <<'EOF' > /var/lib/matchbox/profiles/playground.json { "id": "playground", "name": "RHCOS - Playground", "ignition_id": "playground.ign", "boot": { "kernel": "/assets/rhcos-4.1.0-x86_64-installer-kernel", "initrd": [ "/assets/rhcos-4.1.0-x86_64-installer-initramfs.img" ], "args": [ "ip=dhcp", "rd.neednet=1", "console=tty0", "console=ttyS0", "coreos.inst=yes", "coreos.inst.install_dev=vda", "coreos.inst.image_url=http://pxe.example.com:8080/assets/rhcos-4.1.0-x86_64-metal-bios.raw.gz", "coreos.inst.ignition_url=http://pxe.example.com:8080/ignition?mac=${mac:hexhyp}" ] } } EOF
そして、上記のプロファイルで指定したIgnitionファイルを、ignition_id
と同名のファイル名で作成します。
[root@pxe.example.com ~]# cat <<EOF > /var/lib/matchbox/ignition/playground.ign { "ignition": { "version": "2.2.0" }, "passwd": { "users": [ { "name": "core", "sshAuthorizedKeys": [ "ssh-rsa AAAAB3NzaC <ログインで使用するSSH公開鍵>" ] } ] }, "storage": { "files": [ { "filesystem": "root", "group": {}, "path": "/etc/hostname", "user": {}, "contents": { "source": "data:text/plain;charset=utf-8,coreos.example.com", "verification": {} }, "mode": 420 } ] } } EOF
最後に、MACアドレスとプロファイルを紐付けるgroup
設定を作成します。MACアドレスは、KVMでVMを起動する時に任意のものを指定できるので、ここでは02:1a:4a:16:01:9c
を使用することにします。
[root@pxe.example.com ~]# cat <<EOF > /var/lib/matchbox/groups/playground.json { "id": "playground-1", "name": "RHCOS - Playground 1", "profile": "playground", "selector": { "mac": "02:1a:4a:16:01:9c" } } EOF
さて、ここまでの設定ができていれば、以下のようにURLを叩くことで必要なIginitionを取得できることを確認できるかと思います。
[cloud-user@pxe.example.com ~]$ curl http://localhost:8080/ignition?mac=02-1a-4a-16-01-9c { "ignition": { "version": "2.2.0" }, "passwd": { "users": [ { "name": "core", "sshAuthorizedKeys": [ "ssh-rsa AAAAB3Nz ..." ] } ] }, "storage": { "files": [ { "filesystem": "root", ...
PXE環境とブートの流れを確認
ここでは、PXE環境をdnsmasqで構築しています。dnsmasqで以下のように設定し、tftpサーバーを有効にしています。
私の環境では、DHCPサーバーはネットワーク上に既にあったため、ここでは、DHCP Proxyを使って構成します。
基本的に、以下のGitHubドキュメントに記載されているとおりで問題ないかなと思います。
https://github.com/poseidon/matchbox/blob/v0.8.0/Documentation/network-setup.md#proxy-dhcp
[root@pxe.example.com ~]# cat /etc/dnsmasq.conf # 既存のDHCPサーバーが割り当てているIPレンジ dhcp-range=192.168.1.1,proxy,255.255.255.0 # TFTP有効化 enable-tftp tftp-root=/var/lib/tftpboot # PXEリクエストの場合はTFTPでiPXEをロード(chainload)する pxe-service=tag:#ipxe,x86PC,"PXE chainload to iPXE",undionly.kpxe # iPXE user classからのリクエストの場合はipxeタグをセットする dhcp-userclass=set:ipxe,iPXE # ipxeタグ付きのリクエストでmatchboxがホストするスクリプトをロードする pxe-service=tag:ipxe,x86PC,"iPXE",http://pxe.example.com:8080/boot.ipxe # verbose log-queries log-dhcp
TFTPからiPXEをロードできるように、undionly.kpxe
をダウンロードしてTFTPのルートに配置します。
[root@pxe.example.com ~]# curl -OL http://boot.ipxe.org/undionly.kpxe [root@pxe.example.com ~]# mv undionly.kpxe /var/lib/tftpboot/
上記により、iPXEで以下のブートスクリプトが起動するはずです。念のため、ブートスクリプトを確認してみます。
## iPXEブートスクリプト [root@pxe.example.com ~]# curl http://localhost:8080/boot.ipxe #!ipxe chain ipxe?uuid=${uuid}&mac=${mac:hexhyp}&domain=${domain}&hostname=${hostname}&serial=${serial} ## chain先のスクリプト [root@pxe.example.com ~]# curl http://localhost:8080/ipxe?mac=02-1a-4a-16-01-9c #!ipxe kernel /assets/rhcos-4.1.0-x86_64-installer-kernel ip=dhcp rd.neednet=1 console=tty0 console=ttyS0 coreos.inst=yes coreos.inst.install_dev=vda coreos.inst.image_url=http://pxe.example.com:8080/assets/rhcos-4.1.0-x86_64-metal-bios.raw.gz coreos.inst.ignition_url=http://pxe.example.com:8080/ignition?mac=${mac:hexhyp} initrd /assets/rhcos-4.1.0-x86_64-installer-initramfs.img boot
RHCOSの起動
これで、ブートの環境ができたので、後はKVMでVMを立ち上げればRHCOSが起動します。
[root@base.example.com ~]# virt-install --name "rhcos-playground" \ --mac "02:1a:4a:16:01:9c" \ --memory 2046 --disk size=16 \ --network bridge=br0,model=virtio \ --os-variant rhel8.0 \ --debug --pxe ## 起動したVMのIPを確認するためコンソールにアクセスする [root@base.example.com ~]# virsh console rhcos-playground Connected to domain rhcos-playground Escape character is ^] Red Hat Enterprise Linux CoreOS 410.8.20190520.0 (Ootpa) 4.1 ... enp1s0: 192.168.1.xx ... coreos login: ^] ## 上記で確認したIPにSSHでログインする [root@base.example.com ~]# ssh -i <ignitionで指定した鍵> core@192.168.1.xx ... [core@coreos ~]$
OpenShift 4でRHCOSを起動する場合
今回は、RHCOSを単独で起動しましたが、RHCOSは、本来、OpenShift専用のOSですので、実際はOpenShift構成時に起動することになります。
以下の記事で田中さんが詳細について記載されているので、ご確認ください。
MatchBoxを使う場合は、openshift-install
コマンドで生成されるIgnitionファイルを、MatchBoxのデータディレクトリ/var/lib/matchbox
にコピーして、そのIgnitionファイルを参照するようプロファイルを作成すれば、簡単にOpenShift用のノードを起動することができるわけですね。
起動しない場合の確認
- ファイアウォールが正しく設定されているか
- DHCPサーバーが、適切なDNSサーバーのIPを配っているか
- virt-installで起動する時にMACアドレスを正しく指定しているか