K8S 探针

探针(Probe)是一种健康检查机制,用于监测Pod中容器的运行状况,确保应用的高可用性和稳定性。

一、探针类型

  1. 存活探针(Liveness Probe)
  • 作用:用于检测容器内部的主进程或服务是否仍然运行正常且响应健康检查。如果存活探针探测失败,Kubernetes将会重启容器,以恢复其正常运行。
  • 使用场景:当容器中的应用程序因为某些原因(如死锁、崩溃等)无法正常工作时,存活探针能够及时发现并触发重启操作,从而避免服务长时间不可用。
  • 配置方式:可以通过HTTP GET请求、TCP连接或执行容器内命令等方式进行配置。
  1. 就绪探针(Readiness Probe)
  • 作用:用于检测容器是否已经准备好接收流量。只有当就绪探针返回成功时,Kubernetes才会将流量转发到该容器。
  • 使用场景:在容器启动过程中,可能需要加载数据、配置文件或等待外部依赖服务等操作。此时,即使容器已经启动,也可能无法立即处理请求。就绪探针能够确保在容器完全准备就绪后再接收流量,从而提高服务的稳定性和可靠性。
  • 配置方式:与存活探针类似,也可以通过HTTP GET请求、TCP连接或执行容器内命令等方式进行配置。
  1. 启动探针(Startup Probe)(自Kubernetes 1.16版本引入)
  • 作用:用于检测容器内的应用是否已经成功启动并完成初始化任务。在容器启动初期,启动探针会先于存活探针和就绪探针生效,从而避免因容器启动时间较长而导致的误判。
  • 使用场景:当容器中的应用启动时间较长或存在多个启动阶段时,启动探针能够确保在容器完全启动后再进行健康检查,避免因过早的健康检查而导致的重启或流量调度问题。
  • 配置方式:同样支持HTTP GET请求、TCP连接或执行容器内命令等方式进行配置。
  1. 通用参数
  • initialDelaySeconds:容器启动后等待多久开始探测。
  • periodSeconds:探测的间隔时间。
  • timeoutSeconds:单次探测的超时时间。
  • successThreshold:探测失败到成功的重试次数(对于存活探针,此值通常配置为1)。
  • failureThreshold:探测成功到失败的重试次数(对于就绪探针和启动探针,此值可根据需要配置)。

二、探针功能

探针(Probe)是一种强大的机制,用于检测Pod中容器的健康状态,并根据检测结果采取相应的行动。

  1. 监测容器健康状态
  • 存活探针(Liveness Probe):用于确定容器是否正在运行。如果存活探针失败,Kubernetes将杀死容器,并根据Pod的重启策略决定是否重启容器。这有助于自动恢复因应用崩溃或死锁而导致的容器故障。
  • 就绪探针(Readiness Probe):用于确定容器是否已准备好接受流量。只有当就绪探针成功时,Kubernetes才会将流量路由到该容器。这有助于防止在容器完全启动和初始化之前向其发送请求,从而提高服务的稳定性和可靠性。
  • 启动探针(Startup Probe)(Kubernetes 1.16+):用于确定容器是否已启动并准备好接受其他探针的检查。在容器启动期间,启动探针将覆盖存活探针和就绪探针(如果它们存在)。这有助于处理那些启动时间较长或具有多个启动阶段的容器,防止因过早的健康检查而导致的误判。
  1. 提高服务的可用性
  • 通过自动重启失败的容器(存活探针)和防止将流量发送到未准备好的容器(就绪探针),探针机制有助于确保服务的持续可用性。这减少了因容器故障或初始化问题而导致的服务中断时间。
  1. 自定义健康检查逻辑
  • Kubernetes允许用户通过HTTP GET请求、TCP连接或执行容器内命令等方式自定义探针的健康检查逻辑。这为用户提供了极大的灵活性,可以根据应用的具体需求来定义健康检查的标准。
  1. 改进负载均衡和调度决策
  • 就绪探针的结果被用于Kubernetes的负载均衡和调度决策中。当Pod的某个容器未通过就绪探针时,该容器将被从服务的端点列表中移除,从而确保流量不会被路由到未准备好的容器。这有助于保持服务的整体性能和稳定性。
  1. 易于集成和配置
  • 探针的配置相对简单,可以通过Pod的YAML文件轻松完成。用户只需指定探针的类型、检查方式、初始延迟、间隔时间、超时时间等参数即可。这使得探针机制易于集成到现有的Kubernetes部署中。

Kubernetes中的探针机制通过提供灵活的健康检查功能,帮助用户确保Pod中容器的健康状态,提高服务的可用性和稳定性。通过合理配置存活探针、就绪探针和启动探针,用户可以自动检测并处理容器运行中的异常情况,从而构建更加可靠和高效的Kubernetes应用。

三、实现方式

探针(Probe)的实现方式主要有三种:HTTP GET请求、TCP Socket连接和执行容器内命令。这些方式允许用户根据容器的具体需求和应用程序的特性来选择合适的健康检查机制。

  1. HTTP GET请求
    HTTP GET请求是最常用的探针实现方式之一,它适用于那些提供了HTTP服务的容器。在这种方式下,Kubernetes会向容器内指定的URL地址发送HTTP GET请求,并根据响应的HTTP状态码来判断容器是否健康。
    • 配置示例:
livenessProbe:  
  httpGet:  
    path: /healthz  
    port: 8080  
    httpHeaders:  
    - name: Custom-Header  
      value: Awesome  
  initialDelaySeconds: 3  
  periodSeconds: 3

