Banking Demo - GITOPS : Phần 1 - Dựng OCP Cluster UPI trên VMW tại nhà
Hello
Chào mọi người, thời gian qua mình bận dự án và ôn luyện phỏng vấn vào IBM.
Đến nay thì mình cũng đã pass vị trí Automation Engineer tại IBM
Thế nên mình sẽ viết thêm 2 bài của series này, coi như relax sau 6 tháng cày cuốc gian khổ
Phần đầu tiên là về việc dựng cụm OCP tại nhà để phục vụ học tập và nghiên cứu.
Tài nguyên dành cho bộ Homelab của mình thì cũng không có gì nhiều :

Hướng dẫn cài đặt OpenShift 4 (UPI) trên VMware — Cluster ocp01.npd.co
Môi trường: VMware vSphere + RHEL 9 Bastion + FortiGate
Kiến trúc: 3 Master + 3 Worker + Bootstrap (UPI bare metal)

Domain:
npd.co| Cluster:ocp01
Tham khảo: LinuxTechi — OpenShift Bare Metal UPI
Mục lục
- Tổng quan kiến trúc
- Bảng phân bổ IP
- Chuẩn bị Bastion Host
- Cấu hình DNS (BIND)
- Cấu hình HAProxy
- Tạo install-config và Ignition
- Cài đặt Bootstrap
- Cài đặt Master và Worker
- Chạy openshift-install
- Các lỗi thường gặp và cách xử lý
- Checklist hoàn tất
1. Tổng quan kiến trúc

Luồng cài đặt UPI:
Bastion (DNS + HAProxy) → Bootstrap → 3 Master → 3 Worker → Cluster Ready

1.1. Vì sao cần từng thành phần?
Tài liệu này dùng UPI (User-Provisioned Infrastructure): platform: none trong install-config.yaml. Red Hat không tự tạo VM, load balancer hay DNS cho bạn — chỉ sinh file Ignition và theo dõi tiến trình. Mọi hạ tầng phụ trợ (DNS, LB, bootstrap) do admin dựng trước.
So với IPI trên cloud/vSphere (installer tạo VM + tích hợp LB):
| Khía cạnh | IPI | UPI (tài liệu này) |
|---|---|---|
| Tạo VM | openshift-install create cluster |
Bạn tạo thủ công trên vSphere |
| Load balancer API / Ingress | Cloud hoặc vSphere tích hợp sẵn | Phải tự dựng (HAProxy + VIP) |
| DNS | Thường do nền tảng hoặc DNS corp | Phải có zone authoritative cho ocp01.npd.co |
| Bootstrap | Installer quản lý vòng đời | Bạn boot VM, xóa sau khi xong |
→ Các thành phần dưới đây không phải tùy chọn — thiếu một mắt xích, cluster sẽ kẹt ở bootstrap, master không join được, hoặc oc login / Console không truy cập được.
Bootstrap — “control plane tạm” trong lúc cài
Bootstrap (10.100.1.40) là một node RHCOS tạm thời, chỉ sống trong giai đoạn cài đặt (~30–45 phút):

Vai trò cụ thể:

