怎样配置 Kubernetes Readiness 和 Liveness Probes

本文介绍了 Kubernetes 中的就绪和活跃度探测,以及怎样为容器配置它们。

什么是 Kubernetes 中的探针

由于多种原因,应用程序可能会变得不可靠。 您需要确保应用程序处于所需状态。 Kubernetes 提供了一种检查容器健康状况的方法。 这种健康诊断称为探测。

探测容器的方法

kubelet 使用以下方式之一在其容器上完成探测:

1.执行

Kubelet 在容器内执行命令。 结果取决于命令的退出代码。 退出代码 0 表示诊断成功。

2.http获取

Kubelet 发送一个 GET 请求到容器IP地址的指定端口。 200 到 400(含)之间的响应代码表示诊断成功。

3. TCP套接字

Kubelet 尝试在容器 IP 地址的指定端口上建立 TCP 连接。 已建立的连接表示诊断成功。

探头类型

Kubernetes 中有三种类型的探针:

  1. 活性探针

  2. 就绪探测

  3. 启动探针

启动探测器是最近添加到此列表中的,本文不对其进行讨论。

活性探针

liveness probe 检测容器是否存活。 这用于确保 pod 的可用性。 如果 liveness 探测成功,kubelet 什么都不做,因为容器已经处于所需状态。 如果失败,kubelet 将终止容器,进一步的操作过程取决于指定的 重启政策 的容器。

为什么要使用 Liveness Probe?

Kubelet 通过查看容器的状态来检查容器的健康状况 PID 1. 问题是状态 PID 1 不反映容器子进程的健康状况。 如果您只有一个进程容器,则无需指定活性探测器。 否则,您应该使用活性探针。

就绪探测

就绪探测器检测容器是否准备好为传入的网络请求提供服务。 您不想将流量发送到尚未准备好运行的 pod。 如果就绪探测失败,控制面板会停止到 pod 的网络流量。 在 pod 上运行第一个就绪探测之前,默认就绪状态设置为 Failure. 就绪探测在容器的整个生命周期内定期在容器上运行。

为什么要使用就绪探针?

一旦所有子进程启动,网络流量就应该被发送到容器。 如果没有就绪探测,Kubernetes 会尽快将网络流量发送到容器 PID 1 开始。 这并不意味着子进程已经启动。 在此状态下向容器发送网络流量可能会导致错误。 每次容器重新启动或创建应用程序的新实例时,应用程序都会遇到错误。

怎样在 Kubernetes 中配置探针

在里面定义了一个探针 pods.spec.containers 场地。 每个探针都有以下五个参数:

  1. 初始延迟秒数:这指定了容器启动后等待探测运行的时间(以秒为单位)。 默认值为 0。

  2. 期间秒:这指定了每个周期性探测之间的时间间隔。 默认值为 10。

  3. 超时秒数:这指定了每个探测必须等待获得响应的时间。 默认值为 0。

  4. 成功门槛:这指定指示成功诊断的成功探测的计数。 默认值为 1。

  5. 失败阈值:这指定指示诊断失败的失败探测的计数。 默认值为 3。

所有这些参数都用于配置探测器。 要遵循本指南,您需要配置 Kubernetes 集群和 kubectl 客户端。 您可以使用 Vultr Kubernetes Engine 在云端部署 Kubernetes 集群并测试探针。 配置 kubectl 在你的机器上并跟随。

创建一个活性探测器

看下面的配置文件:

apiVersion: v1

kind: Pod

metadata:

  labels:

    test: liveness

  name: liveness-demo

spec:

  containers:

  - name: basic-container

    image: registry.k8s.io/busybox

    args:

    - /bin/sh

    - -c

    - touch /tmp/healthy; sleep 20; rm -f /tmp/healthy; sleep 1000

    livenessProbe:

      exec:

        command:

        - cat

        - /tmp/healthy

      initialDelaySeconds: 5

      periodSeconds: 10

此配置创建了一个容器 pod 并定义了一个 liveness probe。 该探头使用 exec 进行诊断。 创建容器后, touch /tmp/healthy; sleep 20; rm -f /tmp/healthy; sleep 100 命令被执行。 该命令将:

  • 创建一个 /tmp/healthy 文件

  • 等待 20 秒。

  • 删除 /tmp/healthy 文件。

  • 让容器再存活 1000 秒。

注意 livenessProbe 下的字段 containers 场地。 这是您定义活性探测器的地方。 这里liveness probe会在容器创建后等待5秒,以10秒的时间间隔开始周期性诊断。 它使用 exec 方式执行探测。 如果命令 cat /tmp/healthy 返回0,探测成功。

创建吊舱:

kubectl apply -f config.yaml

检查 pod 的事件:

kubectl describe liveness-demo

在输出的末尾,您可以看到类似以下内容:

Events:

    Type    Reason     Age   From               Message

      ----    ------     ----  ----               -------

    Normal  Scheduled  25s   default-scheduler  Successfully assigned default/liveness-demo to probescluster-3a397dd3c5ec

    Normal  Pulling    25s   kubelet            Pulling image "registry.k8s.io/busybox"

    Normal  Pulled     22s   kubelet            Successfully pulled image "registry.k8s.io/busybox" in 3.292188263s

    Normal  Created    22s   kubelet            Created container basic-container

    Normal  Started    22s   kubelet            Started container basic-container

到目前为止,pod 健康且正在运行。 25 秒后,再次查看 pod 的事件:

kubectl apply -f config.yaml

你可以期待看到类似的东西:

Events:

    Type     Reason     Age               From               Message

      ----     ------     ----              ----               -------

    Normal   Scheduled  56s               default-scheduler  Successfully assigned default/liveness-demo to probescluster-3a397dd3c5ec

    Normal   Pulling    55s               kubelet            Pulling image "registry.k8s.io/busybox"

    Normal   Pulled     52s               kubelet            Successfully pulled image "registry.k8s.io/busybox" in 3.292188263s

    Normal   Created    52s               kubelet            Created container basic-container

    Normal   Started    52s               kubelet            Started container basic-container

    Warning  Unhealthy  5s (x3 over 25s)  kubelet            Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory

    Normal   Killing    5s                kubelet            Container basic-container failed liveness probe, will be restarted

从输出中可以看到,5秒前,liveness探测失败,提示kubectl重启容器。 现在,检查 pod 的状态:

kubectl get pod liveness-demo

预期输出:

NAME            READY   STATUS    RESTARTS     AGE

liveness-demo   1/1     Running   1 (4s ago)   85s

请注意, 重启 现场表演 1 这确认容器已重新启动。

配置就绪探测器

配置就绪探针类似于配置活性探针。 您可以通过在配置文件中添加以下内容来创建类似的准备检查探测器 pods.spec.containers 场地。

    readinessProbe:

      exec:

        command:

        - cat

        - /tmp/healthy

      initialDelaySeconds: 5

      periodSeconds: 10

结论

本文介绍了 Kubernetes 的活跃度和就绪度探测器、它们的用途以及怎样配置它们。 要了解更多信息,请参阅 配置 Liveness、Readiness 和 Startup Probe 在 kubernetes.io。

文章标题 名称(可选) 电子邮件(可选) 描述

发送建议

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com