Klaster OKD (OpenShift) na maszynach wirtualnych Proxmox – Przygotowanie DNS

Klaster OKD (OpenShift) na maszynach wirtualnych Proxmox

Spis treści

Konfiguracja sieciowa serwera Proxmox

Na testowym serwerze Proxmox zdefiniowany jest osobny interfejs typu Linux Bridge o nazwie vmbr4 dla sieci okd network o adresacji 192.168.40.0/24.

Za obsługę DNS / DHCP dla kontenerów LXC oraz maszyn wirtualnych Proxmox odpowiedzialny jest kontener LXC o nazwie dnsmasq, który ma podłączonych 9 kart sieciowych. Każda podpięta jest do innego Linux Bridge na Proxmox. W tym przypadku interfejs net3 podpięty jest do vmbr4 Proxmox czyli do sieci okd network.

W kontenerze LXC opartym o system Debian 11 zainstalowany jest dnsmasq o następującej konfiguracji. Dla sieci okd network istotny jest fragment poniżej interfaces=eth4

# Set domain names
domain=netapps.local
expand-hosts
domain-needed

# Block private addresses from being forwarded
bogus-priv

# Enable DNS forwarding
server=192.168.8.1
server=8.8.8.8
server=8.8.4.4

# Network 192.168.10.0/24
dhcp-range=192.168.10.100,192.168.10.200,48h
interface=eth1

# Network 192.168.20.0/24
dhcp-range=192.168.20.100,192.168.20.200,48h
interface=eth0

# Network 192.168.30.0/24
dhcp-range=192.168.30.100,192.168.30.200,48h
interface=eth3

# Network 192.168.40.0/24
interface=eth4
dhcp-range=192.168.40.100,192.168.40.200,48h
dhcp-option=eth4,3,192.168.40.1  # Router (default gateway)
dhcp-option=eth4,6,192.168.40.10  # DNS server
dhcp-option=eth4,15,okdlab.local   # Domain name

# static ip
dhcp-host=bc:24:11:8e:8f:08,192.168.40.30,bootstrap
dhcp-host=BC:24:11:5C:CE:E9,192.168.40.10,dns1
dhcp-host=bc:24:11:ad:f4:05,192.168.40.20,storage
dhcp-host=BC:24:11:06:95:DF,192.168.40.40,bastion
dhcp-host=bc:24:11:b6:02:03,192.168.40.51,control-plane-1
dhcp-host=bc:24:11:67:e1:67,192.168.40.52,control-plane-2
dhcp-host=bc:24:11:b1:47:91,192.168.40.53,control-plane-3
dhcp-host=bc:24:11:06:90:c7,192.168.40.61,compute-1
dhcp-host=bc:24:11:60:de:b9,192.168.40.62,compute-2

Konfiguracja maszyn wirtualnych Proxmox

Nazwa domeny: okdlab.local
Nazwa klastra: testcluster

LPNazwa DNSAdres ipvCPUvRAMvHDDSystem OperacyjnyFunkcja
1dns1.okdlab.local192.168.40.1022 GB16 GBFedora Server 41DNS dla klastra
2storage.okdlab.local192.168.40.2024 GB128 GBFedora Server 41Storage NFS dla klastra
2bootstrap.testcluster.okdlab.local192.168.40.30416 GB128 GBFedora CoreOS 39Bootstrap node
3bastion.okdlab.local192.168.40.4044 GB128 GBFedora Server 41Haproxy Load balancer / instalacja
4control-plane-1.testcluster.okdlab.local192.168.40.51416 GB128 GBFedora CoreOS 39Master node
5control-plane-2.testcluster.okdlab.local192.168.40.52416 GB128 GBFedora CoreOS 39Master node
6control-plane-3.testcluster.okdlab.local192.168.40.53416 GB128 GBFedora CoreOS 39Master node
7compute-1.testcluster.okdlab.local192.168.40.61416 GB128 GBFedora CoreOS 39Worker node
8compute-2.testcluster.okdlab.local192.168.40.62416 GB128 GBFedora CoreOS 39Worker node

Przygotowanie maszyny wirtualnej dns1

Podstawą prawidłowego działania klastra OKD (OpenShift) jest sprawnie działający serwer DNS. W tym przypadku rolę serwera DNS będzie pełniła maszyna wirtualna z systemem Fedora Server 41 oraz usługą dns w postaci demona named (bind). Obraz systemu jest do pobrania z tego linku https://fedoraproject.org/server/download. Po przegraniu obrazu na isostore Proxmoxa możemy rozpocząć instalację systemu.

