
Ciao a tutti!
La nostra piccola squadra è cresciuta nel tempo, non recente e sicuramente non inaspettatamente, fino a voler migrare alcuni (e in futuro tutti) i prodotti su Kubernetes.
Le ragioni sono molteplici, ma la nostra storia non riguarda le controversie.
Le opzioni per l'infrastruttura erano limitate. vCloud Director e vCloud Director. Abbiamo scelto quello più recente e abbiamo deciso di partire.
Sfogliando di nuovo 'The Hard Way', ho rapidamente concluso che uno strumento per automatizzare almeno i processi basici, come il deploy e il sizing, era necessario già ieri. Un'immersione profonda in Google ha rivelato il prodotto VMware Container Service Extension (CSE) — un prodotto open source che consente di automatizzare la creazione e il sizing dei cluster k8s per chi usa vCloud.
Disclaimer: CSE ha le sue limitazioni, ma era perfetto per i nostri scopi. Inoltre, la soluzione deve essere supportata dal provider cloud, ma poiché la parte server è anch'essa open-source, richiedetene la presenza al prossimo manager 🙂.
Per iniziare a utilizzarlo, è necessario disporre di un account amministratore nell'organizzazione vCloud e di una rete routed previamente creata per il cluster (durante il deploy è necessaria l'accessibilità a Internet da questa rete, non dimenticate di configurare il Firewall/NAT). L'indirizzamento non è rilevante. In questo esempio utilizziamo 10.0.240.0/24.
![]()
Poiché sarà necessario gestire il cluster dopo la creazione, è consigliabile avere un VPN con routing sulla rete creata. Noi utilizziamo un SSL-VPN standard configurato sull'Edge Gateway della nostra organizzazione.
Dopo di che, è necessario installare il client CSE da cui sarà gestito il cluster k8s. Nel mio caso, si tratta di un laptop da lavoro e alcuni contenitori ben nascosti che si occupano dell'automazione.
Il client richiede l'installazione di Python versione 3.7.3 o superiore e del modulo , quindi installeremo entrambi.
pip3 install vcd-cli
pip3 install container-service-extension
Dopo l'installazione, controlliamo la versione di CSE e otteniamo quanto segue:
# vcd cse version
Error: No such command "cse".
Inaspettato, ma risolvibile. Si è scoperto che CSE deve essere integrato come modulo a vcd-cli.
Per farlo, prima occorre effettuare il login di vcd-cli nella nostra organizzazione:
# vcd login MyCloud.provider.com org-dev admin
Password:
admin logged in, org: 'org-dev', vdc: 'org-dev_vDC01'
Dopodiché, vcd-cli creerà un file di configurazione ~/.vcd-cli/profiles.yaml
Alla fine di questo file è necessario aggiungere quanto segue:
extensions:
- container_service_extension.client.cse
Dopo di che, controlliamo di nuovo:
# vcd cse version
CSE, Container Service Extension for VMware vCloud Director, version 2.5.0
La fase di installazione del client è completata. Proviamo a distribuire il primo cluster.
CSE ha diversi set di parametri, tutti visibili
Per iniziare, creiamo le chiavi per l'accesso senza password al futuro cluster. Questo è un aspetto importante, poiché per impostazione predefinita l'accesso tramite password alle nodi sarà disattivato e se non si impostano le chiavi, si rischiano molti problemi attraverso le console delle macchine virtuali, che non è proprio comodo.
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
Provamo a eseguire la creazione del cluster:
vcd cse cluster create MyCluster --network k8s_cluster_net --ssh-key ~/.ssh/id_rsa.pub --nodes 3 --enable-nfsSe si riceve un errore Error: Session has expired or user not logged in. Please re-login. — effettuiamo di nuovo il login di vcd-cli in vCloud come descritto sopra e riproviamo.
Questa volta tutto va bene e il task per la creazione del cluster è stato avviato.
cluster operation: Creating cluster vApp 'MyCluster' (38959587-54f4-4a49-8f2e-61c3a3e879e0) from template 'photon-v2_k8-1.12_weave-2.3.0' (revision 1)
Ci vorranno circa 20 minuti per completare il task, nel frattempo analizziamo i principali parametri di avvio.
—network — rete creata in precedenza da noi.
—ssh-key — chiavi generate da noi, che verranno registrate sui nodi del cluster.
—nodes n — Numero di nodi Worker nel cluster. Ce ne sarà sempre uno Master, questa è una limitazione del CSE.
—enable-nfs — creare un nodo aggiuntivo per la condivisione NFS per volumi persistenti. È un'opzione piuttosto avanzata, per la quale approfondiremo cosa fa più tardi.
Nel frattempo, in vCloud possiamo osservare visivamente la creazione del cluster.

