OKD のクラスタを作る前に用意する踏み台サーバー(Rocky Linux 9)の構築手順です。DNS(dnsmasq)、ロード バランサー(HAProxy)、仮想マシンのディスク用の NFS と iSCSI ターゲット、インストール用のツール(oc・openshift-install)を 1 台にまとめます。
この記事の前提
- 参照: OKD Documentation(Installing an on-premise cluster with the Agent-based Installer)
- 踏み台サーバーに Rocky Linux 9 を最小構成で入れ、root でログインできること
- 踏み台サーバーからインターネットに出られること(オフラインのクラスタでも、踏み台だけはインターネットに出られる構成にします)
構成
| 役割 | 内容 |
|---|---|
| DNS | クラスタの API・Ingress(*.apps)・ノードの名前を引く。それ以外の名前は LAN の DNS へ転送 |
| HAProxy | platform: none のクラスタ用の、API・Machine Config Server・Ingress のロード バランサー(platform: baremetal では使わない) |
| NFS | 仮想マシンのディスク用の RWX(複数ノードから同時に使える)ストレージ |
| iSCSI ターゲット | 仮想マシンのディスク用のブロック ストレージ。2 系統のネットワークでマルチパスにする |
| ツール | oc(クラスタの操作)、openshift-install(インストール用の ISO の作成と完了待ち) |
| NIC | ネットワーク | IP アドレス |
|---|---|---|
| ens18 | LAN(インターネットに出られる) | 192.168.1.190/24 |
| ens19 | オフラインのクラスタ用(インターネットに出られない) | 10.30.0.1/24 |
| ens20 | iSCSI の 1 系統目 | 10.40.81.1/24 |
| ens21 | iSCSI の 2 系統目 | 10.40.82.1/24 |
この連載で作るクラスタと名前は次のとおりです。
| クラスタ | 方式 | API | Ingress(*.apps) |
|---|---|---|---|
| okdbm | オンライン、platform: baremetal | 192.168.1.194(クラスタが持つ VIP) | 192.168.1.195(VIP) |
| okdnone | オンライン、platform: none | 192.168.1.190(踏み台の HAProxy) | 192.168.1.190(HAProxy) |
| okdoff | オフライン、platform: baremetal | 10.30.0.4(VIP) | 10.30.0.5(VIP) |
追加の NIC の設定
実行する場所:踏み台サーバー(root)
# nmcli connection add type ethernet ifname ens19 con-name cluster-off ipv4.method manual ipv4.addresses 10.30.0.1/24 ipv6.method disabled
# nmcli connection add type ethernet ifname ens20 con-name iscsi-a ipv4.method manual ipv4.addresses 10.40.81.1/24 ipv6.method disabled
# nmcli connection add type ethernet ifname ens21 con-name iscsi-b ipv4.method manual ipv4.addresses 10.40.82.1/24 ipv6.method disabled
# ip -br addr
期待する出力(抜粋):
ens18 UP 192.168.1.190/24
ens19 UP 10.30.0.1/24
ens20 UP 10.40.81.1/24
ens21 UP 10.40.82.1/24
オフラインのクラスタ用のネットワーク(ens19)では、踏み台サーバーはルーター(IP 転送)として動かしません。クラスタのノードはインターネットに出られず、踏み台のレジストリや DNS だけを使います。
DNS(dnsmasq)
OKD は、API(api.<クラスタ名>.<ベース ドメイン>)、クラスタ内部の API(api-int)、アプリケーション(*.apps)の名前が引けることを前提にしています。
実行する場所:踏み台サーバー(root)
# dnf -y install dnsmasq bind-utils
# cat > /etc/dnsmasq.d/okd.conf <<'EOF'
domain-needed
bogus-priv
no-resolv
server=192.168.1.254
listen-address=127.0.0.1,192.168.1.190,10.30.0.1
bind-interfaces
local=/hvdoc.lab/
domain=hvdoc.lab
host-record=bastion.hvdoc.lab,192.168.1.190
host-record=registry.hvdoc.lab,10.30.0.1
host-record=master-1.hvdoc.lab,192.168.1.191
host-record=master-2.hvdoc.lab,192.168.1.192
host-record=master-3.hvdoc.lab,192.168.1.193
# okdbm(platform: baremetal)
host-record=api.okdbm.hvdoc.lab,192.168.1.194
host-record=api-int.okdbm.hvdoc.lab,192.168.1.194
address=/apps.okdbm.hvdoc.lab/192.168.1.195
# okdnone(platform: none)
host-record=api.okdnone.hvdoc.lab,192.168.1.190
host-record=api-int.okdnone.hvdoc.lab,192.168.1.190
address=/apps.okdnone.hvdoc.lab/192.168.1.190
# okdoff(オフライン)
host-record=off-master-1.hvdoc.lab,10.30.0.11
host-record=off-master-2.hvdoc.lab,10.30.0.12
host-record=off-master-3.hvdoc.lab,10.30.0.13
host-record=api.okdoff.hvdoc.lab,10.30.0.4
host-record=api-int.okdoff.hvdoc.lab,10.30.0.4
address=/apps.okdoff.hvdoc.lab/10.30.0.5
EOF
# systemctl enable --now dnsmasq firewalld
# firewall-cmd --permanent --add-service=dns
# firewall-cmd --permanent --zone=public --add-interface=ens19 --add-interface=ens20 --add-interface=ens21
# firewall-cmd --reload
| 設定 | 説明 |
|---|---|
| server | 自分で持たない名前の転送先(LAN の DNS) |
| listen-address / bind-interfaces | 待ち受ける IP アドレス。LAN とオフライン用のネットワークの両方で答える |
| local / domain | hvdoc.lab は自分だけで答える(外へ転送しない) |
| host-record | 名前と IP アドレス(逆引きも作られる) |
| address=/apps…/ | *.apps のワイルドカード。apps の下のすべての名前を同じ IP アドレスで返す |
確認
# dig +short @192.168.1.190 api.okdbm.hvdoc.lab
# dig +short @192.168.1.190 test.apps.okdbm.hvdoc.lab
# dig +short @192.168.1.190 -x 192.168.1.191
# dig +short @192.168.1.190 quay.io
期待する出力:
192.168.1.194
192.168.1.195
master-1.hvdoc.lab.
54.167.152.27
44.199.60.112
HAProxy(platform: none のクラスタ用)
platform: none では、クラスタは API と Ingress の VIP を持ちません。外部のロード バランサーで、API(6443)、Machine Config Server(22623)、Ingress(80・443)をマスター(コントロール プレーン)へ振り分けます。この連載のクラスタは 3 台構成(マスターが Ingress も動かす)なので、すべてマスターへ振り分けます。
実行する場所:踏み台サーバー(root)
# dnf -y install haproxy
# cat > /etc/haproxy/haproxy.cfg <<'EOF'
global
log 127.0.0.1 local2
maxconn 4000
daemon
defaults
mode tcp
log global
option tcplog
timeout connect 10s
timeout client 1m
timeout server 1m
frontend api
bind *:6443
default_backend api
backend api
balance roundrobin
option httpchk GET /readyz HTTP/1.0
http-check expect status 200
default-server check check-ssl verify none inter 5s fall 3 rise 2
server master-1 192.168.1.191:6443
server master-2 192.168.1.192:6443
server master-3 192.168.1.193:6443
frontend machine-config
bind *:22623
default_backend machine-config
backend machine-config
balance roundrobin
server master-1 192.168.1.191:22623 check
server master-2 192.168.1.192:22623 check
server master-3 192.168.1.193:22623 check
frontend ingress-http
bind *:80
default_backend ingress-http
backend ingress-http
balance source
server master-1 192.168.1.191:80 check
server master-2 192.168.1.192:80 check
server master-3 192.168.1.193:80 check
frontend ingress-https
bind *:443
default_backend ingress-https
backend ingress-https
balance source
server master-1 192.168.1.191:443 check
server master-2 192.168.1.192:443 check
server master-3 192.168.1.193:443 check
listen stats
bind *:9000
mode http
stats enable
stats uri /stats
EOF
# setsebool -P haproxy_connect_any 1
# haproxy -c -f /etc/haproxy/haproxy.cfg
# systemctl enable --now haproxy
# firewall-cmd --permanent --add-port=6443/tcp --add-port=22623/tcp --add-port=9000/tcp
# firewall-cmd --permanent --add-service=http --add-service=https
# firewall-cmd --reload
| 設定 | 説明 |
|---|---|
| mode tcp | TLS を終端せず、そのまま転送する(証明書はクラスタが持つ) |
| option httpchk GET /readyz | API サーバーの準備ができたノードにだけ振り分ける |
| balance source | 同じクライアントは同じノードへ(Ingress) |
| setsebool -P haproxy_connect_any 1 | SELinux で HAProxy が 6443・22623 などに接続・待ち受けできるようにする |
| listen stats | 振り分け先の状態を http://192.168.1.190:9000/stats で見る |
firewall-cmd の
--add-portと--add-serviceは 1 回のコマンドに混ぜられません(「argument –add-service: not allowed with argument –add-port」になります)。2 行に分けて実行します。
NFS(RWX ストレージ)
仮想マシンのライブ マイグレーションには、複数のノードから同時に使えるディスク(RWX)が必要です。NFS の CSI ドライバー(csi-driver-nfs)が、この下にボリュームごとのディレクトリを作ります。
実行する場所:踏み台サーバー(root)
# dnf -y install nfs-utils
# mkdir -p /srv/nfs/okd
# chmod 777 /srv/nfs/okd
# cat > /etc/exports.d/okd.exports <<'EOF'
/srv/nfs/okd 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check) 10.30.0.0/24(rw,sync,no_root_squash,no_subtree_check)
EOF
# systemctl enable --now nfs-server
# exportfs -rav
# firewall-cmd --permanent --add-service=nfs --add-service=mountd --add-service=rpc-bind
# firewall-cmd --reload
# exportfs -v
期待する出力:
/srv/nfs/okd 192.168.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
/srv/nfs/okd 10.30.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
iSCSI ターゲット(2 系統)
iSCSI のターゲット(LIO)を作り、ポータル(待ち受けの IP アドレス)を 2 系統のネットワークに 1 つずつ置きます。クライアント(クラスタのノード)は両方のポータルにログインし、マルチパスで 1 本の経路が切れても使い続けます。LUN と接続を許すノード(ACL)は、クラスタを作った後で追加します。
実行する場所:踏み台サーバー(root)
# dnf -y install targetcli
# systemctl enable --now target
# targetcli /iscsi create iqn.2026-10.lab.hvdoc:okd
# targetcli /iscsi/iqn.2026-10.lab.hvdoc:okd/tpg1/portals delete 0.0.0.0 3260
# targetcli /iscsi/iqn.2026-10.lab.hvdoc:okd/tpg1/portals create 10.40.81.1 3260
# targetcli /iscsi/iqn.2026-10.lab.hvdoc:okd/tpg1/portals create 10.40.82.1 3260
# targetcli saveconfig
# firewall-cmd --permanent --add-service=iscsi-target
# firewall-cmd --reload
# targetcli ls /iscsi
期待する出力:
o- iscsi .......................................................... [Targets: 1]
o- iqn.2026-10.lab.hvdoc:okd ....................................... [TPGs: 1]
o- tpg1 ............................................. [no-gen-acls, no-auth]
o- acls ........................................................ [ACLs: 0]
o- luns ........................................................ [LUNs: 0]
o- portals .................................................. [Portals: 2]
o- 10.40.81.1:3260 ................................................ [OK]
o- 10.40.82.1:3260 ................................................ [OK]
| 項目 | 説明 |
|---|---|
| iqn.2026-10.lab.hvdoc:okd | ターゲットの名前(IQN) |
| portals delete 0.0.0.0 3260 | 既定の「すべての IP アドレスで待ち受け」を消し、iSCSI 用のネットワークだけで待ち受ける |
| no-gen-acls | ACL に登録したノードだけが接続できる(既定) |
待ち受けの確認
# systemctl is-active dnsmasq haproxy nfs-server target
# ss -ltnp | grep -E ':(53|80|443|6443|22623|3260|2049|9000) '
期待する出力(抜粋):
active
active
active
active
LISTEN 0 256 10.40.81.1:3260 ...
LISTEN 0 4096 0.0.0.0:2049 ...
LISTEN 0 4000 0.0.0.0:22623 ... ("haproxy",...)
LISTEN 0 32 192.168.1.190:53 ... ("dnsmasq",...)
LISTEN 0 4000 0.0.0.0:6443 ... ("haproxy",...)
LISTEN 0 32 10.30.0.1:53 ... ("dnsmasq",...)
LISTEN 0 4000 0.0.0.0:443 ... ("haproxy",...)
LISTEN 0 256 10.40.82.1:3260 ...
インストール用のツール
OKD のリリース(GitHub の okd-project/okd)から、oc と openshift-install を取得します。openshift-install は、そのリリースのイメージを使うように作られているため、インストールする版と同じものを使います。
実行する場所:踏み台サーバー(root)
# dnf -y install nmstate tar
# V=5.0.0-okd-scos.3
# U=https://github.com/okd-project/okd/releases/download/$V
# mkdir -p /root/okd/bin && cd /root/okd/bin
# for f in openshift-client-linux-$V.tar.gz openshift-install-linux-$V.tar.gz sha256sum.txt; do curl -sSLO $U/$f; done
# sha256sum --ignore-missing -c sha256sum.txt
# tar xzf openshift-client-linux-$V.tar.gz oc kubectl
# tar xzf openshift-install-linux-$V.tar.gz openshift-install
# install -m 755 oc kubectl openshift-install /usr/local/bin/
# openshift-install version
# ssh-keygen -t ed25519 -N '' -f /root/.ssh/id_ed25519
期待する出力(抜粋):
openshift-client-linux-5.0.0-okd-scos.3.tar.gz: OK
openshift-install-linux-5.0.0-okd-scos.3.tar.gz: OK
openshift-install 5.0.0-okd-scos.3
release image quay.io/okd/scos-release@sha256:85785ae62b7f9b2cea64a80b2f748e502fed7c67a41f5500797f725e1ce6dd62
release architecture amd64
| 項目 | 説明 |
|---|---|
| nmstate | openshift-install が、agent-config.yaml のネットワーク設定(nmstate 形式)を検査するのに使う |
| ssh-keygen | ノード(core ユーザー)に SSH でログインするための鍵。公開鍵を install-config.yaml に書く |
