Recuerda los problemas causados por un chequeo de salud de k8s

fondo del problema

¡El teléfono móvil recibió un mensaje de texto de advertencia y la interfaz del entorno en línea es anormal! ! ! El contenido de la alarma es que cierto código de estado de API de servicio externo es anormal y el código de estado es 500. El bueno fue a la plataforma PaaS (KuberSphere) para verificar la primera reacción y descubrió que un módulo del servicio se estaba reiniciando y continuó reiniciando después del reinicio. En ese momento, se recibió otro mensaje de recuperación de alarma (alrededor de un minuto después del mensaje de alarma) y el código de estado era 200. . . Este artículo trata este tema.

control de salud k8s

sonda k8s

Las sondas k8s son diagnósticos periódicos realizados por kubelet en contenedores. Para realizar diagnósticos, el kubelet llama al controlador implementado por el contenedor . Hay tres tipos de manipuladores:

  • ExecAction : ejecuta el comando especificado dentro del contenedor. El diagnóstico se considera exitoso si el comando sale con un código de retorno de 0.
  • CPSocketAction : realiza una verificación de TCP con la dirección IP del contenedor en el puerto especificado. El diagnóstico se considera exitoso si el puerto está abierto.
  • HTTPGetAction : realiza una solicitud HTTP Get a la dirección IP del contenedor en el puerto y la ruta especificados. Un diagnóstico se considera exitoso si la respuesta tiene un código de estado mayor o igual a 200 y menor a 400.

sonda de control de estado k8s

  • livenessProbe (sonda de supervivencia) : se utiliza para determinar si el contenedor está vivo (estado de ejecución). Si la sonda livenessProbe detecta que el contenedor no está en buen estado, el kubelet "matará" el contenedor y realizará el procesamiento correspondiente de acuerdo con la estrategia de reinicio del contenedor. . Si un contenedor no contiene una sonda livenessProbe, kubelet cree que el valor devuelto por la sonda livenessProbe del contenedor siempre será Correcto.
  • readinessProbe (sonda de preparación) : se utiliza para determinar si el servicio del contenedor está disponible (estado Listo) y el Pod que alcanza el estado Listo puede recibir solicitudes. Para el Pod administrado por el Servicio, la relación entre el Servicio y el PodEndpoint también se establecerá en función de si el Pod está Listo. Si el estado Listo se vuelve Falso durante el proceso en ejecución, el sistema lo aislará automáticamente de la lista de Endpoints del backend del Servicio y luego agregará el Pod restaurado al estado Listo nuevamente a la lista de Endpoints del backend.
  • startupProbe (sondeo de inicio) : si se configura startupProbe, se prohibirán otros sondeos hasta que tenga éxito, y no se realizarán más sondeos después del éxito. Es más adecuado para escenarios donde el tiempo de inicio del contenedor es largo. Requiere kubernetes versión v1.18 o superior.

identificar el problema

Los controles de salud que configuramos son los siguientes:

livenessProbe:
  httpGet:
    path: /actuator/health
    port: 8080
    scheme: HTTP
  initialDelaySeconds: 90
  timeoutSeconds: 3
  periodSeconds: 10
  successThreshold: 1
  failureThreshold: 3
readinessProbe:
  httpGet:
    path: /actuator/health
    port: 8080
    scheme: HTTP
  initialDelaySeconds: 90
  timeoutSeconds: 3
  periodSeconds: 10
  successThreshold: 1
  failureThreshold: 3
复制代码

Aquí hay algunos significados de configuración de la siguiente manera:

configuración significado
httpObtener.ruta obtener ruta de solicitud
httpObtener.puerto obtener puerto de solicitud
httpGet.esquema obtener protocolo de solicitud
segundos de retardo inicial Retraso inicial, en segundos, cuánto tiempo debe esperar un contenedor después de comenzar antes de verificar su estado.
tiempo de esperaSegundos Tiempo de espera (en segundos), cuánto tiempo esperar para que se complete la sonda. Si se excede el tiempo, se considera que la sonda ha fallado. El valor predeterminado es 1 segundo. El valor mínimo es 1.
períodoSegundos Frecuencia de sondeo de ejecución (segundos), con qué frecuencia realizar el sondeo, en segundos. El valor predeterminado es 10 segundos. El valor mínimo es 1.
umbral de éxito Umbral de salud, después de que falla la detección, la detección exitosa mínima consecutiva es exitosa. El valor predeterminado es 1. El valor mínimo es 1. Debe ser 1 en la sonda de actividad y la sonda de inicio.
Umbral de falla Umbral de mal estado, la cantidad mínima de fallas de sonda consecutivas requeridas para que la sonda ingrese al estado de falla.

