OKD4 Home Lab

在兩台實體機上以 KVM/QEMU 部署生產級 OKD 4.4 叢集
Bare metal OpenShift-upstream cluster for learning & lab use

OKD 4.4Fedora CoreOSKVM / QEMUpfSenseHAProxyBIND DNSApache httpdNFSCentOS 7Kubernetes
🏗 網路架構
Internet
    │
[pfSense]  WAN: <home-network> / LAN: 192.168.1.1
    │
    ├── 192.168.1.0/24 (OKD VLAN)
    │       ├── [services]  192.168.1.210   DNS · HAProxy · Apache · NFS
    │       ├── [bootstrap] 192.168.1.200   Fedora CoreOS
    │       ├── [master1-3] 192.168.1.201-203
    │       └── [worker1-2] 192.168.1.204-205
pfSense DHCP → MAC 靜態對應 → 固定 IP
🖥 VM 規格
NodeRoleOSvCPURAMStorageIP
bootstrapBootstrapFedora CoreOS416G120G192.168.1.200
master1MasterFedora CoreOS416G120G192.168.1.201
master2MasterFedora CoreOS416G120G192.168.1.202
master3MasterFedora CoreOS416G120G192.168.1.203
worker1WorkerFedora CoreOS28G120G192.168.1.204
worker2WorkerFedora CoreOS28G120G192.168.1.205
servicesDNS/LB/NFSCentOS 722G20+100G192.168.1.210
pfsenseRouterFreeBSD21G8GWAN / 192.168.1.1
📋 安裝流程
1

準備 ISO 與工具

下載所有需要的安裝媒體與 OKD 工具

  • pfSense CE 2.4.5 ISO
  • Fedora CoreOS 31 metal raw.xz + sig
  • Fedora CoreOS 31 live ISO(用於安裝節點)
  • CentOS 7 Minimal ISO
  • openshift-install + openshift-client 4.4.0-0.okd
2

KVM 主機準備

在兩台實體機(okd1/okd2)設定 SSH key 登入、時區統一、確認外網連線。透過 XQuartz + X11 Forwarding 在本機操作遠端 virt-manager 建立 VM。

  • ssh-keygen + authorized_keys 設定
  • hostnamectl set-hostname okd1 / okd2
  • brew install --cask xquartz
  • ssh -X okd1-root → virt-manager
3

pfSense Router/DHCP

建立 pfSense VM(雙網卡:WAN + LAN)。設定 DHCP Static Mapping 確保各節點取得固定 IP;NAT Port Forward 8080/22/6443/443/80 至 services VM。

4

Services VM(CentOS 7.8)

安裝 DNS(BIND)、HAProxy、Apache(port 8080)、NFS(100G partition)。時區需與 KVM 主機一致,否則 openshift-installer 產生的 TLS cert 會有問題。

  • BIND:clone okd4_files → cp db* /etc/named/zones/
  • HAProxy:停用 NetworkManager 改用靜態 ifcfg
  • Apache:port 8080 提供 ignition + FCOS image
  • NFS:fdisk → mkfs.ext4 → /var/nfsshare 給 registry PV
5

openshift-installer

