J'ai déjà essayé OpenShift Origin 3.9 et Online. J'ai déployé une simple application php hello world sur OpenShift. Il a un service et une route.
Lorsque j'appelle la route, j'obtiens la sortie attendue avec Hello world et l'IP du pod. Appelons ce pod ip comme 1.1.1.1
J'ai maintenant déployé la même application avec un petit changement de texte avec la même étiquette sous le même service. Appelons ce pod ip comme 2.2.2.2
Je peux voir les deux pods s'exécuter dans un seul service. Maintenant, quand j'appelle la route, il montre toujours Podip 1.1.1.1 Mon itinéraire n'atteint jamais le deuxième pod.
Je crois comprendre que Route appellera le service et que le service équilibrera la charge entre les pods disponibles.
Mais cela ne se produit pas. Toute aide est appréciée.
4 Réponses :
Le comportement par défaut du routeur HAProxy est d'utiliser un cookie pour assurer un routage "collant". Cela permet aux sessions de rester avec le même pod. https://docs.openshift.com/container-platform/3.11 /architecture/networking/routes.html
Si vous définissez une annotation haproxy.router.openshift.io/disable_cookies sur l'itinéraire sur true , cela devrait désactiver ce comportement.
Je crois comprendre que Route appellera le service et que le service équilibrera la charge entre les pods disponibles.
En général, vos connaissances sont exactes. Testons-le sur votre environnement comme suit.
while :; do curl http://172.30.177.72:8080/index.html; sleep 1; done 1.1.1.1:8080 2.2.2.2:8080 1.1.1.1:8080 2.2.2.2:8080 ...
Session AffinityestNonecomme valeur par défaut, cela signifieround robinpour les requêtes.Vous pouvez vérifier l'accès aux requêtes de manière
round robinen bouclantcurlen surveillant lepodsutilisant le corps de réponseoc logsouindex.html(si le contenu est différent).# oc describe svc web Name: web Namespace: test Labels: app=web Annotations: openshift.io/generated-by=OpenShiftNewApp Selector: app=web,deploymentconfig=web Type: ClusterIP IP: 172.30.6.8 Port: 8080-tcp 8080/TCP TargetPort: 8080/TCP Endpoints: 1.1.1.1:8080,2.2.2.2:8080 Session Affinity: None Events: <none>blockquote>
Pour ceux qui sont venus ici à la recherche d'une solution; Les deux réponses de Daein Park et Will Gordon sont vraies.
Voici une simple capture:
Si vous appelez votre pod en externe, il passe du routeur au service en passant par le pod. Si l'annotation haproxy.router.openshift.io/disable_cookies n'est pas définie sur true sur le routeur, le service est toujours transféré vers le même pod.
De plus, après avoir désactivé le routage permanent avec l'annotation ci-dessus, vous pouvez sélectionner un algorithme d'équilibrage de charge avec:
haproxy.router.openshift.io/balance comme clé et l'un des [source, roundrobin, lessconn] comme valeur
Si vous appelez votre pod en interne depuis un autre pod. Cela va du service au pod. Le service effectue correctement l'équilibrage de charge circulaire avec la configuration par défaut.
Vous devriez donc:
(Testé sur OpenShift 4.2.28)
Les services n'équilibrent PAS la charge entre les pods, c'est complètement aléatoire. Cela nous a été confirmé par le support RedHat. De plus, les réponses ci-dessus ne font que des tests avec différents appels sur curl.
Si vous faites des appels ultérieurs sur le même curl, vous verrez que cela réutilise les connexions. Essayez simplement:
curl http://172.30.177.72:8080/index.html http://172.30.177.72:8080/index.html
Au lieu de faire une interation et vous verrez que le keep-alive réutilisera la connexion et vous finirez sur le même pod à chaque fois