KubeVPN : Votre Environnement de Développement Cloud Natif Connecté à Kubernetes
KubeVPN est un outil puissant qui transforme la façon dont les développeurs interagissent avec les environnements Kubernetes. Il offre un environnement de développement cloud natif qui se connecte de manière transparente au réseau de votre cluster Kubernetes. Avec KubeVPN, vous pouvez accéder aux ressources de votre cluster Kubernetes directement depuis votre machine locale, simplifiant considérablement le développement et le débogage d'applications cloud natives.
Les Défis du Développement Cloud Natif
Le développement d'applications pour Kubernetes peut être complexe. Traditionnellement, les développeurs sont confrontés aux défis suivants :
- Difficulté d'accès aux ressources du cluster : Accéder aux services et pods du cluster Kubernetes nécessite souvent des configurations complexes et des redirections de ports.
- Environnement de développement non cohérent : Les environnements locaux peuvent différer significativement de ceux du cluster, ce qui peut entraîner des problèmes d'intégration et de déploiement.
- Complexité du débogage : Le débogage d'applications exécutées dans le cluster Kubernetes peut être difficile, car il faut souvent se connecter aux pods et analyser les journaux à distance.
KubeVPN répond à ces défis en fournissant une connexion directe et cohérente au réseau Kubernetes, permettant aux développeurs de travailler plus efficacement.
Comment KubeVPN Simplifie le Développement Kubernetes
KubeVPN offre une approche innovante pour le développement cloud natif, en établissant un tunnel sécurisé entre votre machine locale et votre cluster Kubernetes. Voici les fonctionnalités clés qui rendent KubeVPN si utile :
1. Connexion au Réseau Kubernetes
KubeVPN vous permet de vous connecter au réseau de votre cluster Kubernetes en utilisant la commande kubevpn connect
. Cette commande crée un tunnel et ajoute une route vers une interface virtuelle, comme tun0
, redirigeant le trafic vers un gestionnaire de trafic distant. Vous pouvez alors accéder aux ressources du cluster à l'aide des noms de service ou des adresses IP des pods/services.
Un mot de passe administrateur est requis pour créer le tunnel.
kubevpn connect
Résultat
...
+----------------------------------------------------------+
| Now you can access resources in the kubernetes cluster ! |
+----------------------------------------------------------+
Après la connexion, vous pouvez vérifier l'état de la connexion avec la commande kubevpn status
:
kubevpn status
Exemple de résultat :
ID Mode Cluster Kubeconfig Namespace Status Netif
0 full k8s-train /Users/hleclerc/.kube/config default Connected utun7
Deployons juste un nginx via helm
helm install hello-world oci://ghcr.io/herveleclerc/hello-world --version 0.1.0
Résultat
Pulled: ghcr.io/herveleclerc/hello-world:0.1.0
Digest: sha256:5eba2624abeeebb332c06c08e4ccb3015d6a449272bc937f877b7711b128ae68
NAME: hello-world
LAST DEPLOYED: Thu Dec 19 09:54:21 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=hello-world,app.kubernetes.io/instance=hello-world" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
Regardons le pod déployé par kubevpn et helm
kubectl get svc,po -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/hello-world ClusterIP 10.0.145.54 <none> 80/TCP 3m48s app.kubernetes.io/instance=hello-world,app.kubernetes.io/name=hello-world
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 241d <none>
service/kubevpn-traffic-manager ClusterIP 10.0.123.176 <none> 8422/UDP,10800/TCP,9002/TCP,80/TCP,53/UDP 115s app=kubevpn-traffic-manager
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/hello-world-57f994fd7d-j8th6 1/1 Running 0 3m48s 10.224.0.102 aks-agentpool-35883522-vmss00001g <none> <none>
pod/kubevpn-traffic-manager-8556f588c8-749bf 3/3 Running 0 114s 10.224.0.116 aks-agentpool-35883522-vmss00001g <none> <none>
Vous pouvez tester la connexion en utilisant ping
avec l'adresse IP d'un pod :
ping 10.224.0.116
Vous pouvez aussi tester la connexion en utilisant curl
avec l'adresse IP d'un service:
curl 10.224.0.102
KubeVPN prend en charge la résolution des noms DNS Kubernetes, vous pouvez donc accéder à un service nommé hello-world
dans l'espace de noms default
en utilisant les noms suivants:
* hello-world
* hello-world.default
* hello-world.default.svc.cluster.local
Vous pouvez même utiliser le nom court de domaine comme productpage
.
curl hello-world 1 # Nom court
curl hello-world.default.svc.cluster.local
Important : La résolution des noms courts ne fonctionne que dans l'espace de noms où kubevpn-traffic-manager
est déployé.
2. Interception du Trafic Inbound
KubeVPN permet également d'intercepter le trafic entrant des services Kubernetes et de le rediriger vers votre machine locale. Cette fonctionnalité est particulièrement utile pour le débogage et le développement, car elle vous permet de tester localement vos modifications tout en les intégrant dans l'environnement Kubernetes.
Vous pouvez utiliser la commande kubevpn proxy
pour intercepter le trafic entrant d'un déploiement spécifique, par exemple productpage
:
kubevpn proxy deployment/hello-world
Vous pouvez même définir une règle pour que seul le trafic avec un header spécifique soit redirigé vers votre machine locale, par exemple, avec le header app=monapp
.
kubevpn proxy deployment/hello-world --headers app=monapp
Pour annuler le proxy, vous pouvez utiliser la commande kubevpn leave
:
kubevpn leave deployment/hello-world
Plus d'informations ici : reverse proxy
3. Modes de Connexion
KubeVPN propose différents modes de connexion pour s'adapter à vos besoins :
- Mode Connect : Crée un tunnel simple pour connecter votre machine locale au cluster Kubernetes.
- Mode Reverse : Injecte un conteneur sidecar dans le contrôleur, bloque le trafic entrant et le redirige vers votre machine locale via un tunnel.
- Mode Mesh : Utilise Envoy comme proxy. Si les headers contiennent une clé-valeur spéciale, le trafic est routé vers la machine locale, sinon, il est routé vers le service d'origine.
- Mode Lite : (
--lite=true
) Permet de se connecter à plusieurs clusters Kubernetes simultanément, conçu pour la connexion à plusieurs réseaux de clusters. - Mode Full : Par défaut, (
--lite=false
) Permet de se connecter à un réseau de clusters et prend également en charge le proxy du trafic entrant vers votre machine locale.
Vous pouvez vous connecter à plusieurs clusters en utilisant les modes lite
et full
:
# Se connecter à 2 clusters en mode lite
kubevpn connect
kubevpn status
kubevpn connect -n default --kubeconfig ~/.kube/dev_config --lite
L'état des connexions sera alors mis à jour en conséquence:
ID Mode Cluster Kubeconfig Namespace Status
0 full k8s-train /Users/hleclerc/.kube/config default Connected
1 lite k8s-dev /Users/hleclerc/.kube/dev_config default Connected
4. Mode Développement Local avec Docker
KubeVPN va encore plus loin en permettant d'exécuter vos pods Kubernetes dans des conteneurs Docker locaux. Cela vous garantit un environnement de développement identique à celui du cluster, avec les mêmes variables d'environnement, volumes et configuration réseau.
J'utilise limactl
Voici un exemple de commande pour lancer le mode développement :
kubevpn dev deployment/hello-world --entrypoint sh
Cette commande : * Connecte votre machine locale au réseau du cluster. * Injecte un sidecar pour intercepter le trafic entrant. * Lance un conteneur Docker avec l'image de votre pod.
Vous pouvez utiliser localhost:port
pour accéder à votre conteneur. L'environnement, le volume et le réseau sont les mêmes que dans le pod Kubernetes distant.
Vous pouvez choisir de ne pas utiliser de proxy:
kubevpn dev deployment/hello-world --no-proxy
Vous pouvez aussi utiliser un image docker spécifique et un point d'entrée particulier:
kubevpn dev deployment/hello-world --dev-image [docker registry]/[namespace]/[repo]:[tag] --entrypoint /bin/bash
KubeVPN prend en charge le Docker in Docker (DinD).
docker run -it --privileged --sysctl net.ipv6.conf.all.disable_ipv6=0 -v /var/run/docker.sock:/var/run/docker.sock -v /tmp:/tmp -v ~/.kube/config:/root/.kube/config --platform linux/amd64 naison/kubevpn:latest
5. Prise en Charge des Protocoles Multiples
KubeVPN supporte les couches 3 et supérieures du modèle OSI, comme ICMP, TCP, UDP, gRPC, WebSocket et HTTP.
6. Installation Facile
KubeVPN peut être installé de différentes manières :
* Avec brew
(macOS/Linux) : brew install kubevpn
.
* Avec scoop
(Windows) : scoop bucket add extras && scoop install kubevpn
.
* Avec krew
(Windows/macOS/Linux) : kubectl krew index add kubevpn https://github.com/kubenetworks/kubevpn.git && kubectl krew install kubevpn/kubevpn && kubectl kubevpn
.
* Via une release GitHub.
Vous pouvez également installer l'application de démo Bookinfo:
kubectl apply -f https://raw.githubusercontent.com/kubenetworks/kubevpn/master/samples/bookinfo.yaml
Vous pouvez nettoyer après le test en utilisant la commande:
kubectl delete -f https://raw.githubusercontent.com/kubenetworks/kubevpn/master/samples/bookinfo.yaml
Exemples d'Utilisation Concrets
Voici quelques exemples d'utilisation qui illustrent la puissance de KubeVPN :
-
Développement et débogage local : Vous pouvez exécuter votre application dans un conteneur Docker local, mais connecté au réseau Kubernetes grâce à KubeVPN. Cela vous permet de déboguer votre application dans un environnement identique à celui de production.
-
Test de modifications en temps réel : Vous pouvez intercepter le trafic entrant vers un service Kubernetes et le rediriger vers votre machine locale. Cela vous permet de tester rapidement les modifications de votre code sans avoir à redéployer l'application dans le cluster.
-
Accès facile aux API Kubernetes : Vous pouvez utiliser les outils en ligne de commande Kubernetes comme
kubectl
directement depuis votre machine locale, sans avoir à configurer des tunnels ou des redirections de ports complexes. -
Collaboration simplifiée : Les membres de votre équipe peuvent utiliser KubeVPN pour accéder au même environnement de développement, réduisant ainsi les problèmes de compatibilité et de configuration.
FAQ
Vos sources répondent également à certaines questions fréquentes :
* Si l'image Docker ne peut pas être téléchargée ou si l'environnement interne ne peut pas accéder à docker.io
:
* Transférer l'image dans votre propre registre privé et utiliser l'option --image
.
* Utiliser l'option --transfer-image
pour transférer automatiquement l'image vers l'adresse spécifiée par l'option --image
.
* Si vous obtenez l'erreur 137 lors de l'utilisation de kubevpn dev
, il peut s'agir d'une insuffisance de ressources allouées par Docker Desktop. Augmentez la mémoire dans les paramètres de Docker Desktop.
* Si vous utilisez Docker dans WSL (Windows Subsystem for Linux) et que la connexion au cluster ne fonctionne pas, vous pouvez installer Docker dans WSL, utiliser kubevpn connect
sur Windows, ou utiliser l'option --network container:$CONTAINER_ID
lors de l'utilisation de kubevpn dev
.
* Si vous obtenez l'erreur 172.17.0.1:443 connect refusued
lors de l'accès à l'api Kubernetes, cela peut être dû à un conflit entre le sous-réseau de Kubernetes et celui de Docker. Utilisez l'option --connect-mode container
avec kubevpn dev
ou modifiez le fichier ~/.docker/daemon.json
en ajoutant un sous-réseau qui ne sera pas en conflit, par exemple: "bip": "172.15.0.1/24"
.
Conclusion
KubeVPN est un outil indispensable pour tout développeur travaillant avec Kubernetes. Il simplifie l'accès aux ressources du cluster, permet de tester facilement les modifications locales et offre un environnement de développement cohérent. Si vous développez des applications cloud natives, vous devriez absolument essayer KubeVPN !
Ce billet de blog a exploré les principales fonctionnalités de KubeVPN, en s'appuyant sur les informations fournies dans vos sources. J'espère qu'il vous sera utile et vous encouragera à adopter cet outil pour améliorer votre productivité.
Découvrez les derniers articles d'alter way
- kubevpn
- Kubernetes 1.32
- re:Invent 2024 : AWS mise tout sur l'IA pour son Cloud
- OVHcloud Summit 2024 : L’innovation au cœur d’un cloud souverain et performant
- Big Data & AI Paris 2024 : L'IA au cœur de toutes les transformations.
- Un retour vers l'open-source ? Vos outils DevOps préférés et leurs equivalents open-source.