logo
< Back Post-Image

Travailler avec Kubernetes en local

Comment travailler avec Kubernetes ? De quoi a t-on besoin ? Ce sont des questions qui reviennent régulièrement et pour cause, lorsqu’on étudie Kubernetes et son fonctionnement, on tombe rapidement sur des configurations matérielles ou virtuelles relativement complexes. Le cluster etcd peut être installé sur les mêmes nodes hébergeant l’api-server et les autres éléments du control plane. Le control plane peut être constitué de un ou plusieurs nodes en fonction du niveau de résilience souhaité. Pareil pour etcd. De multiples configurations sont possibles et chacune a ses avantages et ses inconvénients. Une fois que cette configuration est choisie, la seconde question que l’on se pose est bien souvent “où ?". En effet, l’endroit où sera déployé Kubernetes est un choix important puisque certaines fonctions (Service loadbalancer, Storage Class, etc) ne seront peut-être pas disponibles.

Lorsqu’on souhaite déployer Kubernetes afin de s’entrainer, expérimenter, tester Kubernetes, cela fait beaucoup de questions sans réponse.

Nous vous proposons un aperçu des possibilités qui s’offrent à vous pour déployer Kubernetes en local sur votre poste de travail sans compromis sur les fonctionnalités.

La bonne recette

Lorsqu’on souhaite travailler sur Kubernetes en local, on cherche tout d’abord la simplicité. On ne souhaite pas passer plusieurs heures à prendre en main des outils comme Kubespray pour déployer Kubernetes. Particule a développé une version “plus légère” de Kubespray, Symplegma mais même ça c’est encore trop lourd. On souhaite quelque chose de simple à utiliser, qui puisse démarrer et supprimer un cluster Kubernetes en quelques minutes. On veut aussi avoir accès à l’ensemble de l’API, pas à un subset et à la possibilité d’utiliser toutes les fonctionnalités comme si on était sur un cluster de production.

En terme d’architecture, c’est simple on veut généralement un seul node, qui fera office de control plane et de worker. On souhaiterai néanmoins avoir le choix de faire du multi-nodes si l’envie nous en prenait. Pour tester des fonctions de schéduling ou de communication inter-nodes, c’est plutôt utile.

Kubeadm : le projet officiel

kubeadm

Kubeadm (à prononcer kube admin et non pas kubeADM) est le projet officiel de Kubernetes permettant de bootstraper un cluster. Kubeadm se compose d’un binaire incluant une ligne de commande assez complète. Kubeadm est utilisé par un nombre important de projet tiers comme la solution pour bootstraper un cluster Kubernetes. Mais c’est là sa limite, il ne fait que ça. En soit pour démarrer un control plane Kubernetes, il suffit de :

$ kubeadm init

Mais pour bénéficier en sortie d’un control plane fonctionnel, cela présuppose que plusieurs choses soient installées, en amont ou en aval :

Kubeadm peut être configuré via sa ligne de commande ou en y passant un fichier de configuration :

---
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
metadata:
  name: 1.20-sample
apiServer:
  extraArgs:
    advertise-address: 192.168.0.103
    anonymous-auth: false
    enable-admission-plugins: AlwaysPullImages,DefaultStorageClass
    audit-log-path: /home/johndoe/audit.log

Si vous souhaitez ajouter des nodes à votre cluster, il faudra démarrer une nouvelle machine virtuelle (ou physique), refaire le processus d’installation “pre-kubeadm” puis utiliser kubeadm join pour l’ajouter à votre cluster.

Kubeadm est donc un bon outil quand il est accompagné d’une surcouche comme kops, kubespray ou symplegma mais il ne convient pas à utilisation de test rapide sur un poste de travail.

Minikube, l’ancien

Minikube fut probablement le premier outil pour installer rapidement et facilement Kubernetes. Projet officiel Kubernetes, Minikube a l’énorme avantage aujourd’hui de pouvoir déployer Kubernetes de différentes besoins grâce à ses drivers. Le moyen le plus commun est de déployer Kubernetes dans des VM VirtualBox mais Minikube possède des drivers pour :

  • Docker
  • VMware
  • Hyper-V
  • KVM
  • podman
  • etc