Tworzymy nową maszynę wirtualną o id 4010 i nazwie dns1 z podanymi parametrami:

  • Machine : q35, Qemu Agent (włączone)
  • 16 GB HDD, SCSI VirtIO Single, Cache: Write Back
  • 2 vCPU – 2 x Sockets, Enable NUMA (włączone) , Type: Host
  • 2 GB RAM , Balloning Device (włączone)
  • Bridge: vmbr4, Model: VirtIO

Przed pierwszym uruchomieniem kopiujemy MAC address maszyny do /etc/dnsmasq.d/vnet na maszynie LXC dnsmasq

Podajemy nazwę hosta: dns1.okdlab.local

Ustawiamy hasło dla root-a.

Wybieramy w Software selection: Guest Agent

Na czas aktualizacji systemu oraz instalacji potrzebnego oprogramowania ustawiamy tymczasowy dns. W tym przypadku jest to adres głównego routera dla całej sieci czyli 192.168.8.1

# enp6s18 to nazwa interfejsu sieciowego, a 192.168.8.1 to adres działającego serwera DNS w sieci np. głównego routera
resolvectl dns enp6s18 192.168.8.1
# aktualizacja systemu
dnf update
# w razie problemów z działaniem internetu po aktualizacji ponownie wykonać resolvectl
# instalacja serwera dns named
dnf -y install bind bind-utils

Konfiguracja usługi named

Po skończonej instalacji i aktualizacji można teraz teraz ustawić odpowiednią konfigurację serwera dns named dla poprawnej obsługi zapytań forward i rewerse dla domeny okdlab.local.

