Une mise en veille preStop retarde l'envoi du signal SIGTERM afin que le contrôleur ALB Ingress puisse désinscrire le pod avant son arrêt.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster ACK managé ou un cluster ACK dédié (obsolète) exécutant Kubernetes 1.18 ou une version ultérieure. Pour mettre à niveau, consultez la rubrique Mettre à niveau manuellement les clusters ACK.
Le contrôleur ALB Ingress est installé dans le cluster.
Pour utiliser un ALB Ingress avec un cluster ACK dédié, autorisez le cluster pour le contrôleur ALB Ingress au préalable.
Fonctionnement
Cycle de vie d'un pod
Un pod contient deux types de conteneurs :
Conteneur d'initialisation : s'exécute avant le conteneur principal pour l'initialisation.
Conteneur principal : exécute l'application. Le hook postStart s'exécute après le démarrage, les vérifications de vitalité (liveness) et de disponibilité (readiness) s'exécutent pendant la durée de vie du conteneur, et le hook preStop s'exécute avant l'arrêt.
La figure suivante illustre le cycle de vie d'un pod.
Causes des erreurs : exécution parallèle de deux procédures
La suppression d'un pod déclenche deux procédures parallèles — l'arrêt du pod et la mise à jour du routage du trafic — ce qui provoque des erreurs 502 ou 504.
Procédure d'arrêt du pod
kube-apiserver marque le pod comme étant en état
Terminating.Le système exécute le hook preStop, s'il est configuré.
Le cluster envoie un signal SIGTERM au conteneur.
Le système attend l'arrêt du conteneur ou l'expiration de la période de grâce (
terminationGracePeriodSeconds, par défaut : 30 secondes).Si le pod est toujours en cours d'exécution après la période de grâce, kubelet attend 2 secondes supplémentaires puis envoie un signal SIGKILL.
Le pod est supprimé.
Procédure de mise à jour des règles de routage du trafic
kube-apiserver marque le pod comme étant en état
Terminating.Le contrôleur d'endpoint supprime l'adresse IP du pod de l'endpoint.
Le contrôleur ALB Ingress réconcilie les serveurs backend et supprime l'endpoint du service du groupe de serveurs backend.
Étant donné que ces deux procédures s'exécutent en parallèle, il est possible que le contrôleur ALB Ingress ne termine pas la réconciliation avant l'arrêt du pod, ce qui entraîne le routage du trafic vers un pod en cours d'arrêt.
Comment un hook preStop permet d'éviter les erreurs
En l'absence de hook preStop, les erreurs suivantes peuvent survenir lors des mises à jour progressives :
| Code d'état | Cause |
|---|---|
| 504 | Le pod traitait une requête non idempotente au moment de son arrêt. |
| 502 | Le pod s'est arrêté après avoir reçu le signal SIGTERM, mais le contrôleur ALB Ingress ne l'avait pas encore retiré du groupe de serveurs backend. |
Un hook preStop ajoute un délai de mise en veille qui démarre lorsque kube-apiserver marque le pod comme étant en état Terminating, offrant ainsi au contrôleur ALB Ingress le temps nécessaire pour désinscrire le pod avant qu'il ne reçoive le signal SIGTERM.
Budget temporel
La mise en veille preStop et l'arrêt du conteneur partagent la même période de grâce (terminationGracePeriodSeconds). Avec une commande sleep 10 et un temps d'arrêt du programme de 5 secondes, définissez terminationGracePeriodSeconds à au moins 15, plus une marge de sécurité. Cette rubrique utilise sleep 10 et terminationGracePeriodSeconds: 45.
Si la durée du preStop ajoutée au temps d'arrêt du programme dépasseterminationGracePeriodSeconds, l'arrêt gracieux expire et kubelet envoie un signal SIGKILL après une attente de 2 secondes. Augmentez la valeur determinationGracePeriodSecondspour couvrir les deux durées.
Étape 1 : Déployer l'application avec un hook preStop
-
Créez le fichier
tea-service.yamlavec le contenu suivant. Le champlifecycle.preStopconfigure le hook.apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 3 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 lifecycle: preStop: # Delay SIGTERM by 10 seconds to allow the ALB Ingress controller exec: # to finish deregistering the pod from the backend server group. command: - /bin/sh - -c - "sleep 10" terminationGracePeriodSeconds: 45 # Must exceed preStop duration + program shutdown time. --- apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: NodePort -
Déployez le Deployment et le Service.
kubectl apply -f tea-service.yaml -
Créez le fichier
tea-ingress.yamlavec le contenu suivant.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.ingress.top http: paths: - path: / pathType: Prefix backend: service: name: tea-svc port: number: 80 -
Créez l'Ingress.
kubectl apply -f tea-ingress.yaml -
Récupérez l'adresse ALB de l'Ingress.
kubectl get ingressRésultat attendu :
NAME CLASS HOSTS ADDRESS PORTS AGE tea-ingress alb demo.ingress.top alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com 80 7m5sNotez la valeur
ADDRESSpour l'étape suivante.
Étape 2 : Vérifier que le hook preStop empêche les interruptions de service
-
Créez le fichier
test.shavec le contenu suivant. Ce script envoie une requête par seconde et consigne chaque code d'état HTTP.#!/bin/bash HOST="demo.ingress.top" DNS="alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com" # Replace with your ADDRESS value. printf "Response Code|| TIME \n" >> log.txt while true; do RESPONSE=$(curl -H Host:$HOST -s -o /dev/null -w "%{http_code}" -m 1 http://$DNS/) TIMESTAMP=$(date +%Y-%m-%d_%H:%M:%S) echo "$TIMESTAMP - $RESPONSE" >> log.txt sleep 1 done -
Exécutez le script.
bash test.sh -
Déclenchez un redémarrage progressif.
kubectl rollout restart deploy tea -
Surveillez la progression du déploiement. Les captures d'écran suivantes montrent les états attendus des pods durant chaque phase de la mise à jour.




-
Vérifiez le journal de test. Toutes les requêtes doivent retourner le code 200, confirmant l'absence d'interruption de service.
cat log.txtRésultat attendu :

Étapes suivantes
Pour des configurations de routage avancées, telles que les redirections HTTP vers HTTPS et les versions Canary, consultez la rubrique Configurations avancées d'ALB Ingress.
Pour garantir que les pods passent les vérifications de disponibilité (readiness) avant de recevoir du trafic lors des mises à jour progressives, consultez la rubrique Utiliser des portes de disponibilité pour lancer transparentement les pods associés aux ALB Ingresses lors des mises à jour progressives.
En cas de problème, consultez la FAQ sur ALB Ingress et la rubrique Dépannage du contrôleur ALB Ingress.