+4

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 😄 image.png 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 : image.png

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)

image.png

Domain: npd.co | Cluster: ocp01
Tham khảo: LinuxTechi — OpenShift Bare Metal UPI


Mục lục

  1. Tổng quan kiến trúc
  2. Bảng phân bổ IP
  3. Chuẩn bị Bastion Host
  4. Cấu hình DNS (BIND)
  5. Cấu hình HAProxy
  6. Tạo install-config và Ignition
  7. Cài đặt Bootstrap
  8. Cài đặt Master và Worker
  9. Chạy openshift-install
  10. Các lỗi thường gặp và cách xử lý
  11. Checklist hoàn tất

1. Tổng quan kiến trúc

image.png

Luồng cài đặt UPI:

Bastion (DNS + HAProxy) → Bootstrap → 3 Master → 3 Worker → Cluster Ready

Kiến trúc mạng OCP lab

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):

image.png

Vai trò cụ thể:

image.png

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.co phải authoritative trong LAN — BIND trả đúng .31/.32/.40 ngay 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-install và 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 requirementsDNS requirements.


2. Bảng phân bổ IP

image.png

DNS records quan trọng:

image.png

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.3110.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ỏ daemonpidfile trong block global (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'

HAProxy listen trên VIP

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.yaml hoặc *.ign lê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 Createdbình thường — CRD chưa sẵn sàng, bootkube retry.

image.png


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. image.png image.png

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

image.png image.png image.png


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 : image.png

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

image.png image.png

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.co76.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.conf127.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=

nmcli connection name cần dấu ngoặc kép

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 644322623

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, .32 trên bastion
  • [ ] BIND trả đúng IP cho api, api-int, *.apps
  • [ ] HAProxy listen 6443, 22623, 80, 443
  • [ ] resolv.conf bastion → 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 + kernel ip=
  • [ ] curl -k https://10.100.1.40:22623/config/master OK
  • [ ] 3 Master boot với nameserver=10.100.1.30
  • [ ] openshift-install wait-for bootstrap-complete thành công
  • [ ] Xóa bootstrap khỏi HAProxy + DNS
  • [ ] 3 Worker boot + approve CSR

Sau khi cài

  • [ ] openshift-install wait-for install-complete thà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


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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí