Exécuter un cluster Kubernetes dans Docker avec K3d
Agence web » Actualités du digital » Exécuter un cluster Kubernetes dans Docker avec K3d

Exécuter un cluster Kubernetes dans Docker avec K3d

K3d est un wrapper open source autour de la distribution Rancher/SUSE K3s Kubernetes qui vous permet d’exécuter le plan de contrôle dans Docker. L’ensemble de la pile s’exécute dans Docker, ce qui vous donne un cluster entièrement conteneurisé, léger et facile à configurer.

Alors que K3s est conçu pour un large éventail de flux de travail, K3d se concentre plus spécifiquement sur les situations de développement où vous utilisez déjà Docker. Il vous permet de lancer un cluster Kubernetes sur votre hôte Docker existant sans exécuter de machine virtuelle ni aucun autre service système.

Cet article vous montrera comment être opérationnel avec un simple cluster K3d. Vous aurez besoin de Kubectl et Docker v20.10.5 ou plus récent déjà installés sur votre système avant de commencer. K3d fonctionne sur Linux, Mac (y compris via Homebrew) et Windows (via Chocolatey). Ce guide se concentre sur l’utilisation avec Linux ; k3d Les instructions d’installation de la CLI pour d’autres plates-formes sont disponibles dans la documentation.

Installation de la CLI K3d

La k3d L’interface de ligne de commande fournit des commandes de gestion pour créer et gérer vos clusters. Vous pouvez trouver la dernière CLI sur GitHub ou exécuter le script d’installation pour obtenir automatiquement le téléchargement correct pour votre système.

$ curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash

Le script dépose le k3d binaire dans votre /usr/local/bin annuaire. Essayez d’exécuter le k3d version commande pour vérifier que votre installation a réussi :

$ k3d version
k3d version v5.4.6
k3s version v1.24.4-k3s1 (default)

Création d’un cluster

La CLI K3d fournit un cluster create commande pour créer et démarrer automatiquement un nouveau cluster :

$ k3d cluster create
INFO[0000] Prep: Network                                
INFO[0000] Created network 'k3d-k3s-default'            
INFO[0000] Created image volume k3d-k3s-default-images  
INFO[0000] Starting new tools node...                   
INFO[0001] Creating node 'k3d-k3s-default-server-0'     
INFO[0001] Pulling image 'ghcr.io/k3d-io/k3d-tools:5.4.6' 
INFO[0002] Pulling image 'docker.io/rancher/k3s:v1.24.4-k3s1' 
INFO[0002] Starting Node 'k3d-k3s-default-tools'        
INFO[0008] Creating LoadBalancer 'k3d-k3s-default-serverlb' 
INFO[0009] Pulling image 'ghcr.io/k3d-io/k3d-proxy:5.4.6' 
INFO[0012] Using the k3d-tools node to gather environment information 
INFO[0012] HostIP: using network gateway 172.25.0.1 address 
INFO[0012] Starting cluster 'k3s-default'               
INFO[0012] Starting servers...                          
INFO[0012] Starting Node 'k3d-k3s-default-server-0'     
INFO[0016] All agents already running.                  
INFO[0016] Starting helpers...                          
INFO[0016] Starting Node 'k3d-k3s-default-serverlb'     
INFO[0022] Injecting records for hostAliases (incl. host.k3d.internal) and for 2 network members into CoreDNS configmap... 
INFO[0025] Cluster 'k3s-default' created successfully!  
INFO[0025] You can now use it like this:                
kubectl cluster-info

Le cluster sera nommé k3s-default lorsque vous exécutez la commande sans aucun argument. Définissez votre propre nom en l’incluant comme premier argument de la commande :

$ k3d cluster create demo
...

K3d modifie automatiquement votre fichier de configuration Kubernetes (.kube/config) pour inclure une connexion à votre nouveau cluster. Il marque la connexion comme la connexion par défaut afin kubectl Les commandes cibleront désormais votre environnement K3d.

$ kubectl cluster-info
Kubernetes control plane is running at https://0.0.0.0:42879
CoreDNS is running at https://0.0.0.0:42879/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://0.0.0.0:42879/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy

Fonctionnement docker ps montrera que deux conteneurs ont été démarrés, un pour K3s et un autre pour le proxy de K3d qui transfère le trafic vers votre cluster :

$ docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                             NAMES
9b6b610ad312   ghcr.io/k3d-io/k3d-proxy:5.4.6     "/bin/sh -c nginx-pr..."   3 minutes ago   Up 3 minutes   80/tcp, 0.0.0.0:42879->6443/tcp   k3d-k3s-default-serverlb
842cc90b78bf   rancher/k3s:v1.24.4-k3s1           "/bin/k3s server --t..."   3 minutes ago   Up 3 minutes                                     k3d-k3s-default-server-0

Utilisation de votre grappe

Utilisez les commandes Kubectl familières pour interagir avec votre cluster et déployer vos pods :

$ kubectl run nginx --image nginx:latest
pod/nginx created

$ kubectl expose pod/nginx --port 80 --type NodePort
service/nginx exposed

Pour accéder à votre serveur NGINX, recherchez d’abord l’adresse IP attribuée à votre nœud Kubernetes :

$ kubectl get nodes -o wide
NAME                       STATUS   ROLES                  AGE    VERSION        INTERNAL-IP   EXTERNAL-IP   OS-IMAGE   KERNEL-VERSION      CONTAINER-RUNTIME
k3d-k3s-default-server-0   Ready    control-plane,master   102s   v1.24.4+k3s1   172.27.0.2    <none>        K3s dev    5.4.0-125-generic   containerd://1.6.6-k3s1

