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