Kubernetes - Exposer les services avec un serveur HAPROXY

Pour exposer les services du cluster, j’utilise un serveur “Haproxy”, externe au cluster, qui fait partie de la famille des “reverse-proxy”. Je ne vais rentrer dans le détail, vous trouverez toute la documentation nécessaire pour son implémentation sur internet. Une fois installé, le “reverse-proxy” sera la point d’entrée qui permettra l’accès aux application.

exposer ses services

Pour obtenir le port du service dans kubernetes, se connecter au master :

kubeclt get service -n [namespace] [nom du service]
# ex : kubectl get service -n nextcloud nextcloud
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nextcloud           NodePort    10.107.203.125   <none>        80:31812/TCP   63d

Ici et dans ce cas précis, le service est exposé sur le port 31812 de chaque serveur “worker” qui exécute l’application (voir le schéma ci-avant). Un Pod est exécuté sur un worker et ce choix n’est pas prédictible, sauf si vous l’avez forcé (notion de NodeSelector), par conséquent, votre règle Haproxy devra spécifier l’ensemble des workers disponibles dans le cluster, haproxy fera le reste…

Exemple de configuration haproxy

J’ai un service “nextcloud”, un seul réplica et deux workers (192.168.1.12 et 192.168.1.13). Un des deux serveurs exécute le pod, je ne sais pas lequel :

[...]
frontend 192.168.1.10:443https  
    acl nextcloud.mondomaine.comssl  hdr(host) -i nextcloud.mondomaine.com  
    use_backend nextcloud.mondomaine.comssl if nextcloud.mondomaine.comssl  
    backend nextcloud.mondomaine.comssl  
        mode http  
        enabled  
        balance leastconn
        server worker1 192.168.1.12:[Port exposé par le cluster] check maxconn 500  
        server worker2 192.168.1.13:[Port exposé par le cluster] check maxconn 500
[...]

Haproxy testera la connexion des backend et enverra le flux externe vers le serveur qui répond.