Cara install OKD
OKD adalah distribusi Kubernetes komunitas (upstream dari Red Hat OpenShift). Halaman ini mencatat langkah lengkap memasang OKD Single Node (SNO) sebagai satu VM di Proxmox VE, memakai Agent-based Installer, untuk keperluan cluster dev.
Ringkasan
| Item | Nilai |
|---|---|
| Versi OKD | 5.0.0-okd-scos.3 (stable)
|
| OS node | CentOS Stream CoreOS (SCOS), ter-bake di ISO |
| Metode install | Agent-based Installer, topologi SNO |
| Hypervisor | Proxmox VE, standalone node node-3
|
| Bridge jaringan | vmbr3 (LAB) → subnet 192.168.90.0/24
|
| Gateway | 192.168.90.1 (MikroTik)
|
| VM bastion (DNS) | 192.168.90.29, AlmaLinux, dnsmasq
|
| VM OKD (node) | 192.168.90.30, hostname okd-sno
|
| Cluster / base domain | okd / lab.local
|
| Mesin kerja | Arch Linux (edit config + generate ISO) |
Memilih topologi
- SNO (1 node): paling hemat resource, cocok untuk dev. Tidak ada HA, dan tidak bisa dikonversi ke cluster HA setelah terpasang.
- Compact cluster (3 node): ketiga node jadi master sekaligus worker. Lebih mirip production, tetap punya quorum etcd.
- 2 node: OKD punya topologi two-node with fencing (butuh BMC, tidak cocok untuk VM Proxmox) dan two control plane + arbiter (tetap 3 mesin, salah satunya arbiter kecil). Untuk lab, praktis pilih SNO atau 3 node.
Dipilih SNO supaya resource host tetap lega untuk VM lain.
Arsitektur
Arch Linux (laptop) ──WireGuard──► Proxmox (vmbr0, 192.168.11.x)
│ generate ISO
▼
Proxmox vmbr3 (LAB, 192.168.90.0/24)
├── VM bastion 192.168.90.29 → dnsmasq (DNS cluster)
└── VM OKD SNO 192.168.90.30 → seluruh cluster OKD
▲
gateway MikroTik 192.168.90.1 → internet (quay.io)
Kenapa butuh bastion di dalam vmbr3? Host Proxmox tidak punya IP di vmbr3, dan laptop berada di jaringan lain (lewat WireGuard). Node OKD harus bisa menjangkau DNS-nya, jadi DNS diletakkan di VM yang satu subnet dengan node.
Bastion hanyalah istilah untuk mesin pembantu yang mengurus cluster (tempat oc, DNS, dsb.). DNS ini harus tetap hidup selama cluster hidup, bukan hanya saat install, karena node memakai nama api-int untuk komunikasi internal.
Kebutuhan resource
| VM | vCPU | RAM | Disk |
|---|---|---|---|
| OKD SNO | 16 | 32 GB | 150 GB |
| Bastion (AlmaLinux minimal) | 1–2 | 1–2 GB | 10–20 GB |
Catatan:
- Spesifikasi minimal SNO di dokumentasi sekitar 8 vCPU / 16 GB, tapi 32 GB lebih nyaman.
- Di Proxmox, pemakaian RAM VM OKD terlihat sekitar 27 GiB saat install. Angka itu termasuk page cache dan tanpa guest agent, jadi lebih besar dari pemakaian riil. Cek angka asli dengan
oc adm top node.
Langkah 1: Siapkan binary di mesin kerja
Binary diambil dari GitHub Releases proyek OKD: https://github.com/okd-project/okd/releases
- Pilih rilis stable (tanpa label Pre-release dan tanpa
ecdi namanya). - Download
openshift-install-linux-<tag>.tar.gzdanopenshift-client-linux-<tag>.tar.gz.
TAG=<tag-stable>
BASE=https://github.com/okd-project/okd/releases/download/$TAG
curl -LO $BASE/openshift-install-linux-$TAG.tar.gz
curl -LO $BASE/openshift-client-linux-$TAG.tar.gz
tar xzf openshift-install-linux-$TAG.tar.gz openshift-install
tar xzf openshift-client-linux-$TAG.tar.gz oc kubectl
sudo mv openshift-install oc kubectl /usr/local/bin/
openshift-install version
oc version --client
Penting: oc wajib ada di $PATH, karena openshift-install memanggilnya saat membuat ISO.
Binary openshift-install terkunci ke satu rilis, jadi versi OKD yang terpasang sama dengan versi binary.
Install juga nmstate (menyediakan nmstatectl, dipakai untuk validasi IP statis):
yay -S nmstate # Arch (AUR)
nmstatectl --version
Buat SSH key kalau belum ada:
ssh-keygen -t ed25519 -N ""
cat ~/.ssh/id_ed25519.pub
Langkah 2: Buat VM bastion (AlmaLinux)
AlmaLinux dipilih karena stabil dan support-nya panjang. Fedora kurang cocok untuk server yang hidup lama (siklus rilis cepat); CentOS Stream lebih sering berubah.
Setelan VM di Proxmox:
- Bridge
vmbr3, NIC VirtIO. - CPU type
host(lihat bagian Troubleshooting: kernel panic). - RAM minimal 2 GB saat instalasi.
- Options → Start at boot aktif.
Kunci IP statis
nmcli -t -f NAME,DEVICE con show
sudo nmcli con mod ens18 ipv4.method manual \
ipv4.addresses 192.168.90.29/24 ipv4.gateway 192.168.90.1 \
ipv4.dns "192.168.90.29"
sudo nmcli con up ens18
sudo hostnamectl set-hostname marshall-okd-bastion
DNS bastion diarahkan ke dnsmasq miliknya sendiri (192.168.90.29), bukan ke DNS publik. Kalau tidak, bastion tidak bisa resolve api.okd.lab.local dan wait-for tidak bisa memantau install.
Pastikan IP bastion dan IP node berada di luar pool DHCP MikroTik. Cek tanpa mengubah apa pun:
/ip pool print /ip dhcp-server lease print
Cek IP node masih kosong:
ping -c2 192.168.90.30 # harus gagal
ip neigh | grep 192.168.90.30 # kosong atau FAILED
Langkah 3: DNS dengan dnsmasq
OKD membutuhkan tiga record:
| Record | Fungsi |
|---|---|
api.okd.lab.local |
API cluster (port 6443), dipakai oc dan installer
|
api-int.okd.lab.local |
API internal, dipakai node dan komponen cluster |
*.apps.okd.lab.local |
Ingress: web console, OAuth, dan semua aplikasi |
Di SNO, ketiganya mengarah ke IP node.
sudo dnf install -y dnsmasq bind-utils
sudo tee /etc/dnsmasq.d/okd.conf <<'EOF'
listen-address=192.168.90.29
bind-interfaces
server=1.1.1.1
server=8.8.8.8
address=/api.okd.lab.local/192.168.90.30
address=/api-int.okd.lab.local/192.168.90.30
address=/apps.okd.lab.local/192.168.90.30
EOF
Penjelasan:
server=adalah DNS upstream untuk nama di luar cluster (quay.io, dll.). dnsmasq hanya menjadi klien ke server itu, tidak mengubah konfigurasi router.address=/apps.okd.lab.local/...otomatis mencakup semua subdomain (wildcard).listen-address+bind-interfacesmembuat dnsmasq hanya mendengarkan di IP tersebut, sehingga tidak bentrok dengan resolver lain.
Pastikan folder .d terbaca:
grep -n conf-dir /etc/dnsmasq.conf
# kalau tidak ada / masih dikomentari:
echo 'conf-dir=/etc/dnsmasq.d/,*.conf' | sudo tee -a /etc/dnsmasq.conf
Jalankan dan uji:
sudo dnsmasq --test
sudo systemctl enable --now dnsmasq
sudo firewall-cmd --add-service=dns --permanent && sudo firewall-cmd --reload
sudo ss -lntup | grep ':53'
dig +short api.okd.lab.local @192.168.90.29 # → 192.168.90.30
dig +short quay.io @192.168.90.29 # harus ada jawaban
getent hosts api.okd.lab.local # dari bastion sendiri
Langkah 4: install-config.yaml
apiVersion: v1
baseDomain: lab.local
metadata:
name: okd
compute:
- name: worker
replicas: 0
controlPlane:
name: master
replicas: 1
networking:
networkType: OVNKubernetes
machineNetwork:
- cidr: 192.168.90.0/24
clusterNetwork:
- cidr: 10.128.0.0/14
hostPrefix: 23
serviceNetwork:
- 172.30.0.0/16
platform:
none: {}
pullSecret: '{"auths":{"fake":{"auth":"aWQ6cGFzcwo="}}}'
sshKey: 'ssh-ed25519 AAAA... (isi ~/.ssh/id_ed25519.pub)'
Catatan:
platform: nonedipakai karena Proxmox tidak punya integrasi native.- Pull secret dummy (
id:passdalam base64) cukup untuk OKD, karena image diambil dariquay.io/okdyang publik. Pull secret asli Red Hat hanya perlu untuk OpenShift atau image dariregistry.redhat.io.
Langkah 5: agent-config.yaml
apiVersion: v1alpha1
kind: AgentConfig
metadata:
name: okd
rendezvousIP: 192.168.90.30
hosts:
- hostname: okd-sno
role: master
interfaces:
- name: eth0
macAddress: BC:24:11:00:00:30
networkConfig:
interfaces:
- name: eth0
type: ethernet
state: up
mac-address: BC:24:11:00:00:30
ipv4:
enabled: true
dhcp: false
address:
- ip: 192.168.90.30
prefix-length: 24
dns-resolver:
config:
server:
- 192.168.90.29
routes:
config:
- destination: 0.0.0.0/0
next-hop-address: 192.168.90.1
next-hop-interface: eth0
table-id: 254
Catatan:
- MAC address ditentukan sendiri, lalu dipasang manual di NIC VM. Installer mencocokkan IP statis ke VM berdasarkan MAC.
- Aturan MAC: oktet pertama harus genap di digit keduanya (unicast). Prefix
BC:24:11adalah prefix Proxmox. - Nama interface
eth0hanya label; pencocokan dilakukan lewat MAC.
Langkah 6: Generate ISO
ISO tidak didownload, melainkan dibuat oleh openshift-install dari dua YAML di atas. File YAML akan dikonsumsi (dihapus) saat generate, jadi simpan backup.
cd ~/okd
mkdir -p ~/okd-backup && cp install-config.yaml agent-config.yaml ~/okd-backup/
rm -rf cluster && mkdir cluster
cp install-config.yaml agent-config.yaml cluster/
openshift-install agent create image --dir cluster --log-level=info
Hasil: cluster/agent.x86_64.iso, plus cluster/auth/ (kubeconfig dan password kubeadmin).
- Tidak ada progress bar saat
Downloading base ISO; tunggu sampai prompt kembali. - Warning
Failed to extract base ISO from release payloadtidak fatal; installer jatuh ke jalur download. - Setiap perubahan IP/DNS/MAC wajib generate ulang ISO, karena konfigurasi ter-bake di dalamnya.
Salin folder cluster/ ke bastion supaya wait-for dan oc bisa dijalankan dari sana.
Langkah 7: Buat VM OKD di Proxmox
Upload ISO lewat UI Proxmox (storage → ISO Images → Upload), lalu Create VM:
| Tab | Setelan | Alasan |
|---|---|---|
| General | Start at boot | Cluster ikut hidup saat host reboot |
| OS | ISO agent.x86_64.iso |
|
| System | Machine q35, BIOS SeaBIOS |
q35 chipset modern (opsional, i440fx juga bisa). Kalau OVMF, matikan Secure Boot |
| Disks | VirtIO SCSI single, 150 GB, SSD, Discard + SSD emulation | Discard (TRIM) mengembalikan ruang thin-provisioned ke host; opsional |
| CPU | 1 socket, 16 core, type host |
Wajib. SCOS butuh instruksi CPU modern; tipe default bisa memicu crash |
| Memory | 32768 MB, Ballooning off | Penting. Kubernetes mengasumsikan RAM tetap; balloon bisa memicu OOM/eviction |
| Network | Bridge vmbr3, VirtIO, MAC BC:24:11:00:00:30 |
Harus sama persis dengan agent-config.yaml |
| Options → Boot Order | scsi0 di atas CD-ROM |
Setelah install, node boot dari disk, bukan installer lagi |
Langkah 8: Install dan pantau
Start VM. Di Console Proxmox, tanda awal yang benar:
ens18: 192.168.90.30 Ignition: user-provided config was applied This host (192.168.90.30) is the rendezvous host.
Urutan yang terlihat:
Waiting for services→ service installer naik satu per satu.Installation cannot proceed: Cluster status: insufficient→ sementara, validasi host belum selesai.Cluster installation in progress.Writing image to disk0–100%, lalu node reboot dari disk.- Log
crio-... libcrun containerberulang → container cluster dinyalakan (normal). Finished bootkube.service→ bootstrap selesai.
Pantau dari bastion:
cd ~/okd
openshift-install agent wait-for bootstrap-complete --dir cluster --log-level=info
openshift-install agent wait-for install-complete --dir cluster --log-level=info
- Pesan
cluster bootstrap did not completetepat setelah Writing image to disk: 100% bisa muncul karenawait-forkehilangan kontak saat node reboot dari ISO ke disk. Jalankan ulangwait-for(aman, tidak mengganggu installer). - Install aktual memakan sekitar 1 jam (cluster
Availablesekitar 09:15 dari mulai 08:11).
Cek status langsung:
export KUBECONFIG=~/okd/cluster/auth/kubeconfig
curl -k https://api.okd.lab.local:6443/version
oc get clusterversion
oc get co
Install sukses bila clusterversion Available=True dan semua cluster operator Available=True, Progressing=False, Degraded=False.
Langkah 9: Akses web console
Password:
cat ~/okd/cluster/auth/kubeadmin-password
Console tidak bisa dibuka lewat IP:port, karena router OKD memilih tujuan berdasarkan nama host. Di mesin yang menjalankan browser, tambahkan ke /etc/hosts:
192.168.90.30 api.okd.lab.local console-openshift-console.apps.okd.lab.local oauth-openshift.apps.okd.lab.local
Buka https://console-openshift-console.apps.okd.lab.local, login sebagai kubeadmin. Peringatan sertifikat (self-signed) normal.
Mesin itu juga harus bisa menjangkau 192.168.90.0/24 (misalnya lewat route WireGuard atau sshuttle via bastion).
Tes router tanpa browser:
curl -kI --resolve console-openshift-console.apps.okd.lab.local:443:192.168.90.30 \
https://console-openshift-console.apps.okd.lab.local
Langkah 10: Setelah install
- Snapshot VM OKD selagi bersih.
- Lepas ISO dari VM OKD (CD/DVD → Do not use any media).
- Autostart dan urutan boot: bastion order 1, OKD order 2, beri jeda start.
- Simpan
cluster/auth/di tempat aman. - Storage class: cluster baru di
platform: nonebelum punya storage dinamis; PVC akan Pending sampai dipasang NFS / local-path / LVMS. Cek denganoc get sc. - Image registry (dev): (emptyDir: isi hilang saat pod restart, hanya untuk dev.)
oc patch configs.imageregistry.operator.openshift.io cluster --type merge \ --patch '{"spec":{"managementState":"Managed","storage":{"emptyDir":{}}}}'
- Keamanan: jangan publikasikan console, OAuth, dan API ke internet selama masih memakai
kubeadmin. Ganti dengan user admin biasa lewat OAuth.
Publish aplikasi dengan domain sendiri (rencana)
Alur: Internet → MikroTik NAT → nginx → router OKD (192.168.90.30:80) → app
Route dengan domain sendiri:
oc create route edge myapp --service=myapp \
--hostname=app.domainku.com --insecure-policy=Allow
nginx (TLS di nginx, teruskan header Host):
location / {
proxy_pass http://192.168.90.30:80;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
Tes sisi OKD: curl -sI -H "Host: app.domainku.com" http://192.168.90.30
Troubleshooting (yang benar-benar terjadi)
| Gejala | Penyebab | Solusi |
|---|---|---|
dnsmasq start-limit-hit, log: failed to create listening socket for port 53: Address already in use |
Config di /etc/dnsmasq.d/ tidak terbaca (Arch tidak mengaktifkan conf-dir), dnsmasq bind ke semua alamat dan bentrok dengan dnsmasq libvirt di virbr0 |
Tambahkan conf-dir=/etc/dnsmasq.d/,*.conf; gunakan listen-address + bind-interfaces
|
exec: "nmstatectl": executable file not found in $PATH |
Paket nmstate belum terpasang | yay -S nmstate, atau jalankan installer di container Fedora
|
exec: "oc": executable file not found in $PATH |
oc belum diekstrak/di-PATH |
Ekstrak openshift-client, pindahkan ke /usr/local/bin
|
| Node tidak bisa menjangkau DNS di laptop | Laptop (192.168.83.x, WiFi) tidak bisa dijangkau dari jaringan Proxmox (laptop masuk via WireGuard) | Pindahkan DNS ke VM bastion di vmbr3
|
Kernel panic AlmaLinux: Attempted to kill init! exitcode=0x00007f00 |
CPU type default Proxmox menyembunyikan instruksi x86-64-v2/v3 yang dibutuhkan Alma 9/10 | Ubah Processor → Type host
|
wait-for stuck lama di Waiting for cluster install to initialize. Sleeping for 30 seconds |
Bastion tidak bisa resolve api.okd.lab.local (DNS bastion ke 1.1.1.1). Cluster sebenarnya sudah jadi |
Arahkan DNS bastion ke dnsmasq-nya (192.168.90.29) atau tambah /etc/hosts. Cek dengan getent hosts api.okd.lab.local
|
| Console tidak terbuka di laptop | Nama *.apps tidak dikenal, atau subnet 192.168.90.x tidak terjangkau |
Tambah /etc/hosts, pastikan route ke 192.168.90.0/24
|
Perintah debug yang berguna:
ssh [email protected]
sudo journalctl -b -f
sudo crictl ps
tail -n 60 ~/okd/cluster/.openshift_install.log
openshift-install agent wait-for bootstrap-complete --dir cluster --log-level=debug