Una volta completato il task di creazione del cluster, sarà pronto all'uso.
Controlliamo la correttezza del deploy con il comando vcd cse cluster info MyCluster

Dopo di che, dobbiamo ottenere la configurazione del cluster per il suo utilizzo. kubectl
# vcd cse cluster config MyCluster > ./.kube/config
E possiamo verificare lo stato del cluster già con essa:

A questo punto, il cluster può considerarsi condizionatamente operativo, se non fosse per la questione dei volumi persistenti. Poiché siamo in vCloud, non possiamo utilizzare il vSphere Provider. L'opzione —enable-nfs è concepita per mitigare questo problema, ma non è stato completamente risolto. È necessaria una configurazione manuale.
Per iniziare, sul nostro nodo è necessario creare un disco Independent separato in vCloud. Questo garantisce che i nostri dati non scompaiano insieme al cluster, nel caso venga rimosso. Inoltre, collegheremo il disco all'NFS.
# vcd disk create nfs-shares-1 100g --description 'Kubernetes NFS shares'
# vcd vapp attach mycluster nfsd-9604 nfs-shares-1
Dopo di che, accediamo via ssh (spero che abbiate davvero creato le chiavi?) al nostro nodo NFS e concludiamo il collegamento del disco:
root@nfsd-9604:~# parted /dev/sdb
(parted) mklabel gpt
Attenzione: L'etichetta del disco esistente su /dev/sdb verrà distrutta e tutti i dati su
questo disco andranno persi. Vuoi continuare?
Sì/No? sì
(parted) unit GB
(parted) mkpart primary 0 100
(parted) print
Modello: Disco virtuale VMware (scsi)
Disco /dev/sdb: 100GB
Dimensione settori (logica/fisica): 512B/512B
Tabella delle partizioni: gpt
Flags del disco:
Numero Inizio Fine Dimensione File system Nome Flags
1 0.00GB 100GB 100GB primaria
(parted) quit
root@nfsd-9604:~# mkfs -t ext4 /dev/sdb1
Creazione del filesystem con 24413696 blocchi da 4k e 6111232 inodes
UUID del filesystem: 8622c0f5-4044-4ebf-95a5-0372256b34f0
Backup del superblocco memorizzati sui blocchi:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocazione delle tabelle di gruppo: completata
Scrittura delle tabelle degli inode: completata
Creazione del journal (32768 blocchi): completata
Scrittura del superblocco e informazioni di accounting del filesystem: completata
Creiamo una directory per i dati e montiamo lì la nuova partizione:
mkdir /export
echo '/dev/sdb1 /export ext4 defaults 0 0' >> /etc/fstab
mount -a
Creeremo cinque partizioni di test e le condivideremo per il cluster:
>cd /export
>mkdir vol1 vol2 vol3 vol4 vol5
>vi /etc/exports
#Aggiungiamo questo alla fine del file
/export/vol1 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol2 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol3 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol4 *(rw,sync,no_root_squash,no_subtree_check)
/export/vol5 *(rw,sync,no_root_squash,no_subtree_check)
#:wq! ;)
#Successivamente - esportiamo le partizioni
>exportfs -r
Dopo tutta questa magia, possiamo creare un PV e un PVC nel nostro cluster in questo modo:
PV:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-vol1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
nfs:
# Stessa IP dell'host NFS a cui ci siamo collegati via ssh in precedenza.
server: 10.150.200.22
path: "/export/vol1"
EOF
PVC:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 10Gi
EOF
Con questo si conclude la storia della creazione di un cluster e inizia la storia del suo ciclo di vita. Come bonus, ecco due comandi utili del CSE che possono risparmiare risorse a volte:
#Увеличиваем размер кластера до 8 воркер нод
>cse cluster resize MyCluster --network k8s_cluster_net --nodes 8
#Выводим ненужные ноды из кластера с их последующим удалением
>vcd cse node delete MyCluster node-1a2v node-6685 --yes
Grazie a tutti per il tempo dedicato, se avete domande - chiedete nei commenti.
Fonte: habr.com
