For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/containers-orchestration/managed-kubernetes/sticky-session-nginx-ingress.md.

Sticky sessions/Session Affinity avec Nginx Ingress sur OVHcloud Managed Kubernetes

Voir en Markdown

Découvrez comment mettre en place et configurer les sticky sessions/session affinity avec Nginx Ingress sur OVHcloud Managed Kubernetes

Objectif

Les sticky sessions, ou session affinity, sont une fonctionnalité qui vous permet de maintenir une session active pendant une certaine durée. Dans un cluster Kubernetes, tout le trafic d'un client vers une application, même si vous passez de 1 à 3 réplicas ou plus, sera redirigé vers le même pod.

Dans ce tutoriel, nous allons :

  • déployer une application sur votre cluster OVHcloud Managed Kubernetes via un deployment comportant plusieurs réplicas
  • mettre en place un Nginx Ingress
  • déployer un Ingress pour configurer le Nginx Ingress Controller afin qu'il utilise les sticky sessions/session affinity
  • tester la session affinity

Avant de commencer

Ce tutoriel présuppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes opérationnel, ainsi que de connaissances de base sur son fonctionnement. Pour en savoir plus sur ces sujets, consultez le guide de démarrage rapide OVHcloud Managed Kubernetes Service.

Vous devez également avoir installé Helm sur votre poste de travail et sur votre cluster. Consultez pour cela le tutoriel Comment installer Helm sur OVHcloud Managed Kubernetes Service.

En pratique

Déployer l'application

Dans ce guide, vous allez déployer une application, en Golang, qui exécute un serveur HTTP et affiche le nom du pod.

Ce type d'application vous permettra de valider que Nginx Ingress maintient correctement la session.

Créez d'abord un fichier deployment.yml avec le contenu suivant :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: what-is-my-pod-deployment
  labels:
    app: what-is-my-pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: what-is-my-pod
  template:
    metadata:
      labels:
        app: what-is-my-pod
    spec:
      containers:
      - name: what-is-my-pod
        image: ovhplatform/what-is-my-pod:1.0.1
        ports:
        - containerPort: 8080
        env:
          - name: MY_POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name

Ce fichier manifeste de déploiement YAML définit que notre application, basée sur l'image ovhplatform/what-is-my-pod:1.0.1, sera déployée avec 3 réplicas (3 pods). Nous transmettons le nom du pod via une variable d'environnement afin de l'afficher dans notre application what-is-my-pod.

Créez ensuite un fichier svc.yml avec le contenu suivant pour définir notre service (un service expose un déploiement) :

apiVersion: v1
kind: Service
metadata:
  labels:
    app: what-is-my-pod
  name: what-is-my-pod
spec:
  ports:
  - port: 8080
  selector:
    app: what-is-my-pod

Appliquez les fichiers manifestes de déploiement et de service à votre cluster avec les commandes suivantes :

kubectl apply -f deployment.yml
kubectl apply -f svc.yml

La sortie devrait ressembler à ceci :

$ kubectl apply -f deployment.yml
deployment.apps/what-is-my-pod-deployment created

$ kubectl apply -f svc.yml
service/what-is-my-pod created

Vous pouvez vérifier que votre application fonctionne et que le service est créé en exécutant les commandes suivantes :

kubectl get pod -l app=what-is-my-pod
kubectl get svc -l app=what-is-my-pod

La sortie devrait ressembler à ceci :

$ kubectl get pod -l app=what-is-my-pod
NAME                                         READY   STATUS    RESTARTS   AGE
what-is-my-pod-deployment-78f7cd684f-5gtf9   1/1     Running   0          3m
what-is-my-pod-deployment-78f7cd684f-k2zpp   1/1     Running   0          3m
what-is-my-pod-deployment-78f7cd684f-xvwvh   1/1     Running   0          3m

$ kubectl get svc -l app=what-is-my-pod
NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
what-is-my-pod   ClusterIP   10.3.57.203   `<none>`        8080/TCP   3m35s

Installer le chart Helm du Nginx Ingress Controller

Pour ce tutoriel, nous utilisons le chart Helm du Nginx Ingress Controller disponible sur son propre dépôt Helm.

Le chart est entièrement configurable, mais nous utilisons ici la configuration par défaut.

Ajoutez le dépôt Helm Ingress Nginx :

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

Ces commandes vont ajouter le dépôt Helm Ingress Nginx à votre dépôt local de charts Helm et mettre à jour les dépôts de charts installés :

$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

helm repo update
"ingress-nginx" has been added to your repositories
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "nvidia" chart repository
...
...Successfully got an update from the "ingress-nginx" chart repository
...
Update Complete. ⎈Happy Helming!⎈

