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