Créer des clusters virtuels via vCluster
Il est presque impossible de compter combien de clusters j’ai déployés lorsque j’écris un article. Grâce à Talos, il est assez facile de recréer un nouveau cluster à partir de zéro sans avoir à installer de nouvelles machines, mais c’est toujours une opération ennuyeuse et parfois, j’ai du mal à obtenir un résultat que j’avais déjà dans le cluster précédent.
Étant donné que mes ressources ne sont pas illimitées et que je ne peux pas créer des dizaines de clusters sur mon homelab, ce serait bien si je pouvais créer un nouveau cluster sans supprimer les anciens et sans avoir à penser aux ressources utilisées.
Information
Je vais principalement parler de vCluster et non de la plateforme vCluster (Un programme pour contrôler les vClusters sur différents clusters Kubernetes, et avoir une interface web pour les gérer).
Installer vCluster
curl -L -o vcluster "https://github.com/loft-sh/vcluster/releases/latest/download/vcluster-linux-amd64" && sudo install -c -m 0755 vcluster /usr/local/bin && rm -f vcluster
Quickstart
vcluster create my-vcluster --namespace virtual-cluster-01
Avant d’activer vCluster:
# k get nodes
NAME STATUS ROLES AGE VERSION
cp-1 Ready control-plane 53m v1.29.1
cp-2 Ready control-plane 53m v1.29.1
cp-3 Ready control-plane 53m v1.29.1
worker-1 Ready <none> 53m v1.29.1
# k get ns
NAME STATUS AGE
default Active 51m
kube-node-lease Active 51m
kube-public Active 51m
kube-system Active 51m
kubelet-serving-cert-approver Active 43m
longhorn-system Active 46m
metallb-system Active 48m
virtual-cluster-01 Active 28m
Activer vCluster sur notre hôte (utilisera un tunnel, comme nous le faisons avec le port-forward) :
vcluster connect my-vcluster
Après avoir activé le vCluster
# k get nodes
NAME STATUS ROLES AGE VERSION
cp-2 Ready <none> 8m51s v1.29.6
# k get ns
NAME STATUS AGE
default Active 9m49s
kube-node-lease Active 9m49s
kube-public Active 9m49s
kube-system Active 9m49s
Utilisation d’un fichier de configuration
En réalité, le CLI vCluster déploiera un chart Helm à chaque fois que nous créerons un cluster virtuel. Pour configurer ce cluster éphémère, nous pouvons utiliser un fichier de valeurs (comme nous l’aurions fait avec une application Helm réelle).
Par exemple, si je ne veux pas utiliser la commande vCluster pour accéder au cluster virtuel, voici la configuration pour exposer le serveur API avec un service LoadBalancer.
# vcluster.yaml
controlPlane:
service:
enabled: true
spec:
type: LoadBalancer
Pour déployer ce cluster, il suffit de passer l’argument --values
.
vcluster create my-vcluster --namespace virtual-cluster-01 --values vcluster.yaml
Sur notre cluster hôte, nous pouvons voir qu’il y a un nouveau service pointant vers le cluster virtuel.
# k get svc -n virtual-cluster-01
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-vcluster LoadBalancer 10.102.253.166 192.168.128.240 443:32546/TCP 107s
my-vcluster-headless ClusterIP None <none> 443/TCP 107s
Nous utilisons un vcluster connect
pour récupérer le kubeconfig (et rien d’autre, aucun renvoi de port ne sera ouvert).
vcluster connect my-vcluster
23:07:32 info Waiting for vcluster to come up...
23:07:49 warn vcluster is waiting, because vcluster pod my-vcluster-0 has status: Init:2/3
23:08:22 done vCluster is up and running
23:08:22 info Using vcluster my-vcluster load balancer endpoint: 192.168.128.240
23:08:22 done Switched active kube context to vcluster_my-vcluster_virtual-cluster-01_admin@argocd-rollout-talos
- Use `vcluster disconnect` to return to your previous kube context
- Use `kubectl get namespaces` to access the vcluster
Cette fois, pas de tunnels, nous utilisons directement l’IP du loadBalancer.
Il est possible d’imprimer uniquement le kubeconfig sans l’ajouter à notre ~/.kube/config
: vcluster connect my-vcluster --print
.
Ce cluster fonctionne, que diriez-vous des situations où nous avons besoin de fonctionnalités plus complexes?
Il est possible de configurer la synchronisation entre le cluster et les clusters virtuels. Une telle synchronisation peut avoir lieu dans les deux sens (du réel cluster vers le virtuel, ou vice versa).
Par exemple, je veux synchroniser les storage classes du cluster hôte avec celles du cluster virtuel (par défaut, nous ne pouvons pas créer de PVC dans le vcluster).
sync:
fromHost:
storageClasses:
enabled: true
En utilisant cette configuration, le cluster virtuel peut créer des PVC en utilisant la classe de stockage créée sur le cluster hôte.
Si nous essayons de lister les classes de stockage à l’intérieur du cluster virtuel, nous trouverons toutes les classes de stockage.
# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
longhorn (default) driver.longhorn.io Delete Immediate true 6m38s