Vcluster: comment créer des clusters Kubernetes virtuels

thumbernail kubernetes

1. vcluster : comment créer des clusters Kubernetes virtuels dans un cluster réel

Deuxième article sur d'une série portant sur les sujets de "multi tenants".

Kubernetes est un système d’orchestration de conteneurs qui permet de déployer, gérer et mettre à l’échelle des applications distribuées. Kubernetes offre une abstraction de haut niveau pour manipuler des ressources comme des pods, des services, des déploiements, etc. Ces ressources sont organisées en namespaces, qui sont des unités logiques de regroupement et d’isolation.

Toutefois, les namespaces ne sont pas suffisants pour garantir une isolation complète entre les différents utilisateurs ou environnements d’un même cluster Kubernetes. En effet, il existe des ressources qui sont globales au cluster, comme les Custom Resource Definitions (CRD), les Cluster Roles, les Persistent Volumes, etc. Ces ressources peuvent entrer en conflit ou être partagées entre les namespaces, ce qui pose des problèmes de sécurité, de performance et de compatibilité.

Pour résoudre ces problèmes, il existe une solution qui consiste à créer des clusters Kubernetes virtuels, qui sont des clusters Kubernetes à part entière qui s’exécutent dans un namespace d’un cluster Kubernetes réel. Ces clusters virtuels disposent de leur propre API server, de leur propre control plane et de leurs propres ressources. Ils sont donc plus puissants et plus isolés que les namespaces classiques.

2. Qu’est-ce que vcluster ?

vcluster est un outil open source qui permet de créer facilement des clusters Kubernetes virtuels. vcluster est basé sur k3s, une distribution légère de Kubernetes développée par Rancher. vcluster utilise un composant appelé syncer, qui synchronise les ressources de bas niveau du cluster virtuel, comme les pods, les services, les ingress, avec le cluster réel. Ainsi, le cluster réel exécute ces ressources, mais le cluster virtuel les contrôle.

vcluster présente plusieurs avantages par rapport à d’autres solutions de multi-tenancy pour Kubernetes :

Il est compatible avec n’importe quel cluster Kubernetes, sans avoir besoin d’installer des agents ou des opérateurs sur le cluster réel. Il est facile à utiliser, il suffit d’une seule commande ou d’une API pour créer un cluster virtuel. Il est efficace en termes de coût, il permet d’économiser des ressources en partageant le control plane et les worker nodes du cluster réel. Il offre une meilleure isolation et une meilleure résilience que les namespaces, en évitant les conflits ou les défaillances liés aux ressources globales au cluster.

3. Comment utiliser vcluster ?

3.1 Utilisation de la CLI

Pour utiliser vcluster, il faut d’abord installer le CLI de vcluster sur sa machine locale.