Installez la dernière version d'Ingress Nginx avec la commande helm install :

helm -n ingress-nginx install ingress-nginx ingress-nginx/ingress-nginx --create-namespace

Le processus d'installation démarre et un nouveau namespace ingress-nginx est créé.

$ helm -n ingress-nginx install ingress-nginx ingress-nginx/ingress-nginx --create-namespace
NAME: ingress-nginx
LAST DEPLOYED: Mon Jun 27 09:53:25 2022
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace ingress-nginx get services -o wide -w ingress-nginx-controller'

An example Ingress that makes use of the controller:
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: example
    namespace: foo
  spec:
    ingressClassName: nginx
    rules:
      - host: www.example.com
        http:
          paths:
            - pathType: Prefix
              backend:
                service:
                  name: exampleService
                  port:
                    number: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
      - hosts:
        - www.example.com
        secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

La création du LoadBalancer étant asynchrone, et le provisionnement du load balancer pouvant prendre plusieurs minutes, vous obtiendrez sûrement un EXTERNAL-IP à l'état <pending>.

Si vous réessayez quelques minutes plus tard, vous devriez obtenir un EXTERNAL-IP :

$ kubectl get svc -n ingress-nginx ingress-nginx-controller
NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)                      AGE
ingress-nginx-controller   LoadBalancer   10.3.232.157   152.228.168.132   80:30903/TCP,443:31546/TCP   19h

Vous pouvez ensuite accéder à votre nginx-ingress via http://[YOUR_LOAD_BALANCER_IP] en HTTP ou https://[YOUR_LOAD_BALANCER_IP] en HTTPS.

Configurer le Nginx Ingress Controller pour utiliser les sticky sessions/session affinity

À cette étape, vous devez déployer une ressource Ingress et la configurer pour utiliser les sticky sessions.

Créez un fichier ingress-session-affinity.yml avec le contenu suivant :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "stickounet"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
  name: ingress
  namespace: default
spec:
  rules:
  - http:
      paths:
      - backend:
          service:
            name: what-is-my-pod
            port:
              number: 8080
        path: /
        pathType: Prefix

Dans ce fichier manifeste, vous pouvez voir que nous définissons une ressource Nginx Ingress avec plusieurs annotations. Pour plus d'informations sur ces annotations, consultez la documentation du Nginx Ingress Controller.

Appliquez le fichier manifeste de l'ingress à votre cluster avec la commande suivante :

kubectl apply -f ingress-session-affinity.yml

La sortie devrait ressembler à ceci :

$ kubectl apply -f ingress-session-affinity.yml
ingress.networking.k8s.io/ingress created

Vous avez mis en place et configuré une ressource Ingress Kubernetes qui maintiendra les sessions pour les utilisateurs, comme illustré ci-dessous :

Schéma des sticky sessions sur Kubernetes

Tester la session affinity

La dernière étape de ce guide consiste à accéder à notre application et à tester la session affinity.

Exécutez la commande suivante pour récupérer l'IP du Load Balancer créé par le Nginx Ingress Controller :

kubectl get svc -n ingress-nginx ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}'

Vous devriez obtenir une IP de Load Balancer semblable à celle-ci :

$ export INGRESS_URL=$(kubectl get svc -n ingress-nginx ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

echo http://$INGRESS_URL
http://152.228.168.143

Vous pouvez maintenant accéder à cette IP via votre navigateur préféré et recharger la page plusieurs fois :

session affinity

À chaque rechargement de la page, vous devriez obtenir la même valeur de cookie, ce qui signifie que l'Ingress vous redirige vers le même pod.

Vous pouvez également tester ce comportement avec la commande curl comme ceci :

curl --cookie cookie.txt --cookie-jar cookie.txt http://$INGRESS_URL

Vous pouvez exécuter la même commande plusieurs fois dans une boucle pour valider que la session est correctement maintenue :

$ for i in {0..5}
do
  curl --cookie cookie.txt --cookie-jar cookie.txt http://$INGRESS_URL
  echo ""
done

Hello "what-is-my-pod-deployment-78f7cd684f-xvwvh"!
Hello "what-is-my-pod-deployment-78f7cd684f-xvwvh"!
Hello "what-is-my-pod-deployment-78f7cd684f-xvwvh"!
Hello "what-is-my-pod-deployment-78f7cd684f-xvwvh"!
Hello "what-is-my-pod-deployment-78f7cd684f-xvwvh"!
Hello "what-is-my-pod-deployment-78f7cd684f-xvwvh"!
Info

L'astuce en utilisant curl avec des cookies consiste à stocker le cookie reçu dans un fichier et à relire les cookies de ce fichier ultérieurement.

Aller plus loin

  • Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.

  • Échangez avec notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?