在这个例子中,livenessProbe配置了一个存活探针,它通过HTTP GET请求向容器的8080端口上的/healthz路径发送请求。如果HTTP响应的状态码在200-399范围内,则认为容器是健康的。

  1. TCP Socket连接
    TCP Socket连接是另一种探针实现方式,它适用于那些提供TCP服务的容器。在这种方式下,Kubernetes会尝试与容器内指定的端口建立TCP连接。如果连接成功建立,则认为容器是健康的;如果连接失败,则认为容器不健康。
    • 配置示例:
livenessProbe:  
  tcpSocket:  
    port: 8080  
  initialDelaySeconds: 5  
  periodSeconds: 10

在这个例子中,livenessProbe配置了一个存活探针,它通过TCP Socket尝试与容器的8080端口建立连接。如果连接成功,则认为容器是健康的。

  1. 执行容器内命令
    执行容器内命令是第三种探针实现方式,它允许用户指定一个命令来在容器内部执行。Kubernetes会执行这个命令,并根据命令的退出状态码来判断容器是否健康。如果命令的退出状态码为0,则认为容器是健康的;否则,认为容器不健康。
    • 配置示例:
livenessProbe:  
  exec:  
    command:  
    - cat  
    - /tmp/healthy  
  initialDelaySeconds: 5  
  periodSeconds: 5

在这个例子中,livenessProbe配置了一个存活探针,它执行cat /tmp/healthy命令。如果/tmp/healthy文件存在且包含有效内容(导致命令的退出状态码为0),则认为容器是健康的。

注意事项

  • 初始延迟(initialDelaySeconds):配置探针开始执行前的初始延迟时间,以确保容器有足够的时间来启动和初始化。
  • 间隔时间(periodSeconds):配置探针执行的间隔时间。
  • 超时时间(timeoutSeconds):配置探针执行的超时时间。如果在这段时间内探针没有返回结果,则视为失败。
  • 成功阈值(successThreshold)和失败阈值(failureThreshold):配置探针从失败到成功或从成功到失败所需的重试次数。

四、配置参数

探针(Probe)是用于检测容器健康状态的机制,主要包括存活探针(Liveness Probe)、就绪探针(Readiness Probe)和启动探针(Startup Probe)。这些探针的配置参数允许用户根据容器的特性和需求来定制健康检查的行为。以下是这些探针的常见配置参数:

通用配置参数

  • initialDelaySeconds:容器启动后要等待多少秒后才开始执行探针。这个参数用于确保容器有足够的时间来启动和初始化。如果不设置,则默认容器启动时就开始执行探针。
  • periodSeconds:执行探针的时间间隔(单位是秒)。默认值是10秒,但可以根据需要进行调整。这个参数定义了探针检查的频率。
  • timeoutSeconds:探针执行超时的等待时间(单位是秒)。如果在这段时间内探针没有返回结果,则视为失败。默认值是1秒,但可以根据需要进行调整。
  • successThreshold:探针在失败后,被视为成功的最小连续成功数。这个参数用于定义探针需要连续成功多少次才能被认定为健康。对于存活探针和启动探针,这个值通常是1。
  • failureThreshold:探针连续失败的次数,达到这个次数后,Kubernetes会采取相应的行动(如重启容器)。默认值是3,但可以根据需要进行调整。

存活探针(Liveness Probe)特有参数

  • 存活探针主要用于检测容器内部运行的进程是否存活。如果探针失败,Kubernetes会重启容器。存活探针支持HTTP GET请求、TCP Socket连接和执行容器内命令三种实现方式,但配置参数主要围绕上述通用参数。

就绪探针(Readiness Probe)特有参数

  • 就绪探针用于确定容器是否已准备好接收请求流量。如果探针失败,Kubernetes将不会将流量传递给该容器。就绪探针的配置参数与存活探针相同,都是基于通用配置参数。但需要注意的是,就绪探针的initialDelaySeconds应该设置为应用程序启动并准备好接受流量所需的时间。

启动探针(Startup Probe)特有参数(可选)

  • 启动探针是Kubernetes 1.16及以上版本引入的,用于在容器启动时检测应用程序是否已成功启动。如果探针失败,Kubernetes会重启容器。启动探针的配置参数与存活探针和就绪探针相似,但通常具有更长的initialDelaySeconds和failureThreshold,以允许应用程序在启动时间较长或不稳定的情况下进行恢复。

示例配置
以下是一个包含存活探针和就绪探针的Pod配置示例:

apiVersion: v1  
kind: Pod  
metadata:  
  name: example-pod  
spec:  
  containers:  
  - name: example-container  
    image: nginx  
    livenessProbe:  
      httpGet:  
        path: /  
        port: 80  
      initialDelaySeconds: 15  
      periodSeconds: 10  
      timeoutSeconds: 1  
      successThreshold: 1  
      failureThreshold: 3  
    readinessProbe:  
      httpGet:  
        path: /  
        port: 80  
      initialDelaySeconds: 5  
      periodSeconds: 10  
      timeoutSeconds: 1  
      successThreshold: 1  
      failureThreshold: 3

在这个示例中,存活探针在容器启动后15秒开始执行,每隔10秒检查一次HTTP GET请求到容器的80端口,如果连续3次失败则重启容器。就绪探针在容器启动后5秒开始执行,同样每隔10秒检查一次HTTP GET请求,但仅当探针成功时,Kubernetes才会将流量传递给该容器。

你可能感兴趣的:(云原生,kubernetes,容器,云原生)