Introduzione
Lo scopo di questo blog (suddiviso in due parti) è di elencare gli step necessari alla creazione di un laboratorio per poter installare (anche) un cluster Openshift (da qui in poi ‘OCP’) 4.3.8 usabile. Non ho usato il termine ‘usabile’ a sproposito: OCP richiede un set di risorse minimo piuttosto elevato per un laboratorio home-made: 5 nodi (3 master e 2 worker) più un nodo di ‘bootstrap’ per l’installazione. Per ogni nodo sono richiesti 4 vCPU, 16 Gib di Ram e 120Gib di disco. Inoltre abbiamo bisogno anche di 1 Load balancer e di un nodo ‘bastion’ in cui installeremo i servizi necessari per l’installazione del cluster OCP. Il nodo di ‘bootstrap’ potrà essere spento quando i tre nodi Master saranno attivi. Inoltre dovremmo poter installare diverse tecnologie in Openshift per poter fare pratica come per esempio ‘Service Mesh’: le risorse servono.
Perchè parlare di installazione UPI quando il 23 Marzo è stato annunciato l’installer automatico IPI (Installer Provisioned Infrastructure) per piattaforma RHV (di cui oVirt è l’upstream project)? Semplicemente perchè conoscendo tutti i passaggi possiamo personalizzare la nostra infrastruttura . Inoltre per utilizzare l’installer automatico IPI dobbiamo comunque creare un server dhcp e dns con le configurazioni corrette (trattate nella seconda parte di questo blog). Il valore aggiunto dell’installer automatico IPI è la creazione della risorsa machineset che permette di scalare i nodi del cluster.
Qui il link con i requisiti per l’installazione di OCP 4.3 UPI
Verrà inoltre configurata una vpn per poter accedere al cluster OCP dall’esterno.
La configurazione dei servizi necessari verrà effettuata con dei playbook RedHat Ansible creati ad-hoc per questo laboratorio. Nella seconda parte di questo blog verrà analizzato il processo di installazione di OCP.
I playbook creati sono disponibili a questo indirizzo:
https://git.extraordy.com/cloudnative/openshift-ansible-ovirt.git
Permettetemi subito di ringraziare gli amici e colleghi Alessandro Rossi e Gianluca Cecchi per l’aiuto nella revisione del blog e dei playbooks Ansible.
Agenda
Ecco l’agenda di questa prima parte:
- Descrizione del laboratorio
- Scelta, aquisizione e configurazione server
- Installazione e configurazione oVirt
Si, partiamo da zero. Si può perdere molto tempo (e io l’ho perso) cercando il miglior rapporto qualità/prezzo per il server; ecco perchè preferisco condividere le mie scelte cercando di inserire tutti i dettagli.
Descrizione del laboratorio
Il cluster OCP (in verde) è composto da tre nodi Master e tre nodi Worker (il minimo numero richiesto è due). Qui alcuni dettagli:
Tutti i nodi OCP sono collegati ad una network di Ovirt separata chiamata “openshift_net” e utilizzano il nodo ‘bastion’ come default gateway, DHCP server, TFTP server, WEB server, PXE boot server, VPN server e NFS server (per fornire i persistent volume al cluster).
il nodo ‘bastion’ è collegato tramite interfaccia ETH0 alla Network di default di Ovirt chiamata ‘ovirtmgmt’ collegata alla rete 192.168.1.0/24 che fornisce accesso a internet. Il server VPN utilizzerà questa interfaccia.
il nodo ‘bastion’ è anche collegato alla network di Ovirt ‘openshift_net’ tramite interfaccia di rete ETH1. I servizi DHCP, TFTP, WEB, PXE e NFS utilizzano l’interfaccia ETH1 (quindi visibili solo ai nodi collegati alla network ‘openshift_network’).
Per quanto riguarda i Load Balancer richiesti si è preferito installarli nella stessa macchina virtuale ‘Load balancer’. Avremmo potuto creare una macchina virtuale per loadbalancer o, per risparmiare delle risorse, installare i Load Balancer direttamente sulla macchina virtuale ‘bastion’ con alcune piccole modifiche.
Nel laboratorio proposto la macchina virtuale ‘Load Balancer’ ha anch’essa due interfacce di rete: ETH0 e ETH1 e il Load Balancer è in ascolto su entrambe. In questo modo potremmo utilizzare il cluster OCP anche dalla nostra workstation (collegata solo alla rete interna 192.168.1.0/24)
E’ presente un dns di servizio 192.168.1.77/24 per redirigere le richieste alle rotte applicative con wild card domain e le richieste all’api server di OCP al Load Balancer. Più avanti verrà discusso nel dettaglio questo passaggio.
La scelta del dns di servizio è stata dettata dal fatto che in questo modo possiamo collegare alla rete 192.168.1.0/24 diversi computer per poter utilizzare il nostro cluster OCP, con l’unico requisito di aggiungere 192.168.1.77 come dns server.
Scelta e aquisizione server
Il primo passo è stato quello di verificare le richieste minime dell’ host di oVirt (il virtualizzatore):
La scelta del server è caduta su un un Dell PowerEdge r710 ricondizionato: buon rapporto qualità/prezzo e compatibile alle richieste di CPU per oVirt.
Qui le specifiche del processore che confermano la possibilità di installare oVirt:
A fine installazione di oVirt dovremo verificare l’attivazione del flag nx (No Execute) sulla macchina ‘host’ di oVirt (il nostro server)
grep -E 'svm|vmx' /proc/cpuinfo | grep nx
Se non vediamo nessun output controlliamo se il flag è stato disabilitato dal bios.
Il reparto dischi è composto da due dischi SAS da 2TB ciascuno, configurati in raid 1. La Ram è stata estesa da 128 a 192Gb.
Questo è il link utilizzato per l’acquisto:
https://www.amazon.it/gp/product/B0813VCH24/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1
Per installare la ram correttamente bisogna rispettare le specifiche fornite da Dell:
Ogni CPU supporta 3 Channels da 3 banchi ciascuno e devono essere bilanciati. Il banco di memoria inserito in A1 deve essere uguale al banco di memoria inserito in A2, quello in A4 deve essere uguale a quello in A5. Stesso procedimento si applica per i Channels della CPU2: B1=B2, B4 =B5 etc..
Prima dell’estensione il server aveva Ram DDR3 ECC 1600 Mhx 2Rx4 PC3-12800R 16Gb collocate correttamente in posizione A1,A4,A2,A5 e B1,B2,B4,B5.
I 4 banchi da 16Gb usati per l’estensione (con stesse caratteristiche) sono stati installati in A3,A6 e B3,B6. In questo modo i 128Gb + 64 Gb vengono viste correttamente dal bios.
Se durante il primo avvio si ricevono degli errori come quello in foto e il posizionamento della ram è corretto, c’è la possibilità (come è accaduto a me) che un banco di Ram sia difettoso (difetto verificato e Ram sostituita in 2 gg dal venditore). La foto è chiaramente scattata da cellulare….
Una volta verificata l’assenza di errori, possiamo iniziare l’installazione di oVirt.
Installazione e configurazione oVirt
Installare oVirt è stato molto semplice. Consiglio altamente a chi non conosce oVirt di leggere la guida ufficiale per diventare confidente con la terminologia.
oVirt è stato installato usando la iso ‘oVirt Node’ che fornisce ‘a minimal hypervisor operating system based on CentOS’ come riportato nella guida ufficiale.
La modalità scelta è quella obbligatoria se si ha solo un server: la self-hosted Engine che può essere rappresentata con questo semplice schema:
Qui i dettagli:
Le operazioni da effettuare sono ben descritte nella guida ufficiale:
Questi sono le procedure/scelte che ho effettuato per avere l’ambiente funzionante:
Scegliere un indirizzo ip e hostname da assegnare all’host di oVirt e al alla VM Manager.
L’Host e la Engine VM devono essere raggiungibili dalla rete 192.168.1.0/24 (e quindi anche dalla workstation).
Ecco le configurazioni scelte che dovranno essere inserite nel server DNS 192.168.1.77:
192.168.1.25 host.mylab.com
192.168.1.26 manager.mylab.com
Nel dettaglio è stato usato il servizio DNSMASQ sul server dns 192.168.1.77 e questa è la parte di configurazione presente in /etc/dnsmasq.conf che ci interessa per ora:
#### oVirt ####
address=/host.mylab.com/192.168.1.25
address=/manager.mylab.com/192.168.1.26
Per testare la corretta risoluzione di host.mylab.com e manager.mylab.com dalla nostra workstation possiamo utilizzare dig:
vale@vale-laptop:~$ dig host.mylab.com @192.168.1.77
--- Output omitted ---
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42722
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; ANSWER SECTION:
host.mylab.com. 0 IN A 192.168.1.25
;; Query time: 0 msec
;; SERVER: 192.168.1.77#53(192.168.1.77)
;; WHEN: Sat Mar 14 11:23:14 CET 2020
;; MSG SIZE rcvd: 59
vale@vale-laptop:~$ dig manager.mylab.com @192.168.1.77
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42865
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;manager.mylab.com. IN A
;; ANSWER SECTION:
manager.mylab.com. 0 IN A 192.168.1.26
;; Query time: 0 msec
;; SERVER: 192.168.1.77#53(192.168.1.77)
;; WHEN: Sat Mar 14 11:25:42 CET 2020
;; MSG SIZE rcvd: 62
Dobbiamo ora aggiungere il server DNS 192.168.1.77 alla nostra workstation.
Per questa semplice operazione possiamo utilizzare il tool nmcli:
nmcli con mod <connection_name> +ipv4.dns 192.168.1.77
nmcli con reload <connection_name>
Procediamo ora con scaricare la iso di oVirt Node e creiamo una usb di boot (ricordo che possiamo usare il comando ‘dd’ per creare bootable usb da un file iso).
https://www.ovirt.org/download/node.html#ovirt-node-43—stable-release
Accendiamo il server e installiamo l’oVirt node. L’installazione procede esattamente come una comune Centos 7.7. Poniamo attenzione a configurare correttamente l’hostname (host.mylab.com),
il default gateway (192.168.1.1) , ip (192.168.1.25/24) e dns (192.168.1.77). Ricordiamoci anche la password di root scelta.
Completata l’installazione potremmo collegarci in ssh con utenza di root dalla nostra workstation.
Nel mio caso la workstation è il mio laptop:
vale@vale-laptop:~$ ssh root@host.mylab.com
Accettiamo la chiave e inseriamo la password di root: saremo finalmente loggati sull’host di oVirt.
(E’ consigliato usare ssh-copy-id per non inserire la password ad ogni connessione)
Effettuiamo dei test di connettività verso l’esterno e dei test sul record A e PTR del server DNS
Admin Console: https://192.168.1.25:9090/
[root@host ~]# dig google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58800
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 230 IN A 216.58.206.78
;; Query time: 5 msec
;; SERVER: 192.168.1.77#53(192.168.1.77)
;; WHEN: sab mar 14 00:48:10 CET 2020
;; MSG SIZE rcvd: 55
[root@host ~]# dig -x 216.58.206.78
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -x 216.58.206.78
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 11974
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;78.206.58.216.in-addr.arpa. IN PTR
;; Query time: 1 msec
;; SERVER: 192.168.1.77#53(192.168.1.77)
;; WHEN: sab mar 14 00:48:26 CET 2020
;; MSG SIZE rcvd: 55
[root@host ~]#
Notiamo che per entrambe le interrogazioni il server DNS utilizzato è 192.168.1.77
Prima di installare e configurare oVirt dobbiamo preparare lo storage.
Come tecnologia di storage è stato scelto NFS per semplicità di setup, anche se non è un opzione consigliata e non è ufficialmente supportata da oVirt (ricordiamoci che lo scopo è quello di avere un home-lab).
Installeremo il server NFS direttamente sull’host per utilizare i dischi del server. L’installazione del server NFS è piuttosto semplice, ma ricordiamoci che selinux è attivo quindi dobbiamo abilitare il boolean ‘virt_use_nfs’.
Per installare NFS, abilitare i servizi necessari e configurare il firewall :
root@host ~]# yum install -y nfs-utils
root@host ~]# systemctl enable --now nfs-server rpcbind
root@host ~]# firewall-cmd --permanent --add-service mountd
root@host ~]# firewall-cmd --permanent --add-service rpc-bind
root@host ~]# firewall-cmd --permanent --add-service nfs
root@host ~]# firewall-cmd --reload
Creiamo il file degli exports nfs con questo contenuto:
[root@host ~]# cat /etc/exports.d/ovirt.exports
/exports/ovirt *(rw,sync)
Creiamo le directory con i permessi 0755:
[root@host ~]# mkdir -p /exports/ovirt
[root@host ~]# chmod 0755 /exports/ovirt
L’utente vdsm e il gruppo kvm sono utilizzati di default da oVirt quindi dobbiamo crearli e associarli alla share nfs. L’UID e GUID sono entrambi 36.
[root@host ~]# groupadd kvm -g 36
[root@host ~]# useradd vdsm -u 36 -g 36
[root@host ~]# chown -R vdsm:kvm /exports/ovirt
Verifichiamo il tutto:
[root@host ~]# ls -ld /exports/ovirt
drwxr-xr-x. 3 vdsm kvm 4096 14 mar 01.37 /exports/ovirt
Informiamo il server NFS della nuova share:
[root@host ~]# exportfs -ra
Controlliamo lo stato di selinux e abilitiamo il boolean ‘virt_usr_nfs’
root@host ~]# getenforce
Enforcing
[root@host ~]# setsebool virt_use_nfs 1
[root@host ~]# getsebool -a | grep nfs
cobbler_use_nfs --> off
conman_use_nfs --> off
ftpd_use_nfs --> off
git_cgi_use_nfs --> off
git_system_use_nfs --> off
httpd_use_nfs --> off
ksmtuned_use_nfs --> off
logrotate_use_nfs --> off
mpd_use_nfs --> off
nagios_use_nfs --> off
nfs_export_all_ro --> on
nfs_export_all_rw --> on
nfsd_anon_write --> off
openshift_use_nfs --> off
polipo_use_nfs --> off
samba_share_nfs --> off
sanlock_use_nfs --> on
sge_use_nfs --> off
tmpreaper_use_nfs --> off
use_nfs_home_dirs --> off
virt_use_nfs --> on
xen_use_nfs --> off
[root@host ~]#
A questo punto possiamo configurare oVirt.
Colleghiamoci a https://www.ovirt.org/download/ e seguiamo la guida ‘Install oVirt using the Cockpit wizard’ partendo dal punto numero 2.
L’installazione tramite interfaccia web (Cockpit) è veramente molto semplice; lasciamo i valori di default proposti:
Datacenter: Default
Network: ovirtmgmt
Storage Domain: hosted_storage
Cluster: Default
L’indirizzo del cockpit a cui collegarci sarà: https://host.mylab.com:9090
Durante l’installazione ci verrà richiesta la location dello storage centrale: è qui che dovremo inserire l’indirizzo e la share del server nfs: host.mylab.com:/exports/ovirt
Inseriamo anche i dati di rete per la VM Engine creata dall’installazione:
host: manager.mylab.com, ip: 192.168.1.26/ default gateway 192.168.1.1 e dns 192.168.1.77
Poniamo attenzione alle credenziali di accesso perchè sono differenti fra https://host.mylab.com:9090 e https://manager.mylab.com
A fine installazione potremo collegarci via browser alla VM Engine (manager.mylab.com)
Apriamo il browser della workstation su https://manager.mylab.com e ci troveremo in questa situazione:
Effettuiamo il login in ‘Administration Portal’ e finalmente avremo oVirt pronto ad accogliere le nostre VM. Nell’ immagine vedete la mia dashboard con alcune VM in funzione, le vostre risorse utilizzate saranno minime.
Andiamo su Storage-> Storage Domains per verificare che lo storage NFS sia attivo.
Ora dovremo creare la network ‘openshift_net’. Se il nome della network supera i 15 caratteri, verrà utilizzato il corrispettivo UUID (molto meglio usare il nome).
Andiamo su Network -> Networks -> New e inseriamo il nome e, se vogliamo, la descrizione:
Andiamo su Cluster e assicuriamoci di togliere il flag ‘Require’. In questo modo oVirt non controlla la presenza fisica del cavo ethernet nell’interfaccia a cui andremo a collegare questa Logica Network.
Il profilo della vNIC è creato in automatico. Premiamo ‘OK’ per creare la Logical Network.
A questo punto troveremo in Network – > Networks l’elenco delle due Logical Network:
‘ovirtmgmt’ e ‘openshift_net’.
Andiamo su Compute -> Host e selezioniamo ‘host.mylab.com’ per trovarci in questa pagina:
Selezioniamo il tab ‘Network Interfaces’ e successivamente premiamo ‘Setup Host Networks’:
Nella colonna ‘Interfaces’ troviamo le interfaccie fisiche di rete presenti sul server Dell. Dobbiamo associare la Logical Network ‘openshift_net’ ad un interfaccia fisica disponibile. Facciamo il drag and drop della Logical Network ‘openshift_net’ verso un’interfaccia fisica disponibile. Nel mio caso ho scelto ‘em2’. Ci troveremo quindi in questa situazione:
Non bisogna configurare nessun altro parametro. Premiamo OK e dopo qualche instante la Logical Network verrà correttamente assegnata all’interfaccia ‘em2’.
A questo punto la configurazione di oVirt per il nostro scopo è terminata. Il prossimo passaggio è la creazione delle macchine virtuali.
Questo è lo schema a cui siamo arrivati:
Per le 2 VM ho scelto di utilizzare la ISO di Fedora 31 server minimal install
Scarichiamo la ISO dal sito ufficiale https://getfedora.org/
La ISO deve essere caricata in oVirt.
Colleghiamoci a https://manager.mylab.com e selezioniamo Storage -> Disks -> Upload -> Start
Effettuiamo il test della connessione con ‘Test Connection”. Se il test fallisce dobbiamo installare il certificato per il nostro browser.
Se il test della connessione è andato a buon fine questo è il risultato:
Scegliamo il file ISO di Fedora 31 e selezioniamo OK senza modificare alcuna descrizione e selezione.
In Storage->Disk sotto la colonna “Status” è possibile verificare lo stato di avanzamento dell’upload. In meno di 2 minuti l’upload dovrebbe completarsi.
Per le VM Bastion, LoadBalancer e per il cluster OCP questi sono le mie scelte:
Dominio: example.com
Cluster name: myocp
Fqdn VM Bastion: bastion.example.com
Fqdn VM LoadBalancer: lb.example.com
Questi i dati di connessione ETH0 per la VM bastion.example.com
ip: 192.168.1.100/24
dns: 192.168.1.77
default gw: 192.168.1.101
hostname: bastion.example.com
Questi i dati di connessione ETH0 per la VM lb.example.com
ip: 192.168.1.101/24
dns: 192.168.1.77
default gw: 192.168.1.101
hostname: bastion.example.com
La connessione ETH1 per entrambe le macchine verrà configurata in seguito.
Creiamo la VM Bastion:
Compute -> Virtual Machines -> New
Ho utilizzato 20Gb di disco, scelto ‘small’ (1 vCpu e 2Gb di Ram) come instance type, ‘Server’ per ‘Optimized for’ e selezionato le logical network nel corretto ordine:
nic1 = ovirtmgmt/ovirtmgmt
nic2 = openshift_net/openshift_net
Spostiamoci in Boot Options, selezioniamo CD-ROM come Second Device, e agganciamo l’immagine di Fedora server 31 caricata in precedenza.
Le caratteristiche di questa VM vanno bene anche per il LoadBalancer quindi possiamo clonarla.
Con la VM bastion.example.com selezionata, premiamo i tre punti verticali in alto a destra e poi ‘Clone VM’. Come ‘Clone Name’ inseriamo ‘lb.example.com’. Editiamo la descrizione della nuova VM in ‘Load Balancer’
Per entrambi le VM creare un utente con i privilegi di amministratore. Nel mio caso ho scelto l’utente ‘vale’
Questa è la situazione con le sole due VM:
Facciamo partire la VM appena creata, premiamo ‘console’ e installiamo Fedora 31 server facendo attenzione a configurare correttamente l’hostname e solo la prima interfaccia di rete.
Eseguiamo le stesse operazioni per la VM lb.example.com, configurando correttamente la rete e hostname per questa VM.
Durante l’installazione delle VM, aggiorniamo il file /etc/dnsmasq.conf sul server DNS 192.168.1.77 e riavviamo dnsmasq.
#### oVirt ####
address=/host.mylab.com/192.168.1.25
address=/manager.mylab.com/192.168.1.26
#### Bastion and LB #####
address=/bastion.example.com/192.168.1.100
address=/lb.example.com/192.168.1.101
Dalla Workstation, verifichiamo la corretta configurazione:
vale@vale-laptop:~$ dig bastion.example.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22612
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;bastion.example.com. IN A
;; ANSWER SECTION:
bastion.example.com. 0 IN A 192.168.1.100
;; Query time: 1 msec
;; SERVER: 192.168.1.77#53(192.168.1.77)
;; WHEN: Sat Mar 14 19:20:22 CET 2020
;; MSG SIZE rcvd: 64
vale@vale-laptop:~$ dig lb.example.com
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1496
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;lb.example.com. IN A
;; ANSWER SECTION:
lb.example.com. 0 IN A 192.168.1.101
;; Query time: 1 msec
;; SERVER: 192.168.1.77#53(192.168.1.77)
;; WHEN: Sat Mar 14 19:20:24 CET 2020
;; MSG SIZE rcvd: 59
A installazione ultimata potremo utilizzare anche il cockpit su entrambe le macchine:
https://bastion.example.com:9090
https://lb.example.com:9090
Dalla workstation copiamo la chiave pubblica nelle VM (l’utente della workstation è ‘vale’):
vale@vale-laptop:~$ ssh-copy-id bastion.example.com
vale@vale-laptop:~$ ssh-copy-id lb.example.com
Verifichiamo per le VM la connettività a internet
Dalla VM bastion.example.com verifichiamo inoltre la corretta risoluzione di lb.example.com:
[vale@bastion ~]$ dig lb.example.com
[vale@bastion ~]$ hostname -f
vale@vale-laptop:~$ ssh lb.example.com hostname -f
lb.example.com
A questo punto abbiamo terminato la configurazione lato oVirt, nella prossima puntata analizzeremo i passi necessari per installare Openshift 4.3.8