設定 install-config.yaml(填入 pull secret + SSH pubkey),產生 manifests,修改 mastersSchedulable: false,產生 ignition configs,複製到 Apache web root。

  • openshift-install create manifests --dir=install_dir/
  • cluster-scheduler-02-config.yml → mastersSchedulable: false
  • openshift-install create ignition-configs --dir=install_dir/
  • cp -R install_dir/* /var/www/html/okd4/ + wget FCOS raw.xz
6

建立叢集節點

依序啟動 bootstrap → master1-3 → worker1-2。每台 VM 開機按 TAB 輸入 coreos.inst.* 參數指向 Apache 上的 ignition URL 與 FCOS image URL。

  • 確認 bootstrap 完成:openshift-install wait-for-bootstrap-complete
  • 移除 HAProxy 中的 bootstrap backend,virsh destroy bootstrap
  • 簽署 worker CSR:oc get csr -ojson | jq ... | xargs oc adm certificate approve(兩次)
  • oc get nodes + oc get clusteroperators 全部 Ready/Available
7

後續設定

建立 Image Registry PV(NFS 100Gi)、設定 HTPasswd 認證、監控儲存(Prometheus/Alertmanager),登入 Web Console 驗收。

關鍵指令
Bootstrap 節點安裝(開機時按 TAB)
coreos.inst.install_dev=/dev/sda
coreos.inst.image_url=http://192.168.1.210:8080/okd4/fcos.raw.xz
coreos.inst.ignition_url=http://192.168.1.210:8080/okd4/bootstrap.ign
確認 bootstrap 完成
openshift-install --dir=install_dir/ \
  wait-for-bootstrap-complete \
  --log-level=debug
簽署 Worker CSR(執行兩次)
export KUBECONFIG=~/install_dir/auth/kubeconfig
oc get csr -ojson | \
  jq -r '.items[] | 
    select(.status == {}) | 
    .metadata.name' | \
  xargs oc adm certificate approve
確認叢集就緒
oc get nodes
# 全部 Ready
oc get clusteroperators
# AVAILABLE: True
📁 Config Files
⚙️
install-config.yaml
叢集安裝設定(pullSecret / SSH key 填入後 gitignore)
⚖️
haproxy.cfg
HAProxy:API 6443 / MCS 22623 / Ingress 80/443
🌐
db.okd.local
BIND 正向 DNS zone(A records for all nodes)
🔁
db.192.168.1
BIND 反向 DNS zone(PTR records)
📝
named.conf
BIND 主設定 + named.conf.local
🌍
httpd.conf
Apache port 8080 設定(提供 ignition + FCOS image)
🖥
ocp4-pxelinux.cfg_default
PXE 開機選單(PXE 替代方案)
💾
registry_pv.yaml
Image Registry PersistentVolume(NFS 100Gi)
📊
configmap-cluster-monitoring-config.yaml
Prometheus / Alertmanager NFS 儲存
🔐
htpasswd_provider.yaml
HTPasswd OAuth identity provider
📤
nfs.config
NFS exports(/var/nfsshare 192.168.1.0/24)
💻
initrd-cmd.txt
節點開機參數(coreos.inst.*),PXE TAB 輸入用
🐳 nginx on OKD4
Dockerfile
# non-privileged nginx for OpenShift
FROM nginx:stable

RUN chmod g+rwx \
      /var/cache/nginx \
      /var/run \
      /var/log/nginx
# OKD 不允許監聽 privileged port
RUN sed -i.bak \
  's/listen\(.*\)80;/listen 8081;/' \
  /etc/nginx/conf.d/default.conf
EXPOSE 8081
Deploy to OKD4
# 建立應用
oc new-app \
  jimc1682000/okd4-nginx

# expose service
oc expose svc/okd4-nginx

# 查看路由
oc get route okd4-nginx

# 進入 pod
oc exec -it \
  $(oc get pod -l app=okd4-nginx \
    -o name) -- /bin/sh
OKD/OpenShift 以任意 UID 執行 pod,nginx 預設的 root + port 80 需調整才能正常運作。
💡 關鍵經驗

時區一致性

Services VM 時區必須與 KVM host 完全一致,否則 openshift-installer 產生的 TLS cert 時間有誤,bootstrap 永遠無法完成。

NetworkManager 衝突

CentOS 7 的 HAProxy 重啟時會觸發 NetworkManager 重置網路,需停用 NM 改用靜態 ifcfg 設定。

CSR 要簽兩次

Worker node 加入需簽署兩輪 CSR:第一輪是 openshift-machine-config-operator 的,第二輪才是 worker 本身。

install-config 備份

openshift-install 產生 manifests 後會自動刪除 install-config.yaml,務必在執行前先備份。

nginx port 限制

OKD pod 以任意 UID 執行,nginx 需從 port 80 改為 8081+ 並開放 /var/cache/nginx 等目錄的 group 寫入。

Bootstrap 移除時機

wait-for-bootstrap-complete 顯示 complete 後,需立刻從 HAProxy cfg 移除 bootstrap backend 再重啟,否則 API 健康檢查會持續失敗。