La bonne IP à utiliser est 172.27.0.2.

Trouvez ensuite le NodePort attribué à votre nginx service:

$ kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP        5m49s
nginx        NodePort    10.43.235.233   <none>        80:31214/TCP   1s

Le numéro de port exposé est 31214. Faire une demande à 172.17.0.2:31214 devrait émettre la page d’accueil NGINX par défaut :

$ curl http://172.17.0.2:31214
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

Vous pouvez obtenir plus de conseils sur l’exposition des services et la configuration de la mise en réseau Ingress dans la documentation K3d.

Activation des indicateurs K3s

La cluster create La commande encapsule le processus de création de cluster K3s standard. Vous pouvez transmettre des arguments aux K3 en fournissant --k3s-arg drapeaux. La valeur de l’indicateur doit être un argument qui sera inclus lorsque K3d appellera le binaire K3s.

$ k3s cluster create --k3s-arg "--disable=traefik"

Cet exemple demande à K3s de désactiver son composant Traefik intégré.

Accéder aux services exécutés sur votre hôte

Certaines charges de travail que vous exécutez dans K3d peuvent avoir besoin d’accéder à des services déjà exécutés sur votre hôte Docker. K3d fournit un nom d’hôte appelé host.k3d.internal dans sa configuration DNS par défaut. Cela se résoudra automatiquement sur votre machine hôte. Vous pouvez référencer ce nom d’hôte spécial dans vos pods pour accéder aux bases de données existantes, aux partages de fichiers et à d’autres API exécutées en dehors de Kubernetes.

Utilisation d’images Docker locales

Votre cluster K3d/K3s ne peut pas accéder à vos images Docker locales. Le cluster et tous ses composants sont en cours d’exécution à l’intérieur Docker. Essayer d’utiliser une image privée qui n’existe que sur l’hôte échouera et signalera une erreur.

Il existe deux façons de résoudre ce problème : soit pousser votre image vers un registre, soit utiliser la fonctionnalité d’importation d’image de K3d pour copier une image locale dans votre cluster. La première méthode est généralement préférée car elle centralise votre stockage d’images et vous permet d’accéder aux images depuis n’importe quel environnement. Cependant, lorsque vous testez rapidement des modifications locales, vous souhaiterez peut-être importer directement une image que vous venez de créer :

$ k3d image import demo-image:latest

Cette commande fera demo-image:latest disponible dans votre cluster.

K3d peut également créer et exposer un registre d’images pour vous. Les registres sont mieux créés avec votre cluster car K3d peut alors configurer automatiquement l’accès au cluster :

$ k3d cluster create --registry-create demo-registry

Cela démarre un nouveau cluster avec un registre appelé demo-registry. Le registre s’exécutera dans son propre conteneur Docker. Vous pouvez découvrir le numéro de port sur lequel le registre est exposé en exécutant docker ps -f name=<cluster-name>-registry<cluster-name> est le nom de votre cluster. Pousser des images vers ce registre les rendra accessibles aux pods de votre cluster.

$ docker tag demo-image:latest k3d-demo-registry.localhost:12345/demo-image:latest
$ docker push k3d-demo-registry.localhost:12345/demo-image:latest

Vous pouvez également créer des registres à la demande, mais vous devrez reconfigurer manuellement votre cluster pour fournir les détails de connexion.

Arrêt de votre cluster

Votre cluster K3d fonctionnera en continu jusqu’à ce que vous l’arrêtiez vous-même. La cluster stop La commande arrête d’exécuter les conteneurs Docker tout en préservant les données de votre cluster :

$ k3d cluster stop k3s-default

Redémarrez votre cluster à l’avenir à l’aide de cluster start commande:

$ k3d cluster start k3s-default

Suppression de votre cluster

Vous pouvez supprimer un cluster à tout moment en exécutant le cluster delete commande et en fournissant son nom. Cela supprimera toute trace du cluster, en supprimant les conteneurs Docker et les volumes qui l’ont fourni. La suppression de tous vos clusters ramènera votre hôte à une table rase avec uniquement la CLI K3d installée.

$ k3d cluster delete k3s-default
INFO[0000] Deleting cluster 'k3s-default'               
INFO[0001] Deleting cluster network 'k3d-k3s-default'   
INFO[0001] Deleting 2 attached volumes...               
INFO[0001] Removing cluster details from default kubeconfig... 
INFO[0001] Removing standalone kubeconfig file (if there is one)... 
INFO[0001] Successfully deleted cluster k3s-default!

Le processus de suppression supprime automatiquement les références au cluster de votre Kubeconfig.

Sommaire

K3d vous permet d’exécuter un cluster Kubernetes conteneurisé. Il fournit un environnement K3s complet partout où Docker est disponible. K3d prend en charge plusieurs nœuds, intègre la prise en charge des registres d’images et peut être utilisé pour créer des clusters hautement disponibles avec plusieurs plans de contrôle.

Les développeurs exécutant déjà Docker peuvent utiliser K3d pour ajouter rapidement Kubernetes à leur environnement de travail. K3d est léger, facile à gérer et n’ajoute aucun autre service système à votre machine. Cela en fait un excellent choix pour une utilisation locale, mais sa dépendance à Docker signifie qu’il peut ne pas convenir aux hôtes de production où vous ne souhaitez pas ajouter une autre dépendance. D’autres distributions Kubernetes telles que Minikube, Microk8s et plain K3s sont toutes des alternatives viables.

★★★★★