Vì sao xóa sau khi Ready? Khi openshift-install wait-for bootstrap-complete thành công, 3 master đã tự vận hành API + etcd. Bootstrap không còn vai trò; để lại sẽ lãng phí tài nguyên và HAProxy có thể route nhầm tới node chết. Cần gỡ bootstrap khỏi HAProxy + DNS rồi mới tắt/xóa VM.
Vì sao boot bootstrap trước master? Master cần gọi https://api.ocp01.npd.co:6443 và tải config từ MCS :22623 — hai dịch vụ đó do bootstrap cung cấp ở giai đoạn đầu. Master boot trước bootstrap → MCS không có → master kẹt ở trạng thái chờ (xem mục 10).
DNS (BIND) — OpenShift “kiểm tra tên trước khi tin máy”
Installer và mọi node OCP phụ thuộc DNS ngay từ phút đầu. Nếu api.ocp01.npd.co resolve sai (ví dụ ra IP public Internet vì dùng DNS FortiGate/ISP), toàn bộ luồng cài hỏng.
Vì sao BIND chạy trên bastion, bastion dùng 127.0.0.1?
- Zone
ocp01.npd.cophải authoritative trong LAN — BIND trả đúng.31/.32/.40ngay lập tức. - Nếu bastion forward DNS qua FortiGate/8.8.8.8 cho tên
api.ocp01.npd.co, có thể nhận NXDOMAIN hoặc IP ngoài →openshift-installvà node resolve sai. - DHCP/GRUB
nameserver=10.100.1.30đảm bảo master/worker/bootstrap cùng dùng BIND nội bộ.
HAProxy + VIP — thay load balancer mà cloud/IPI cung cấp sẵn
Trên AWS/GCP hoặc IPI, có sẵn NLB/integrated LB trỏ tới control plane. UPI trên VMware không có — bạn gán VIP (IP ảo trên interface bastion) và HAProxy listen + forward:
Client / Node HAProxy (bastion) Backend thật
─────────────────────────────────────────────────────────────────────────────
api.ocp01.npd.co:6443 → bind 10.100.1.31:6443 → bootstrap → masters
api-int...:22623 (MCS) → bind 10.100.1.31:22623 → bootstrap → masters
*.apps...:80 / :443 → bind 10.100.1.32:80/443 → workers (± masters)
| Frontend (VIP) | Backend | Vì sao cần LB? |
|---|---|---|
.31:6443 |
bootstrap → 3 master | Một URL API duy nhất; khi bootstrap chết, HAProxy chỉ còn master — không đổi DNS |
.31:22623 |
bootstrap → 3 master | MCS phải reachable qua api-int; sau bootstrap, master tiếp quản MCS |
.32:80, .32:443 |
worker (và master nếu ingress chạy ở đó) | Nhiều ingress controller — cần phân tải; DNS wildcard *.apps chỉ trỏ một IP |
Vì sao gán VIP .31/.32 lên interface bastion? DNS trả về các IP đó. Kernel chỉ nhận gói tin nếu máy sở hữu đích IP trên interface. HAProxy bind 10.100.1.31:6443 — không có IP .31 trên ens33 → Permission denied hoặc không nhận traffic (xem mục 10.4).
Vì sao backend DOWN lúc đầu là bình thường? HAProxy health-check tới master/worker trước khi các VM OCP boot — chỉ cần UP khi đúng thứ tự cài (bootstrap → master → worker).
Bastion — điểm tập trung, không phải “chỉ để SSH”
| Vai trò | Lý do gom trên một máy (lab) |
|---|---|
Chạy openshift-install |
Cần mạng tới VIP, DNS đúng, và thường có internet (pull image) |
| BIND + HAProxy + VIP | Cùng subnet 10.100.1.0/24 với cluster; giảm độ trễ, dễ troubleshoot |
| (Tuỳ chọn) Apache/httpd | Phục vụ file .ign + RHCOS image nội bộ nếu không dùng floppy |
Production lớn có thể tách DNS corp, F5/HAProxy riêng — vai trò logic giữ nguyên; tài liệu này gộp trên bastion cho lab VMware.
Tóm tắt phụ thuộc — cài sai thứ tự = lỗi khó debug
1. Bastion: VIP (.31, .32) + BIND zone đầy đủ + HAProxy cfg (backend có bootstrap)
2. openshift-install create ignition-configs
3. Boot Bootstrap (bootstrap.ign + kernel ip= + nameserver=.30)
4. Boot cả 3 Master (master.ign) — song song được
5. wait-for bootstrap-complete → gỡ bootstrap khỏi HAProxy/DNS
6. Boot Worker → approve CSR → wait-for install-complete
| Thiếu / sai | Hậu quả thường gặp |
|---|---|
DNS api → IP ngoài |
connection refused, certificate mismatch |
Không có MCS :22623 trên VIP |
Master Unable to connect to MCS |
| Master boot trước bootstrap | Master Pending, MCS timeout |
| Quên gỡ bootstrap sau complete | API đôi khi route tới node đã tắt |
*.apps không wildcard |
Console / Route không resolve |
Tham khảo chính thức: Installing a cluster on any platform (UPI) — mục User-provisioned infrastructure load balancing requirements và DNS requirements.
2. Bảng phân bổ IP