options {
        listen-on port 53 { 127.0.0.1; 192.168.40.10; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { localhost; 192.168.40.0/24; };
        allow-transfer  { localhost; };
        allow-recursion { localhost; 192.168.40.0/24; };
        recursion yes;
        forwarders {
                192.168.8.1; # local router dns
                1.1.1.1; # cloudflare-dns
                8.8.8.8; # google-public-dns-a
                8.8.4.4; # google-public-dns-b
        };
        dnssec-validation auto;
        bindkeys-file "/etc/named.root.key";
        managed-keys-directory "/var/named/dynamic";
        geoip-directory "/usr/share/GeoIP";
        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
        include "/etc/crypto-policies/back-ends/bind.config";
        max-ncache-ttl 0;
};

logging {
  category notify { zone_transfer_log; };
      category xfer-in { zone_transfer_log; };
      category xfer-out { zone_transfer_log; };
      channel zone_transfer_log {
          file "/var/named/log/transfer.log" versions 10 size 50m;
          print-time yes;
          print-category yes;
          print-severity yes;
          severity info;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

zone "okdlab.local" {
    type primary;
    file "/etc/named/zones/db.okdlab.local";
    allow-update { none; };
};
zone "40.168.192.in-addr.arpa" {
    type primary;
    file "/etc/named/zones/db.192.168.40";
    allow-transfer { none; };
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

Przygotowujemy plik strefy dla domeny okdlab.local

$TTL    4h
@       IN      SOA     dns1.okdlab.local. root.okdlab.local. (
         2024111707     ; Serial
                 2H     ; Refresh
                30M     ; Retry
                 2W     ; Expire
                 1W     ; Minimum TTL
)

; name servers - NS records
     IN      NS      dns1.okdlab.local.

; name servers - A records
dns1.okdlab.local.             IN      A       192.168.40.10

; bastion, storage A records
bastion.okdlab.local.          IN      A       192.168.40.40
storage.okdlab.local.          IN      A       192.168.40.20

; OpenShift Container Platform Cluster - A records
bootstrap.testcluster.okdlab.local.        IN      A      192.168.40.30
control-plane-1.testcluster.okdlab.local.  IN      A      192.168.40.51
control-plane-2.testcluster.okdlab.local.  IN      A      192.168.40.52
control-plane-3.testcluster.okdlab.local.  IN      A      192.168.40.53
compute-1.testcluster.okdlab.local.        IN      A      192.168.40.61
compute-2.testcluster.okdlab.local.        IN      A      192.168.40.62

; OpenShift internal cluster IPs - A records
api.testcluster.okdlab.local.        IN    A    192.168.40.40
api-int.testcluster.okdlab.local.    IN    A    192.168.40.40
*.apps.testcluster.okdlab.local.     IN    A    192.168.40.40
etcd-0.testcluster.okdlab.local.     IN    A    192.168.40.51
etcd-1.testcluster.okdlab.local.     IN    A    192.168.40.52
etcd-2.testcluster.okdlab.local.     IN    A    192.168.40.53
console-openshift-console.apps.testcluster.okdlab.local.     IN     A     192.168.40.40
oauth-openshift.apps.testcluster.okdlab.local.               IN     A     192.168.40.40

; OpenShift internal cluster IPs - SRV records
_etcd-server-ssl._tcp.testcluster.okdlab.local.    86400     IN    SRV     0    10    2380    etcd-0.testcluster
_etcd-server-ssl._tcp.testcluster.okdlab.local.    86400     IN    SRV     0    10    2380    etcd-1.testcluster
_etcd-server-ssl._tcp.testcluster.okdlab.local.    86400     IN    SRV     0    10    2380    etcd-2.testcluster

Przygotowujemy plik strefy odwrotnej dla adresacji 192.168.40

$TTL    4h
@       IN      SOA     dns1.okdlab.local. root.okdlab.local. (
         2024111707     ; Serial
                 2H     ; Refresh
                30M     ; Retry
                 2W     ; Expire
                 1W     ; Minimum TTL
)

; name servers - NS records
      IN    NS     dns1.okdlab.local.
10    IN    PTR    dns1.okdlab.local.

; name servers - PTR records
40    IN    PTR    bastion.okdlab.local.
20    IN    PTR    storage.okdlab.local.

; OpenShift Container Platform Cluster - PTR records
30    IN    PTR    bootstrap.testcluster.okdlab.local.
51    IN    PTR    control-plane-1.testcluster.okdlab.local.
52    IN    PTR    control-plane-2.testcluster.okdlab.local.
53    IN    PTR    control-plane-3.testcluster.okdlab.local.
61    IN    PTR    compute-1.testcluster.okdlab.local.
62    IN    PTR    compute-2.testcluster.okdlab.local.
40    IN    PTR    api.testcluster.okdlab.local.
40    IN    PTR    api-int.testcluster.okdlab.local.

Na koniec należy ustawić odpowiednie uprawnienia i uruchomić usługę dns.

chown -R root:named /etc/named/
chmod 640 /etc/named/zones/*

mkdir /var/named/log/
chown named:named /var/named/log/
chmod 700 /var/named/log/
restorecon -RFv /var/named/log/

sudo systemctl enable named
sudo systemctl start named
sudo systemctl status named

Dodać odpowiednie zezwolenia na ruch w firewallu.

firewall-cmd --permanent --add-service=dns
firewall-cmd --reload  
firewall-cmd --list-all

Aby poprawnie działało lokalne rozwiązywanie nazw należy wyłączyć split dns usuwając usługę systemd-resolved

systemctl status systemd-resolved
systemctl stop systemd-resolved
systemctl disable systemd-resolved
# usunąć link
sudo rm /etc/resolv.conf
# utworzyć od nowa
vim /etc/resolv.conf
search okdlab.local
nameserver 127.0.0.1
# restart servera
reboot

Od tej pory to usługa NetworkManager przejmie generowanie /etc/resolv.conf. Teraz należy zdefiniować domyślny adres serwera dns 127.0.0.1 dla maszyny dns1.okdlab.local

resolvectl dns enp6s18 127.0.0.1

oraz zapisać konfigurację dns na stałe. Jeśli tego nie zrobiliśmy wcześniej to należy również ustawić tutaj statystyczny adres ip używając polecenia

nmcli connection modify enp6s18 ipv4.addresses 192.168.40.10/24 ipv4.gateway 192.168.40.1 ipv4.dns 127.0.0.1 ipv4.method manual

lub edytując bezpośrednio

[connection]
id=enp6s18
uuid=2f649e27-efa1-3f4a-82b4-4b942c271910
type=ethernet
autoconnect-priority=-999
interface-name=enp6s18
timestamp=1732016574

[ethernet]

[ipv4]
address1=192.168.40.10/24,192.168.40.1
dns=127.0.0.1;
method=manual

[ipv6]
method=ignore

[proxy]

Zmiany w konfiguracji sieciowej należy odświeżyć poleceniem

 nmcli connection reload
 systemctl restart NetworkManager

Weryfikacja działania usługi dns dla domeny okdlab.local

dig +short @localhost A dns1.okdlab.local
dig +short @localhost A bastion.okdlab.local
dig +short @localhost A api.testcluster.okdlab.local
dig +short @localhost A control-plane-1.testcluster.okdlab.local
dig +short @localhost A compute-1.testcluster.okdlab.local
dig +short @localhost -x 192.168.40.52
dig +short @localhost -x 192.168.40.62
nslookup bastion.okdlab.local
ping dns1.okdlab.local

Wykorzystanie zasobów po instalacji i konfiguracji serwera dns1

Informacje tu zawarte pozwolą w przyszłości określić dokładne zapotrzebowanie na zasoby vCPU/vRAM/vHDD maszyny wirtualnej.