Un sleep en preStop retrasa la señal SIGTERM para que el controlador de ALB Ingress pueda dar de baja el pod antes de su apagado.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un ACK managed cluster o ACK dedicated cluster (descontinuado) que ejecute Kubernetes 1.18 o posterior. Para actualizar, consulte Manually upgrade ACK clusters.
El ALB Ingress controller está instalado en el clúster.
Para usar un ALB Ingress con un clúster dedicado ACK, authorize the cluster primero para el controlador de ALB Ingress.
Funcionamiento
Ciclo de vida del pod
Un pod contiene dos tipos de contenedores:
Contenedor de inicialización: Se ejecuta antes del contenedor principal para realizar tareas de inicialización.
Contenedor principal: Ejecuta la aplicación. postStart se ejecuta después del inicio, las comprobaciones de liveness y readiness se ejecutan durante el tiempo de vida del contenedor, y preStop se ejecuta antes de la terminación.
La siguiente figura muestra el ciclo de vida del pod.
Por qué ocurren errores: dos procedimientos se ejecutan en paralelo
Eliminar un pod desencadena dos procedimientos paralelos —la terminación del pod y la actualización del enrutamiento de tráfico—, lo que provoca errores 502/504.
Procedimiento de terminación del pod
kube-apiserver marca el pod como
Terminating.El sistema ejecuta el hook preStop, si está configurado.
El clúster envía una señal SIGTERM al contenedor.
El sistema espera a que el contenedor se detenga o a que expire el período de gracia (
terminationGracePeriodSeconds, predeterminado: 30 segundos).Si el pod sigue ejecutándose después del período de gracia, kubelet espera 2 segundos adicionales y envía una señal SIGKILL.
Se elimina el pod.
Procedimiento de actualización de reglas de enrutamiento de tráfico
kube-apiserver marca el pod como
Terminating.El controlador de endpoints elimina la dirección IP del pod del endpoint.
El controlador de ALB Ingress reconcilia los servidores backend y elimina el endpoint del Service del grupo de servidores backend.
Dado que ambos procedimientos se ejecutan en paralelo, es posible que el controlador de ALB Ingress no termine la reconciliación antes de que el pod se apague, lo que dirige el tráfico a un pod en proceso de terminación.
Cómo evita errores un hook preStop
Sin un hook preStop, pueden ocurrir estos errores durante las actualizaciones continuas:
|
Código de estado |
Causa |
|
504 |
El pod estaba procesando una solicitud no idempotente cuando se terminó. |
|
502 |
El pod se apagó después de recibir SIGTERM, pero el controlador de ALB Ingress aún no lo había eliminado del grupo de servidores backend. |
Un hook preStop añade un retraso de sleep que comienza cuando kube-apiserver marca el pod como Terminating, lo que da tiempo al controlador de ALB Ingress para dar de baja el pod antes de que reciba SIGTERM.
Presupuesto de tiempo
El sleep de preStop y el apagado del contenedor comparten el mismo período de gracia (terminationGracePeriodSeconds). Con sleep 10 y un apagado del programa de 5 segundos, establezca terminationGracePeriodSeconds como mínimo en 15, más un margen de seguridad. Este tema utiliza sleep 10 y terminationGracePeriodSeconds: 45.
Si la duración de preStop más el tiempo de apagado del programa superaterminationGracePeriodSeconds, se agota el tiempo de espera del apagado controlado y kubelet envía SIGKILL después de una espera de 2 segundos. AumenteterminationGracePeriodSecondspara cubrir ambos procesos.
Paso 1: Desplegar la aplicación con un hook preStop
-
Cree
tea-service.yamlcon el siguiente contenido. El campolifecycle.preStopconfigura el 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 -
Despliegue el Deployment y el Service.
kubectl apply -f tea-service.yaml -
Cree
tea-ingress.yamlcon el siguiente contenido.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 -
Cree el Ingress.
kubectl apply -f tea-ingress.yaml -
Obtenga la dirección ALB del Ingress.
kubectl get ingressSalida esperada:
NAME CLASS HOSTS ADDRESS PORTS AGE tea-ingress alb demo.ingress.top alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com 80 7m5sTome nota del valor de
ADDRESSpara el siguiente paso.
Paso 2: Comprobar que el hook preStop evita interrupciones del servicio
-
Cree
test.shcon el siguiente contenido. El script envía una solicitud por segundo y registra cada código de estado 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 -
Ejecute el script.
bash test.sh -
Desencadene un reinicio continuo.
kubectl rollout restart deploy tea -
Supervise el progreso del despliegue. Las siguientes capturas de pantalla muestran los estados esperados de los pods durante cada fase de la actualización.




-
Revise el registro de la prueba. Todas las solicitudes deben devolver 200, lo que confirma cero interrupciones del servicio.
cat log.txtSalida esperada:

Siguientes pasos
Para enrutamiento avanzado, como redireccionamientos de HTTP a HTTPS y lanzamientos canary, consulte Advanced ALB Ingress configurations.
Para garantizar que los pods pasen las comprobaciones de readiness antes de recibir tráfico durante las actualizaciones continuas, consulte Use readiness gates to seamlessly launch pods that are associated with ALB Ingresses during rolling updates.
Si encuentra problemas, consulte ALB Ingress FAQ y ALB Ingress controller troubleshooting.