Jump to content

Cara install OKD

From Haidhi Wiki

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 ec di namanya).
  • Download openshift-install-linux-<tag>.tar.gz dan openshift-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-interfaces membuat 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: none dipakai karena Proxmox tidak punya integrasi native.
  • Pull secret dummy (id:pass dalam base64) cukup untuk OKD, karena image diambil dari quay.io/okd yang publik. Pull secret asli Red Hat hanya perlu untuk OpenShift atau image dari registry.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:11 adalah prefix Proxmox.
  • Nama interface eth0 hanya 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 payload tidak 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:

  1. Waiting for services → service installer naik satu per satu.
  2. Installation cannot proceed: Cluster status: insufficient → sementara, validasi host belum selesai.
  3. Cluster installation in progress.
  4. Writing image to disk 0–100%, lalu node reboot dari disk.
  5. Log crio-... libcrun container berulang → container cluster dinyalakan (normal).
  6. 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 complete tepat setelah Writing image to disk: 100% bisa muncul karena wait-for kehilangan kontak saat node reboot dari ISO ke disk. Jalankan ulang wait-for (aman, tidak mengganggu installer).
  • Install aktual memakan sekitar 1 jam (cluster Available sekitar 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: none belum punya storage dinamis; PVC akan Pending sampai dipasang NFS / local-path / LVMS. Cek dengan oc get sc.
  • Image registry (dev):
    oc patch configs.imageregistry.operator.openshift.io cluster --type merge \
      --patch '{"spec":{"managementState":"Managed","storage":{"emptyDir":{}}}}'
    
    (emptyDir: isi hilang saat pod restart, hanya untuk dev.)
  • 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

Referensi