kubevpn

thumbernail Kubernetes

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 :

  1. 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.

  2. 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.

  3. 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.

  4. 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 technologies d'alter way