DNS records quan trọng:
3. Chuẩn bị Bastion Host
3.1. Gán VIP trên interface ens33
sudo nmcli connection modify "ens33" +ipv4.addresses "10.100.1.31/24"
sudo nmcli connection modify "ens33" +ipv4.addresses "10.100.1.32/24"
sudo nmcli connection down "ens33" && sudo nmcli connection up "ens33"
ip addr show ens33
3.2. Sửa DNS resolver trên bastion (QUAN TRỌNG)
Bastion phải dùng BIND local, không dùng DNS ISP/FortiGate — nếu không api.ocp01.npd.co resolve ra IP public Internet.
sudo nmcli con mod "ens33" \
ipv4.dns "127.0.0.1" \
ipv4.dns-search "ocp01.npd.co" \
ipv4.ignore-auto-dns yes
sudo nmcli con down "ens33" && sudo nmcli con up "ens33"
cat /etc/resolv.conf
Kết quả:
search ocp01.npd.co
nameserver 127.0.0.1
3.3. Cài gói cần thiết
sudo dnf install -y bind bind-utils haproxy
4. Cấu hình DNS (BIND)
4.1. Zone forward — db.ocp01.npd.co
$TTL 604800
@ IN SOA ns1.ocp01.npd.co. contact.ocp01.npd.co. (
2025062701 604800 86400 2419200 604800 )
@ IN NS ns1.ocp01.npd.co.
ns1.ocp01.npd.co. IN A 10.100.1.30
npd-bastion-hosts.ocp01.npd.co. IN A 10.100.1.30
npd-bootstrap-server.ocp01.npd.co. IN A 10.100.1.40
bootstrap.ocp01.npd.co. IN A 10.100.1.40
npd-ocp-master01.ocp01.npd.co. IN A 10.100.1.41
npd-ocp-master02.ocp01.npd.co. IN A 10.100.1.42
npd-ocp-master03.ocp01.npd.co. IN A 10.100.1.43
npd-ocp-worker01.ocp01.npd.co. IN A 10.100.1.51
npd-ocp-worker02.ocp01.npd.co. IN A 10.100.1.52
npd-ocp-worker03.ocp01.npd.co. IN A 10.100.1.53
api.ocp01.npd.co. IN A 10.100.1.31
api-int.ocp01.npd.co. IN A 10.100.1.31
etcd-0.ocp01.npd.co. IN A 10.100.1.41
etcd-1.ocp01.npd.co. IN A 10.100.1.42
etcd-2.ocp01.npd.co. IN A 10.100.1.43
_etcd-server-ssl._tcp.ocp01.npd.co. IN SRV 0 10 2380 etcd-0.ocp01.npd.co.
_etcd-server-ssl._tcp.ocp01.npd.co. IN SRV 0 10 2380 etcd-1.ocp01.npd.co.
_etcd-server-ssl._tcp.ocp01.npd.co. IN SRV 0 10 2380 etcd-2.ocp01.npd.co.
4.2. Zone apps — db.apps.ocp01.npd.co
$TTL 604800
@ IN SOA ns1.ocp01.npd.co. contact.ocp01.npd.co. (
2025062701 604800 86400 2419200 604800 )
@ IN NS ns1.ocp01.npd.co.
* IN A 10.100.1.32
4.3. File ocp-zones.conf
zone "ocp01.npd.co" IN {
type master;
file "/etc/named/zone/db.ocp01.npd.co";
allow-query { any; };
notify no;
};
zone "apps.ocp01.npd.co" IN {
type master;
file "/etc/named/zone/db.apps.ocp01.npd.co";
allow-query { any; };
notify no;
};
zone "1.100.10.in-addr.arpa" IN {
type master;
file "/etc/named/zone/db.reverse.10.100.1";
allow-query { any; };
notify no;
};
Thêm vào cuối /etc/named.conf:
include "/etc/named/ocp-zones.conf";
4.4. Kiểm tra DNS
sudo named-checkconf
sudo named-checkzone ocp01.npd.co /etc/named/zone/db.ocp01.npd.co
sudo systemctl enable --now named
dig +short api.ocp01.npd.co @127.0.0.1
dig +short console-openshift-console.apps.ocp01.npd.co @127.0.0.1
Kết quả ra là 10.100.1.31 và 10.100.1.32. Flag aa khi dig +norecurse.
Lỗi thường gặp: dig @10.100.1.30 trả IP public (76.223.x.x) → zone chưa load (sai path zone/ vs zones/) hoặc thiếu include ocp-zones.conf.
5. Cấu hình HAProxy
5.1. File /etc/haproxy/haproxy.cfg
Lưu ý RHEL 9: Bỏ
daemonvàpidfiletrong blockglobal(systemd quản lý).
# HAProxy config cho OCP - API + Ingress LB
# Copy vào /etc/haproxy/haproxy.cfg trên npd-bastion-hosts
# API VIP: 10.100.1.31 | Ingress VIP: 10.100.1.32
global
log /dev/log local0
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode tcp
log global
option tcplog
retries 3
timeout connect 10s
timeout client 1m
timeout server 1m
# API - bind trên API VIP 10.100.1.31
listen api
bind 10.100.1.31:6443
mode tcp
balance roundrobin
option tcp-check
default-server inter 10s downinter 5s rise 2 fall 2
#server bootstrap 10.100.1.40:6443 check
server master01 10.100.1.41:6443 check
server master02 10.100.1.42:6443 check
server master03 10.100.1.43:6443 check
# Machine Config Server (UPI bắt buộc)
listen machine-config-server
bind 10.100.1.31:22623
mode tcp
balance source
default-server inter 10s downinter 5s rise 2 fall 2
server bootstrap 10.100.1.40:22623 check
server master01 10.100.1.41:22623 check
server master02 10.100.1.42:22623 check
server master03 10.100.1.43:22623 check
# Ingress HTTP - bind trên Ingress VIP 10.100.1.32
# Backend: node chạy router-default (HostNetwork)
# Kiểm tra sau cài: oc get pods -n openshift-ingress -o wide
listen ingress-80
bind 10.100.1.32:80
mode tcp
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2
server master01 10.100.1.41:80 check
server master02 10.100.1.42:80 check
server master03 10.100.1.43:80 check
server worker01 10.100.1.51:80 check
server worker02 10.100.1.52:80 check
server worker03 10.100.1.53:80 check
listen ingress-443
bind 10.100.1.32:443
mode tcp
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2
server master01 10.100.1.41:443 check
server master02 10.100.1.42:443 check
server master03 10.100.1.43:443 check
server worker01 10.100.1.51:443 check
server worker02 10.100.1.52:443 check
server worker03 10.100.1.53:443 check
5.2. SELinux trên RHEL 9
sudo setsebool -P haproxy_connect_any 1
sudo semanage port -a -t http_port_t -p tcp 6443
sudo semanage port -a -t http_port_t -p tcp 22623
sudo systemctl enable --now haproxy
ss -lntp | grep -E '6443|22623|:80|:443'