Le plus simple est suivre la procédure décrite ici : (https://www.vcluster.com/docs/getting-started/setup)

Le CLI de vcluster permet de créer, de supprimer, de lister et de se connecter aux clusters virtuels. Il faut aussi avoir accès à un cluster Kubernetes réel, qui servira d’hôte pour les clusters virtuels.

Pour créer un cluster virtuel, on peut utiliser les commandes suivantes :

# Créer un nouveau vCluster dans le namespace vCluster-mon-vcluster

vcluster create mon-vcluster

# OU : utilisez --expose pour créer un vCluster dans un cluster distant avec un LoadBalancer accessible de l'extérieur
vcluster create mon-vcluster --expose

# OU : utilisez -f pour utiliser un helmvalues.yaml supplémentaire avec des options supplémentaires du chart pour déployer le vCluster
vcluster create mon-vcluster -f values.yaml

# OU : utilisez --distro pour spécifier k0s ou vanilla k8s comme cluster virtuel de support
vcluster create mon-vcluster --distro k8s

# OU : utilisez --isolate pour créer un environnement isolé pour les charges de travail du vCluster
vcluster create mon-vcluster --isolate

Exemple :

 vcluster create vcluster-herlec-k8s  --distro k8s -n herlec-k8s --expose
11:15:00 info Creating namespace herlec-k8s
11:15:00 info Create vcluster vcluster-herlec-k8s...
11:15:00 info execute command: helm upgrade vcluster-herlec-k8s /var/folders/h2/12qsmrms09b5d8_g44gl87zm0000gn/T/vcluster-k8s-0.17.1.tgz-978776111 --kubeconfig /var/folders/h2/12qsmrms09b5d8_g44gl87zm0000gn/T/521084887 --namespace herlec-k8s --install --repository-config='' --values /var/folders/h2/12qsmrms09b5d8_g44gl87zm0000gn/T/2392899474
11:15:03 done Successfully created virtual cluster vcluster-herlec-k8s in namespace herlec-k8s
11:15:03 info Waiting for vcluster to come up...
11:16:03 info Using vcluster vcluster-herlec-k8s load balancer endpoint: 4.225.40.250
11:16:03 done Switched active kube context to vcluster_vcluster-herlec-k8s_herlec-k8s_k8s-ims-admin
- Use `vcluster disconnect` to return to your previous kube context
- Use `kubectl get namespaces` to access the vcluster

❯ kubectl get namespaces
NAME              STATUS   AGE
default           Active   46s
kube-node-lease   Active   46s
kube-public       Active   46s
kube-system       Active   46s

❯ kubectl config get-contexts --output name

* k8s-ims-admin
vcluster_vcluster-herlec-k8s_herlec-k8s_k8s-ims-admin


❯ k get po -n herlec-k8s
NAME                                                           READY   STATUS    RESTARTS        AGE
coredns-68559449b6-hbqgf-x-kube-system-x-vcluster-herlec-k8s   1/1     Running   0               9m10s
vcluster-herlec-k8s-6cf689688f-xj9cx                           1/1     Running   0               10m
vcluster-herlec-k8s-api-6f784c8f97-zgnb7                       1/1     Running   1 (9m40s ago)   10m
vcluster-herlec-k8s-controller-788966cbdb-dhn9d                1/1     Running   2 (9m38s ago)   10m
vcluster-herlec-k8s-etcd-0                                     1/1     Running   0               10m

❯ kubectl config use-context vcluster_vcluster-herlec-k8s_herlec-k8s_k8s-ims-admin

❯ kubectl get po

No resources found in default namespace.

3.1.1 Commandes CLI usuelles

  • Pour se connecter au cluster virtuel, il faut utiliser la commande suivante :
vcluster connect mon-vcluster -n mon-namespace

Cette commande va ouvrir un port-forward vers le cluster virtuel et modifier la variable d’environnement KUBECONFIG pour utiliser le fichier kubeconfig généré précédemment. Ainsi, on peut utiliser les commandes kubectl ou helm comme si on était connecté au cluster virtuel.

  • Pour lister les clusters virtuels existants, il faut utiliser la commande suivante :
vcluster list

Cette commande va afficher le nom, le namespace, le statut et l’URL des clusters virtuels.

  • Pour mettre en pause un vCluster : pour réduire temporairement le vCluster et supprimer toutes ses charges de travail créées sur le cluster hôte. Cela peut être utile pour économiser les ressources utilisées par les charges de travail vCluster dans le cluster hôte.
vcluster pause mon-vcluster -n mon-namespace

Cette commande va :

  • Mettre les statefulset et deployment à '0'
  • Supprimer tous les workload créés par le vCluster

  • Reprise d'un vCluster

vcluster resume mon-vcluster -n mon-namespace
#ou
vcluster connect mon-vcluster -n mon-namespace
  • Pour supprimer un cluster virtuel, il faut utiliser la commande suivante :
vcluster delete mon-vcluster -n mon-namespace

3.2 Utilisation de Helm

Créez le fichier vcluster.yaml :

vcluster:
  image: rancher/k3s:v1.23.5-k3s1

Ensuite, installez le chart Helm à l'aide de vcluster.yaml pour les valeurs du chart :

helm upgrade --install mon-vcluster vcluster \
  --values vcluster.yaml \
  --repo https://charts.loft.sh \
  --namespace mon-namespace \
  --repository-config=''

4. Usages avancés

Pour régler les limites et les quotas pour les clusters créés avec vcluster, vous pouvez utiliser les objets ResourceQuota et LimitRange de Kubernetes. Ces objets permettent de contrôler la consommation et la création des ressources du cluster par namespace.

Un ResourceQuota définit des contraintes qui limitent la quantité totale de ressources que peut consommer un namespace. Par exemple, vous pouvez limiter le nombre de pods, de CPU, de mémoire ou de stockage persistant que peut utiliser un namespace. Vous pouvez créer un ResourceQuota dans le namespace où le cluster virtuel est exécuté, en utilisant le CLI de vcluster ou en appliquant un fichier YAML. Voici un exemple de ResourceQuota qui limite le namespace à 10 vCores, 20GB de mémoire et 10 pods au maximum :

Il suffit de créer une resource dans le namespace du vcluster

apiVersion: v1
kind: ResourceQuota
metadata:
  name: vcluster-quota
spec:
  hard:
    cpu: "10"
    memory: 20Gi
    pods: "10"

Un LimitRange définit des contraintes qui s’appliquent aux ressources demandées ou allouées par les pods ou les conteneurs dans un namespace. Par exemple, vous pouvez définir des valeurs par défaut ou des valeurs minimales ou maximales pour les ressources CPU ou mémoire des pods ou des conteneurs. Vous pouvez créer un LimitRange dans le namespace où le cluster virtuel est exécuté, en utilisant le CLI de vcluster ou en appliquant un fichier YAML. Voici un exemple de LimitRange qui définit des valeurs par défaut pour les ressources CPU et mémoire des conteneurs :

apiVersion: v1
kind: LimitRange
metadata:
  name: vcluster-limit-range
spec:
  limits:
    - default:
        memory: 512Mi
        cpu: "1"
      defaultRequest:
        memory: 128Mi
        cpu: 100m
      type: Container

Pour limiter le placement des pod sur certains noeud.

Il faut suivre la documentation disponible ici : Limiting pod scheduling to selected nodes

5. Quels sont les cas d’usage de vcluster ?

vcluster peut être utilisé pour plusieurs scénarios, comme :

  • Le développement et le test : on peut créer des clusters virtuels à la volée pour chaque branche, chaque pull request ou chaque environnement de test, sans avoir à gérer des clusters réels séparés. Cela permet d’avoir des environnements isolés, reproductibles et éphémères, qui sont détruits automatiquement à la fin du cycle de vie.

  • Le multi-tenancy : on peut créer des clusters virtuels pour chaque utilisateur, chaque équipe ou chaque client, sans avoir à partager les ressources globales au cluster. Cela permet d’avoir une meilleure isolation, une meilleure sécurité et une meilleure compatibilité entre les tenants, qui peuvent utiliser leurs propres CRD, cluster roles, etc.

  • L’éducation et la formation : on peut créer des clusters virtuels pour chaque étudiant, chaque stagiaire ou chaque participant à un atelier, sans avoir à provisionner des clusters réels pour chacun. Cela permet d’avoir des clusters Kubernetes 100% fonctionnels, qui peuvent être utilisés pour apprendre ou enseigner les concepts et les pratiques de Kubernetes.

6. Conclusions

vcluster est un outil innovant et performant qui permet de créer des clusters Kubernetes virtuels dans un cluster Kubernetes réel. vcluster offre une solution de multi-tenancy pour Kubernetes, qui est plus puissante et plus isolée que les namespaces classiques. vcluster peut être utilisé pour plusieurs cas d’usage, comme le développement, le test, le multi-tenancy, l’éducation ou la formation. vcluster est facile à utiliser, il suffit d’installer le CLI de vcluster et de lancer une seule commande pour créer un cluster virtuel.

Si vous voulez en savoir plus sur vcluster, vous pouvez consulter les ressources suivantes :

Découvrez les technologies d'alter way