El documento de configuración proporcionado por la empresa no incluye la configuración de la sonda de inicio.Se supone que la versión de k8s implementada no es compatible con la sonda de inicio.

Del trasfondo del problema, hemos extraído algunos puntos clave :

  1. Un pod se está reiniciando.
  2. Una vez que se completa el reinicio del pod, continúa reiniciándose.
  3. 告警短信大概一分钟后告警恢复。

到这里可以联想到,存活探针发送get请求获取到的响应的状态码不在 200 和 400之间或者直接超时,所以容器重启直接影响服务,告警通知;但是配置的初始延迟为90秒太短导致一直重启;就在这时就绪探针判断 Ready 状态变为False,则系统自动将其从 Service 的后端 Endpoint 列表中隔离出去,故障 pod 排除掉之后,告警恢复。

是什么原因导致正在运行的容器,PaaS平台是有事件日志的,当时忘记截图了(盘的时候查不到了)... 记得当时有http超时事件,也有状态码为503的事件。超时可能是网络波动或者大概率是初始延迟设置过短。那么这个503状态码到底是为什么呢?

Actuator

Actuator是Springboot的一个模块,模块提供了Spring Boot的所有生产就绪功能。

Endpoints

Actuator 端点允许您监视应用程序并与之交互。 Spring Boot 包括许多内置端点,并允许您添加自己的端点。 例如,提供基本的应用程序运行状况信息的 health 端点。

Actuator的health端点

我们配置健康检查用的接口就是Actuator提供的 health 端点接口。像我们引入DB依赖,Nacos依赖啥的,这些依赖实现了Actuator的health策略接口HealthIndicator,请求health端点的时候就会调用策略实现类检查健康状况。

health端点的返回会返回一个status,可以通过配置management.endpoint.health.show-details=always设置返回详细信息。

下边是一个详细信息的返回值。

{
    "components":{
        "db":{
            "components":{
                "dataSource":{
                    "details":{
                        "database":"MySQL",
                        "result":1,
                        "validationQuery":"/* ping */ SELECT 1"
                    },
                    "status":{
                        "code":"UP",
                        "description":""
                    }
                },
                "dataSource2":{
                    "details":{
                        "database":"MySQL",
                        "result":1,
                        "validationQuery":"/* ping */ SELECT 1"
                    },
                    "status":{
                        "code":"UP",
                        "description":""
                    }
                }
            },
            "status":{
                "code":"UP",
                "description":""
            }
        },
        "discoveryComposite":{
            "components":{
                "discoveryClient":{
                    "details":{
                        "services":[
                            "***",
                            "***",
                            "***-gateway"
                        ]
                    },
                    "status":{
                        "code":"UP",
                        "description":""
                    }
                }
            },
            "status":{
                "code":"UP",
                "description":""
            }
        },
        "diskSpace":{
            "details":{
                "total":"528309530624",
                "free":"463192977408",
                "threshold":10485760
            },
            "status":{
                "code":"UP",
                "description":""
            }
        },
        "mail":{
            "details":{
                "location":"10.************:25"
            },
            "status":{
                "code":"UP",
                "description":""
            }
        },
        "ping":{
            "details":{

            },
            "status":{
                "code":"UP",
                "description":""
            }
        },
        "refreshScope":{
            "details":{

            },
            "status":{
                "code":"UP",
                "description":""
            }
        }
    },
    "groups":[

    ],
    "status":{
        "code":"UP",
        "description":""
    }
}
复制代码

返回的Status的code编码有四种。

/**
 * 指示组件或子系统处于未知状态。
 */
public static final Status UNKNOWN = new Status("UNKNOWN");

/**
 * 指示组件或子系统按预期运行。
 */
public static final Status UP = new Status("UP");

/**
 * 指示组件或子系统发生了意外故障。
 */
public static final Status DOWN = new Status("DOWN");

/**
 * 指示组件或子系统已从服务中取出,不应再使用。
 */
public static final Status OUT_OF_SERVICE = new Status("OUT_OF_SERVICE");
复制代码

翻看源码看到了这四个编码与http状态码的关系,即 DOWN 和 OUT_OF_SERVICE 会返回http状态码 503,其他返回200状态码。

health端点如果异常,即可以通过详细信息定位到异常的组件!

Supongo que te gusta

Origin juejin.im/post/7215253602204418104
Recomendado
Clasificación