Backend DOWN lúc đầu là bình thường — các node OCP chưa chạy.
6. Tạo install-config và Ignition
6.1. install-config.yaml
apiVersion: v1
baseDomain: npd.co
metadata:
name: ocp01
platform:
none: {}
pullSecret: '<pull-secret-của-bạn>'
sshKey: 'ssh-ed25519 AAAA... devops@npd-bastion-hosts'
controlPlane:
name: master
hyperthreading: Enabled
replicas: 3
compute:
- name: worker
hyperthreading: Enabled
replicas: 0 # UPI: worker boot thủ công bằng worker.ign
networking:
networkType: OVNKubernetes
clusterNetwork:
- cidr: 10.128.0.0/14
hostPrefix: 23
serviceNetwork:
- 172.30.0.0/16
machineNetwork:
- cidr: 10.100.1.0/24
fips: false
6.2. Sinh Ignition
mkdir -p ~/ocp-install && cd ~/ocp-install
# đặt install-config.yaml vào đây
openshift-install create manifests
openshift-install create ignition-configs
Sinh ra: bootstrap.ign, master.ign, worker.ign, metadata.json.
Bảo mật: Không commit
install-config.yamlhoặc*.ignlên git public.
7. Cài đặt Bootstrap
7.1. Tắt DHCP FortiGate (nếu đang bật)
Nếu FortiGate DHCP pool 10.100.1.100–200 đang bật, VM boot sẽ nhận IP động (ví dụ .110) cộng với IP tĩnh → 2 IP trên cùng interface.
Giải pháp: Tắt DHCP trên FortiGate cho segment OCP.
7.2. Gắn bootstrap.ign vào VM
Đến đây thì gõ tay các cli sau :
#bootstrap
sudo nmcli connection modify Wired\ connection\ 1 ipv4.address 10.100.1.40/24 ipv4.gateway 10.100.1.10 ipv4.dns 10.100.1.30 ipv4.method manual type ethernet ifname ens33
sudo systemctl restart NetworkManager
sudo coreos-installer install --copy-network --ignition-url http://10.100.1.30:8080/ocp4/bootstrap.ign --insecure-ignition /dev/sda
sudo reboot
7.3. Theo dõi bootstrap
# Trên bootstrap
journalctl -b -f -u bootkube.service
# Trên bastion
ping -c2 10.100.1.40
curl -k https://10.100.1.40:22623/config/master
curl -k https://api-int.ocp01.npd.co:22623/config/master
Log bootkube fail vài lần machineconfigs... could not find the requested resource rồi Created là bình thường — CRD chưa sẵn sàng, bootkube retry.

