es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema con la sonda de preparación del pod relacionado con la base de datos y el contenedor.

Tengo una aplicación implementada en Kubernetes. Aquí está el stack tecnológico:
Java 11, Spring Boot 2.3.x o 2.5.x, usando hikari 3.x o 4.x

Usando spring actuator para hacer una verificación de salud. Aquí está la configuración de liveness y readiness dentro del archivo application.yaml:

endpoint:
health:
group:
liveness:
include: ''
exclude:
– db
– readinessState
readiness:
include: '
'

Lo que hace si la base de datos está fuera de línea –

  1. Asegurarse de que liveness no se vea afectado, es decir, el contenedor de la aplicación debe seguir funcionando aunque haya un fallo en la base de datos.
  2. readiness se verá afectado, asegurándose de que no se permita tráfico al contenedor.

Configuración de liveness y readiness en la especificación del contenedor:

livenessProbe:
httpGet:
path: actuator/health/liveness
port: 8443
scheme: HTTPS
initialDelaySeconds: 30
periodSeconds: 30
timeoutSeconds: 5
readinessProbe:
httpGet:
path: actuator/health/readiness
port: 8443
scheme: HTTPS
initialDelaySeconds: 30
periodSeconds: 30
timeoutSeconds: 20

Mi aplicación se inició y se ejecutó bien durante unas pocas horas.

Lo que hice:

Apagué la base de datos.

Problema notado:

Cuando la base de datos está caída después de 90+ segundos, veo que se crean 3 pods adicionales. Cuando se describe un pod, veo que el estado y la condición son como sigue:

Status: Running
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True

Cuando enumero todos los pods en ejecución:

NAME READY STATUS RESTARTS AGE
application-a-dev-deployment-success-5d86b4bcf4-7lsqx 0/1 Running 0 6h48m
application-a-dev-deployment-success-5d86b4bcf4-cmwd7 0/1 Running 0 49m
application-a-dev-deployment-success-5d86b4bcf4-flf7r 0/1 Running 0 48m
application-a-dev-deployment-success-5d86b4bcf4-m5nk7 0/1 Running 0 6h48m
application-a-dev-deployment-success-5d86b4bcf4-tx4rl 0/1 Running 0 49m

Mi analogía / hallazgo:

Según la configuración de ReadinessProbe, se establece el periodSeconds en 30 segundos y el failurethreshold se establece en 3 según la documentación de K8s.

Según application.yaml, la comprobación de readiness incluye la comprobación de la base de datos, lo que significa que después de cada 30 segundos falla la comprobación de readiness. Cuando falla 3 veces, se cumple el failurethreshold y se generan nuevos pods.

La política de reinicio es la predeterminada – siempre.

Preguntas:

1) ¿Por qué giró nuevos pods?
2) ¿Por qué específicamente se generaron sólo 3 pods y no 1 o 2 o 4, o cualquier número?
3) ¿Tiene esto algo que ver con la restartpolicy?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai
    1. Los nuevos pods se crearon porque los pods existentes no pasaban la prueba de readinessProbe debido a que la base de datos estaba caída, la cual está incluida en la prueba de readiness. Esto evitó que se enviara tráfico a los pods existentes porque no se consideraron listos para servir solicitudes. El controlador de Kubernetes decidió entonces crear nuevos pods para reemplazar a los existentes que no superaban la prueba de readinessProbe.

    2. El controlador de Kubernetes pudo haber decidido crear tres nuevos pods en función del valor de replicas establecido en la configuración de implementación. Si replicas está establecido en tres, entonces el controlador intentará mantener siempre tres pods. Cuando los pods existentes no pasaban la prueba de readinessProbe, el controlador pudo haber determinado que necesitaba crear exactamente tres nuevos pods para reemplazarlos.

    3. La política de reinicio (restartPolicy) para la implementación está establecida en Always, lo que significa que si un pod se bloquea o termina por cualquier motivo, será reiniciado automáticamente por el controlador de Kubernetes. Sin embargo, esto no está directamente relacionado con el problema de los pods que se crearon debido a las pruebas de readinessProbe que fallaron.

Comments are closed.