Grâce à ses plugins, Minikube permet automatiquement d’installer un Ingress Controller ou d’activer le Dashboard Kubernetes. Minikube possède aussi un mode “LoadBalancer” pour permettre d’utiliser ce type de Service en dehors d’un cloud public.

Kind : Kubernetes in Docker

kind

Kind est un outil de déploiement de Kubernetes géré par le Sig Testing et hébergé sous kubernetes-sigs. Kind permet de déployer des clusters Kubernetes en se servant de conteneurs Docker comme des nodes Kubernetes. Chaque node utilise kubeadm afin de bootstraper le cluster ou de rejoindre un cluster existant.

Malgré l’arrêt du support de Docker par Kubernetes, Kind utilise Docker ou Podman pour bootstraper les clusters mais il s’agit bien d’une runtime compatible CRI, containerd, qui est utilisée à l’intérieur des clusters. Dockershim n’est pas utilisé.

Les clusters Kind peuvent être configurés au moyen d’un fichier YAML, comme kubeadm.

# Un node control-plane et deux nodes workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

---

# trois nodes control-plane et trois nodes workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

Il ne reste qu’à charger ce fichier au boot du cluster.

$ kind create cluster --config config.yaml --name cluster

Des contexts kind-${cluster_name} sont crées dans votre kubeconfig afin d’y accéder.

Une Storage Class “locale” est inclue permettant d’utiliser le stockage local de votre machine grâce à l’image rancher/local-path-provisioner

k3s, k8s moins 5

k3s

Nous avons déjà abordé le cas de k3s dans un précédent article. K3s est un produit développé par Rancher.

k3s se compose d’un binaire d’une cinquantaine de Mo. Il suffit de le lancer pour bénéficier d’un cluster Kubernetes up and running.

$ k3s kubectl get node
NAME           STATUS   ROLES                  AGE    VERSION
rguichard-x1   Ready    control-plane,master   345d   v1.20.0+k3s2

Sont inclus :

Ces deux derniers éléments permettent de disposer du type loadbalancer pour les Services ainsi que d’une StorageClass fonctionelle utilisant le stockage local de votre machine. Ces deux éléments font partis des pain points rencontrés par la plupart des équipes ayant tenté l’aventure de Kubernetes en dehors d’un cloud public.

Nous avons d’ailleurs rédigé un article à ce sujet.

Aller encore plus loin avec k3d

k3d

k3s ne permet de disposer que d’un seul control plane ce qui peut être problématique dans le cas de tests en parallèle.

Pour cela Rancher dispose d’un deuxième produit : k3d qui permet de piloter k3s et de déployer les clusters dans des conteneurs Docker.

$ k3d cluster create first --agents 3
$ k3d cluster create second --servers 3
$ k3d cluster create third --agents 3 --servers 3
$ k3d cluster list
NAME          SERVERS   AGENTS   LOADBALANCER
first         1/1       3/3      true
second        3/3       1/1      true
third         3/3       3/3      true

k3d permet de choisir le nombre de node du control plane et le nombre de worker que vous souhaitez.

Des contexts k3d-${cluster_name} sont automatiquement crées dans ~/.kube/config afin de pouvoir vous y connecter avec vos outils habituels.

$ kubectl get node
NAME                 STATUS   ROLES         AGE   VERSION
k3d-third-agent-0    Ready    <none>        12s   v1.19.4+k3s1
k3d-third-agent-1    Ready    <none>        11s   v1.19.4+k3s1
k3d-third-agent-2    Ready    <none>        10s   v1.19.4+k3s1
k3d-third-server-0   Ready    etcd,master   50s   v1.19.4+k3s1
k3d-third-server-1   Ready    etcd,master   36s   v1.19.4+k3s1
k3d-third-server-2   Ready    etcd,master   17s   v1.19.4+k3s1

Et les autres ?

D’autres solutions existent évidemment, nous avons choisi de ne pas les aborder car être exhaustif est voué à l’échec. On peut néanmoins citer MicroK8s (Ubuntu) et k0s (Mirantis) qui sont d’excellents produits et auraient eu leur place ici.

Pour vos projets Kubernetes, qu’ils soient mono ou multi tenants, on premises ou sur un Cloud public, n’hesitez pas à nous contacter

L’équipe Particule