8. Cài đặt Master và Worker
8.1. Thứ tự boot (QUAN TRỌNG)
1. Bootstrap chạy + MCS :22623 sẵn sàng
2. Boot 3 Master (sau khi curl MCS OK)
3. Sau bootstrap-complete → boot 3 Worker
8.2. Setup cho cả 3 master :
sudo nmcli connection modify Wired\ connection\ 1 ipv4.address 10.100.1.41/24 ipv4.gateway 10.100.1.10 ipv4.dns 10.100.1.30 ipv4.method manual type ethernet ifname ens33
sudo systemctl restart NetworkManager
sudo coreos-installer install --copy-network --ignition-url http://10.100.1.30:8080/ocp4/master.ign --insecure-ignition /dev/sda
sudo reboot
sudo nmcli connection modify Wired\ connection\ 1 ipv4.address 10.100.1.42/24 ipv4.gateway 10.100.1.10 ipv4.dns 10.100.1.30 ipv4.method manual type ethernet ifname ens33
sudo systemctl restart NetworkManager
sudo coreos-installer install --copy-network --ignition-url http://10.100.1.30:8080/ocp4/master.ign --insecure-ignition /dev/sda
sudo reboot
sudo nmcli connection modify Wired\ connection\ 1 ipv4.address 10.100.1.43/24 ipv4.gateway 10.100.1.10 ipv4.dns 10.100.1.30 ipv4.method manual type ethernet ifname ens33
sudo systemctl restart NetworkManager
sudo coreos-installer install --copy-network --ignition-url http://10.100.1.30:8080/ocp4/master.ign --insecure-ignition /dev/sda
sudo reboot
Và ngồi đợi thôi.

8.4. Worker
Sau openshift-install wait-for bootstrap-complete:
Boot với worker.ign:
sudo nmcli connection modify Wired\ connection\ 1 ipv4.address 10.100.1.51/24 ipv4.gateway 10.100.1.10 ipv4.dns 10.100.1.30 ipv4.method manual type ethernet ifname ens33
sudo systemctl restart NetworkManager
sudo coreos-installer install --copy-network --ignition-url http://10.100.1.30:8080/ocp4/worker.ign --insecure-ignition /dev/sda
sudo reboot
sudo nmcli connection modify Wired\ connection\ 1 ipv4.address 10.100.1.52/24 ipv4.gateway 10.100.1.10 ipv4.dns 10.100.1.30 ipv4.method manual type ethernet ifname ens33
sudo systemctl restart NetworkManager
sudo coreos-installer install --copy-network --ignition-url http://10.100.1.30:8080/ocp4/worker.ign --insecure-ignition /dev/sda
sudo reboot
sudo nmcli connection modify Wired\ connection\ 1 ipv4.address 10.100.1.53/24 ipv4.gateway 10.100.1.10 ipv4.dns 10.100.1.30 ipv4.method manual type ethernet ifname ens33
sudo systemctl restart NetworkManager
sudo coreos-installer install --copy-network --ignition-url http://10.100.1.30:8080/ocp4/worker.ign --insecure-ignition /dev/sda
sudo reboot

