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.
Sommaire
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
où <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.