Kubernetes et les ingress Nginx
C’est la suite du billet précédent qui parlait des sidecars Kubernetes que j’ai utilisé pour exposer une application Django (backend + statics). Maintenant que j’ai un service, je dois pouvoir y accéder depuis l’extérieur via une URL ou une IP. Je suis dans un contexte où mon cluster Kubernetes est autohébergé avec un seul node (dans une VM Linux sur mon poste de dev). Pour rappel, seul les plateformes Cloud propose des Load Balancers. Pour palier à ce problème, je vais tout simplement exposer le contrôleur de l’ingress Nginx sur le réseau de la machine hôte.
Installation de Nginx Ingress
Installons le gestionnaire d’Ingress Nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
Du classique, maintenant patchons le déploiement du contrôleur nginx :
kubectl patch deployment ingress-nginx-controller -n ingress-nginx -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'
Vérifions
kubectl get nodes -o wideNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIMElocalhost.localdomain Ready control-plane,master 28m v1.21.7+k3s1 192.168.0.84 <none> Oracle Linux Server 8.5 4.18.0-348.2.1.el8_5.x86_64 containerd://1.4.12-k3s1
kubectl get pod -n ingress-nginxNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod/ingress-nginx-controller-7b8bdb996c-5xzlc 1/1 Running 0 23m 192.168.0.84 localhost.localdomain <none> <none>
L’IP du contrôleur est bien celui du node. On peut vérifier que sur le node on a bien les ports 80 et 443 en écoute :
netstat -tlnp | grep -E '0.0.0.0:80|0.0.0.0:443'tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN -
Cool !
Déclaration d’un Ingress
Pour valider son fonctionnement je vais déclarer un ingress pour le service créé dans le billet précédent :
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: app annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1
spec: ingressClassName: nginx rules: - host: monapp.robert.local http: paths: - path: / pathType: Prefix backend: service: name: monapp-service port: number: 5000
On applique l’ingress :
kubectl apply -f app-ingress.yml
kubectl get ingressNAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGEdefault app nginx monapp.robert.local 192.168.0.84 80 13m
kubectl describe ingress monappName: appNamespace: defaultAddress: 192.168.0.84Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)Rules: Host Path Backends ---- ---- -------- monapp.robert.local / monapp-service:5000 (10.42.0.8:5000)Annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Sync 12m (x2 over 13m) nginx-ingress-controller Scheduled for sync
Un pti curl pour valider que cela fonctionne :
curl -Lkv http://192.168.0.84/ -H 'monapp.robert.local'
Hello
C’est simple et efficace pour un environnement de Dev.