9. Chạy openshift-install
Trên bastion (~/ocp-install):
# Theo dõi bootstrap (chạy song song khi master đã boot)
openshift-install wait-for bootstrap-complete --log-level=info
# Sau bootstrap-complete: xóa bootstrap khỏi HAProxy + DNS
# Sửa haproxy.cfg: bỏ dòng server bootstrap
# Xóa record bootstrap.ocp01.npd.co trong DNS
sudo systemctl reload haproxy
# Xem có csr nào chưa được approve thì mình approve
[root@npd-bastion-hosts ocp-install]# oc get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-4kwf8 40m kubernetes.io/kube-apiserver-client system:node:etcd-0.ocp01.npd.co 24h Approved,Issued
csr-57jvt 63s kubernetes.io/kubelet-serving system:node:npd-ocp-worker03.ocp01.npd.co <none> Pending
csr-67ls2 3m52s kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper <none> Approved,Issued
csr-7l6gg 46m kubernetes.io/kubelet-serving system:node:etcd-0.ocp01.npd.co <none> Approved,Issued
csr-8mscz 83s kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper <none> Approved,Issued
csr-drj9w 41m kubernetes.io/kube-apiserver-client system:node:etcd-0.ocp01.npd.co 24h Approved,Issued
csr-dt4jk 46m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper <none> Approved,Issued
csr-gmt5m 42m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper <none> Approved,Issued
csr-hkk5w 46m kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper <none> Approved,Issued
csr-jffpg 40m kubernetes.io/kube-apiserver-client system:node:etcd-2.ocp01.npd.co 24h Approved,Issued
csr-jtq4f 45m kubernetes.io/kubelet-serving system:node:etcd-1.ocp01.npd.co <none> Approved,Issued
csr-mgg6b 40m kubernetes.io/kube-apiserver-client system:node:etcd-1.ocp01.npd.co 24h Approved,Issued
csr-mt556 41m kubernetes.io/kube-apiserver-client system:node:etcd-2.ocp01.npd.co 24h Approved,Issued
csr-nps5x 42m kubernetes.io/kubelet-serving system:node:etcd-2.ocp01.npd.co <none> Approved,Issued
csr-qrkd9 12s kubernetes.io/kube-apiserver-client-kubelet system:serviceaccount:openshift-machine-config-operator:node-bootstrapper <none> Pending
csr-th925 64s kubernetes.io/kubelet-serving system:node:npd-ocp-worker02.ocp01.npd.co <none> Pending
csr-vgs2x 41m kubernetes.io/kube-apiserver-client system:node:etcd-1.ocp01.npd.co 24h Approved,Issued
system:openshift:openshift-authenticator-ckb6d 39m kubernetes.io/kube-apiserver-client system:serviceaccount:openshift-authentication-operator:authentication-operator <none> Approved,Issued
system:openshift:openshift-monitoring-6z2kw 38m kubernetes.io/kube-apiserver-client system:serviceaccount:openshift-monitoring:cluster-monitoring-operator <none> Approved,Issued
system:openshift:openshift-monitoring-fnrt7 38m kubernetes.io/kube-apiserver-client system:serviceaccount:openshift-monitoring:cluster-monitoring-operator <none> Approved,Issued
system:openshift:openshift-monitoring-xxqd8 38m kubernetes.io/kube-apiserver-client system:serviceaccount:openshift-monitoring:cluster-monitoring-operator <none> Approved,Issued
[root@npd-bastion-hosts ocp-install]# oc get csr -o go-template='{{range .items}}{{if not .status}}{{.metadata.name}}{{"\n"}}
{{end}}{{end}}' | xargs oc adm certificate approve
certificatesigningrequest.certificates.k8s.io/csr-57jvt approved
certificatesigningrequest.certificates.k8s.io/csr-qrkd9 approved
certificatesigningrequest.certificates.k8s.io/csr-th925 approved
# Chờ cluster hoàn tất
openshift-install wait-for install-complete --log-level=info
Như thế này là đẹp rồi này :

