0
votes

Affinité de session inter-cluster du moteur Google Kubernetes (Sticky Session)

La situation est que j'ai 2 applications: A et B qui sont dans le même espace de noms d'un cluster sur gke. A est sur 1 pod et B sur 2 pods.

Chaque fois qu'un client communique avec notre service. Il se connecte d'abord sur A avec des websockets. A envoie ensuite une requête http à B. Puisqu'il y a 2 pods de B, je voudrais avoir une affinité de session entre le client de l'extérieur et avec mon application B afin que chaque fois qu'un client se connecte à A, il traitera toujours ses demandes via le même gousse de B.

Chaque option d'affinité de session que j'ai vue est basée sur la passerelle ou les services Ingress, mais comme je suis déjà dans le cluster, je n'ai pas besoin d'une entrée.

J'ai également vu qu'il existe des services qui fournissent un support pour les cookies http. Ce serait bien mais c'est toujours un service externe comme Nginx ou Istio et comme je travaille dans un environnement de développement très restreint, c'est un peu pénible d'ajouter ces services dans le cluster.

Y a-t-il quelque chose de natif de gke qui peut me fournir une affinité de session de cookie http ou quelque chose de similaire?


0 commentaires

3 Réponses :


0
votes

Chaque fois qu'un client communique avec notre service. Il se connecte d'abord sur A avec des websockets. A envoie ensuite une requête http à B. Puisqu'il y a 2 pods de B, je voudrais avoir une affinité de session entre le client de l'extérieur et avec mon application B afin que chaque fois qu'un client se connecte à A, il traitera toujours ses demandes via le même gousse de B.

A communique avec B. A doit se connecter à une instance spécifique de B en fonction de l'utilisateur final connecté à B.

Il s'agit de partitionnement et non d ' affinité de session mais je comprends ce que vous voulez dire. Cela signifie que votre service B a besoin d'une identité réseau stable.

Partage par identité utilisateur

Le service B doit être déployé en tant que StatefulSet < / a> pour obtenir une identité réseau stable. Ensuite, le service A peut effectuer un partage , par exemple basé sur nom d'utilisateur ou une plage d'adresses IP ou quelque chose, les demandes pour l ' utilisateur X sont toujours traitées par l'instance Y .

Avec le service B déployé en tant que StatefulSet, les instances seront nommées par ex. app-b-0 et app-b-1 afin que chaque instance puisse être adressée à partir du service A avec une identité stable.


3 commentaires

La deuxième demande est de A à B (dans le même cluster). La seule demande provenant de l'extérieur du cluster utilisant une entrée est la connexion initiale à A par websockets


J'ai vu le lien que vous avez envoyé dans votre réponse. J'ai déjà essayé de l'implémenter et cela n'a pas fonctionné, mais après avoir examiné plus en détail, je pense que cela n'est pas destiné à GKE mais plus à une autre partie de la plate-forme cloud Google.


Oui, l'équilibreur de charge est en dehors de GKE, mais utilise des objets Ingress



0
votes

Vous auriez pu définir l'affinité de session basée sur l'adresse IP du client, ce qui se produit au niveau du service, comme celui-ci:

apiVersion: v1
kind: Service
metadata:
  name: svc-sa
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: nginx
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600

Donc, ce service acheminerait la demande vers le même backend (Pod), en fonction de l'adresse IP source si la demande.

Vous devez quand même définir un service devant l'application B ciblant les deux pods. Maintenant, le problème ici est que votre application A agit en tant que proxy, donc toutes les requêtes seront prises en compte à partir de l'application A.

Je sais que c'est maintenant une réponse complète, mais vous pourrez peut-être faire quelque chose dans l'application A, par en-tête (X-Forwarded-For), pour contourner l'adresse IP du pod A, par l'adresse IP de la demande d'origine.


2 commentaires

L'affinité ClientIP ne fonctionnerait pas dans mon environnement car il existe de nombreuses couches de proxy et de sécurité entre le client et A. Faire de l'IP non pas l'IP du client mais l'ip du proxy


Ouais, c'était aussi mon point, à moins que vous ne puissiez conserver l'adresse IP du client d'origine. Avec les cookies, vous devez obtenir une entrée.