Aller au contenu

Kubernetes et les ingress Nginx

logo kubernetes

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

Terminal window
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 :

Terminal window
kubectl patch deployment ingress-nginx-controller -n ingress-nginx -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'

Vérifions

Terminal window
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
localhost.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-nginx
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/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 :

Terminal window
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/v1
kind: Ingress
metadata:
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 :

Terminal window
kubectl apply -f app-ingress.yml
kubectl get ingress
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
default app nginx monapp.robert.local 192.168.0.84 80 13m
kubectl describe ingress monapp
Name: app
Namespace: default
Address: 192.168.0.84
Default 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: /$1
Events:
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 :

Terminal window
curl -Lkv http://192.168.0.84/ -H 'monapp.robert.local'
Hello

C’est simple et efficace pour un environnement de Dev.

Source : https://moonstreet.nl/post/k3s-with-ingress/