Lấy mật khẩu admin:
oc extract secret/kubeadmin -n kube-system --to=.
cat kubeadmin-password
Console: https://console-openshift-console.apps.ocp01.npd.co
Nhớ add host trong laptop nhé:
# OCP - TAT CA *.apps phai tro ve Ingress VIP 10.100.1.32
10.100.1.32 console-openshift-console.apps.ocp01.npd.co
10.100.1.32 oauth-openshift.apps.ocp01.npd.co
10.100.1.32 downloads-openshift-console.apps.ocp01.npd.co
# API (oc login) - VIP API 10.100.1.31
10.100.1.31 api.ocp01.npd.co

HEHE 
10. Các lỗi thường gặp và cách xử lý
10.1. DNS trả IP public thay vì VIP local
| Triệu chứng | dig api.ocp01.npd.co → 76.223.x.x |
|---|---|
| Nguyên nhân | BIND zone chưa load / resolv.conf dùng DNS ngoài |
| Xử lý | Kiểm tra path zone file, include ocp-zones.conf, sửa resolv.conf → 127.0.0.1 |
10.2. Bootstrap có 2 IP
| Triệu chứng | 10.100.1.110 (dynamic) + 10.100.1.40 (secondary) |
|---|---|
| Nguyên nhân | FortiGate DHCP + set IP thủ công |
| Xử lý | Tắt DHCP FortiGate; dùng kernel ip= |

10.3. nmcli mất IP sau reboot
| Triệu chứng | ens33 không có IPv4 sau reboot |
|---|---|
| Nguyên nhân | RHCOS live ISO — cấu hình không persist |
| Xử lý | Kernel ip=... nameserver=10.100.1.30 trong GRUB |
10.4. HAProxy Permission denied bind VIP
| Triệu chứng | cannot bind socket (Permission denied) for [10.100.1.31:6443] |
|---|---|
| Nguyên nhân | SELinux chặn port 6443, 22623 |
| Xử lý | semanage port -a -t http_port_t -p tcp 6443 và 22623 |
10.5. curl MCS → SSL_ERROR_ZERO_RETURN
| Triệu chứng | Connect 10.100.1.31:22623 nhưng TLS fail |
|---|---|
| Nguyên nhân | Bootstrap MCS chưa listen / backend DOWN |
| Xử lý | Chờ bootkube; test trực tiếp curl -k https://10.100.1.40:22623/config/master |
10.6. Bootkube MachineConfig "could not find the requested resource"
| Triệu chứng | Fail tạo 99-master-ssh MachineConfig |
|---|---|
| Nguyên nhân | CRD chưa đăng ký — race condition khi bootstrap |
| Xử lý | Chờ — nếu thấy Created sau đó là OK |
11. Checklist hoàn tất
Trước khi cài
- [ ] VM đã tạo: bastion, bootstrap, 3 master, 3 worker
- [ ] VIP
.31,.32trên bastion - [ ] BIND trả đúng IP cho
api,api-int,*.apps - [ ] HAProxy listen 6443, 22623, 80, 443
- [ ]
resolv.confbastion →127.0.0.1 - [ ] FortiGate DHCP tắt (segment OCP)
- [ ]
install-config.yaml+ ignition configs đã tạo
Trong khi cài
- [ ] Bootstrap boot với
bootstrap.ign+ kernelip= - [ ]
curl -k https://10.100.1.40:22623/config/masterOK - [ ] 3 Master boot với
nameserver=10.100.1.30 - [ ]
openshift-install wait-for bootstrap-completethành công - [ ] Xóa bootstrap khỏi HAProxy + DNS
- [ ] 3 Worker boot + approve CSR
Sau khi cài
- [ ]
openshift-install wait-for install-completethành công - [ ] Console truy cập được:
console-openshift-console.apps.ocp01.npd.co - [ ]
oc get nodes— 3 master + 3 worker Ready - [ ] Xóa VM bootstrap
Tài liệu tham khảo
- OpenShift — Installing on any platform (UPI)
- LinuxTechi — OpenShift Bare Metal UPI
- RHCOS — Network configuration (ip= kernel arg)
Phần 2, sẽ là phần mình hoàn thiện GITOPS hoàn chỉnh trên cụm OCP này.
All rights reserved
