CSE: Kubernetes per chi è in vCloud

CSE: Kubernetes per chi è in vCloud
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.

CSE: Kubernetes per chi è in vCloud

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 vcd-cli, 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 qui.

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-nfs

Se 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.
CSE: Kubernetes per chi è in vCloud

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

CSE: Kubernetes per chi è in vCloud

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:

CSE: Kubernetes per chi è in vCloud

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

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster