未在预期持续时间内调用活性探针、就绪探针

2024-02-11

在GKE上,我尝试使用readinessprobe/livenessprobe,并使用监控发布警报https://cloud.google.com/monitoring/alerts/using-alerting-ui https://cloud.google.com/monitoring/alerts/using-alerting-ui

作为测试,我创建了一个具有就绪探针/活性探针的 Pod。正如我所料,探针检查每次都失败。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    readinessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 0
      periodSeconds: 10      
      timeoutSeconds: 10
      successThreshold: 1
      failureThreshold: 3
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
      initialDelaySeconds: 20
      periodSeconds: 60
      timeoutSeconds: 30      
      successThreshold: 1
      failureThreshold: 3 

检查 GCP 日志,两个错误日志均首先基于 periodSeconds 显示。

就绪探测:每 10 秒一次

2021-02-21 13:26:30.000 日本标准时间 就绪探测失败:HTTP 探测失败,状态代码:500

2021-02-21 13:26:40.000 日本标准时间 就绪探测失败:HTTP 探测失败,状态代码:500

活性探测:每 1 分钟一次

2021-02-21 13:25:40.000 日本标准时间 活动探测失败:HTTP 探测失败,状态代码:500

2021-02-21 13:26:40.000 日本标准时间 活动探测失败:HTTP 探测失败,状态代码:500

但是,运行这个 Pod 几分钟后

  • 不再调用活性探针检查
  • 已调用就绪探测检查,但间隔变长(最大间隔看起来约为 10 分钟)
$ kubectl get event
LAST SEEN   TYPE      REASON      OBJECT              MESSAGE
30m         Normal    Pulling     pod/liveness-http   Pulling image "k8s.gcr.io/liveness"
25m         Warning   Unhealthy   pod/liveness-http   Readiness probe failed: HTTP probe failed with statuscode: 500
20m         Warning   BackOff     pod/liveness-http   Back-off restarting failed container
20m         Normal    Scheduled   pod/liveness-http   Successfully assigned default/liveness-http to gke-cluster-default-pool-8bc9c75c-rfgc
17m         Normal    Pulling     pod/liveness-http   Pulling image "k8s.gcr.io/liveness"
17m         Normal    Pulled      pod/liveness-http   Successfully pulled image "k8s.gcr.io/liveness"
17m         Normal    Created     pod/liveness-http   Created container liveness
20m         Normal    Started     pod/liveness-http   Started container liveness
4m59s       Warning   Unhealthy   pod/liveness-http   Readiness probe failed: HTTP probe failed with statuscode: 500
17m         Warning   Unhealthy   pod/liveness-http   Liveness probe failed: HTTP probe failed with statuscode: 500
17m         Normal    Killing     pod/liveness-http   Container liveness failed liveness probe, will be restarted

在我的计划中,我将创建警报策略,其条件是

  • 如果活性探测错误在 3 分钟内发生 3 次

但如果探测检查没有像我预期的那样调用,那么这些策略就不起作用;即使 pod 没有运行,警报也已修复


为什么 Liveness 探针没有运行,并且 Readiness 探针的间隔发生了变化?

注意:如果有其他好的警报策略来检查 Pod 的活跃度,我不会关心这种行为。如果有人建议我哪种警报策略最适合检查 Pod,我将不胜感激。


背景

In 配置活动、就绪和启动探针 https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes您可以在文档中找到信息:

kubelet 使用liveness probes了解何时重新启动容器。例如,活性探针可能会捕获死锁,即应用程序正在运行但无法取得进展。在这种状态下重新启动容器有助于提高应用程序的可用性,尽管存在错误。

kubelet 使用readiness probes了解容器何时准备好开始接受流量。当 Pod 的所有容器都准备就绪时,该 Pod 就被认为准备就绪。该信号的一种用途是控制哪些 Pod 用作服务的后端。当 Pod 未准备好时,它将从服务负载均衡器中删除。

As GKEmaster是google管理的,你找不到kubelet记录使用CLI(你可以尝试使用Stackdriver)。我已经在上面测试过Kubeadm聚类并设置verbosity水平至8.

当您使用时$ kubectl get events您仅收到过去一小时的事件(可以在 Kubernetes 设置中更改 -Kubeadm但我不认为它可以改变GKE因为 master 由 google 管理。)

$ kubectl get events
LAST SEEN   TYPE      REASON                    OBJECT              MESSAGE
37m         Normal    Starting                  node/kubeadm        Starting kubelet.
...
33m         Normal    Scheduled                 pod/liveness-http   Successfully assigned default/liveness-http to kubeadm
33m         Normal    Pulling                   pod/liveness-http   Pulling image "k8s.gcr.io/liveness"
33m         Normal    Pulled                    pod/liveness-http   Successfully pulled image "k8s.gcr.io/liveness" in 893.953679ms
33m         Normal    Created                   pod/liveness-http   Created container liveness
33m         Normal    Started                   pod/liveness-http   Started container liveness
3m12s       Warning   Unhealthy                 pod/liveness-http   Readiness probe failed: HTTP probe failed with statuscode: 500
30m         Warning   Unhealthy                 pod/liveness-http   Liveness probe failed: HTTP probe failed with statuscode: 500
8m17s       Warning   BackOff                   pod/liveness-http   Back-off restarting failed container

之后再次执行相同的命令~1 hour.

$ kubectl get events
LAST SEEN   TYPE      REASON      OBJECT              MESSAGE
33s         Normal    Pulling     pod/liveness-http   Pulling image "k8s.gcr.io/liveness"
5m40s       Warning   Unhealthy   pod/liveness-http   Readiness probe failed: HTTP probe failed with statuscode: 500
15m         Warning   BackOff     pod/liveness-http   Back-off restarting failed container

Tests

The Readiness Probe检查每 10 秒执行一次,持续时间超过一小时。

Mar 09 14:48:34 kubeadm kubelet[3855]: I0309 14:48:34.222085    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 14:48:44 kubeadm kubelet[3855]: I0309 14:48:44.221782    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 14:48:54 kubeadm kubelet[3855]: I0309 14:48:54.221828    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
...
Mar 09 15:01:34 kubeadm kubelet[3855]: I0309 15:01:34.222491    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4
562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 15:01:44 kubeadm kubelet[3855]: I0309 15:01:44.221877    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 15:01:54 kubeadm kubelet[3855]: I0309 15:01:54.221976    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
...
Mar 09 15:10:14 kubeadm kubelet[3855]: I0309 15:10:14.222163    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 15:10:24 kubeadm kubelet[3855]: I0309 15:10:24.221744    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 15:10:34 kubeadm kubelet[3855]: I0309 15:10:34.223877    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
...
Mar 09 16:04:14 kubeadm kubelet[3855]: I0309 16:04:14.222853    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 16:04:24 kubeadm kubelet[3855]: I0309 16:04:24.222531    3855 prober.go:117] Readiness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500

另外,还有Liveness probe条目。

Mar 09 16:12:58 kubeadm kubelet[3855]: I0309 16:12:58.462878    3855 prober.go:117] Liveness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 16:13:58 kubeadm kubelet[3855]: I0309 16:13:58.462906    3855 prober.go:117] Liveness probe for "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a):liveness" failed (failure): HTTP probe failed with statuscode: 500
Mar 09 16:14:58 kubeadm kubelet[3855]: I0309 16:14:58.465470    3855 kuberuntime_manager.go:656] Container "liveness" ({"docker" "95567f85708ffac8b34b6c6f2bdb4
9d8eb57e7704b7b416083c7f296dd40cd0b"}) of pod liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a): Container liveness failed liveness probe, will be restarted
Mar 09 16:14:58 kubeadm kubelet[3855]: I0309 16:14:58.465587    3855 kuberuntime_manager.go:712] Killing unwanted container "liveness"(id={"docker" "95567f85708ffac8b34b6c6f2bdb49d8eb57e7704b7b416083c7f296dd40cd0b"}) for pod "liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a)"

测试总时间:

$ kubectl get po -w
NAME            READY   STATUS    RESTARTS   AGE
liveness-http   0/1     Running   21         99m
liveness-http   0/1     CrashLoopBackOff   21         101m
liveness-http   0/1     Running            22         106m
liveness-http   1/1     Running            22         106m
liveness-http   0/1     Running            22         106m
liveness-http   0/1     Running            23         109m
liveness-http   1/1     Running            23         109m
liveness-http   0/1     Running            23         109m
liveness-http   0/1     CrashLoopBackOff   23         112m
liveness-http   0/1     Running            24         117m
liveness-http   1/1     Running            24         117m
liveness-http   0/1     Running            24         117m

结论

不再调用活性探针检查

Liveness check在 Kubernetes 创建 pod 时创建,并且每次都会重新创建Pod已重新启动。在您的配置中您已设置initialDelaySeconds: 20所以在创建一个之后pod,Kubernetes会等待20秒,然后它会调用liveness探测3次(如您所设置的failureThreshold: 3)。 3次失败后,Kubernetes将根据RestartPolicy。此外,在日志中您还可以在日志中找到:

Mar 09 16:14:58 kubeadm kubelet[3855]: I0309 16:14:58.465470    3855 kuberuntime_manager.go:656] Container "liveness" ({"docker" "95567f85708ffac8b34b6c6f2bdb4
9d8eb57e7704b7b416083c7f296dd40cd0b"}) of pod liveness-http_default(8c87a08e-34aa-4bb1-be9b-fdca39a4562a): Container liveness failed liveness probe, will be restarted

为什么会重启呢?答案可以在容器探针 https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes.

livenessProbe:指示容器是否正在运行。如果活性探测失败,kubelet 将终止容器,并且容器将遵循其重新启动策略。

Default 重启政策 https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy in GKE is Always。所以你的 Pod 会一遍又一遍地重新启动。

已调用就绪探测检查,但间隔变长(最大间隔看起来约为 10 分钟)

我认为你已经得出了这个结论,因为你是基于$ kubectl get events and $ kubectl describe po。在这两种情况下,默认事件都会在 1 小时后删除。在我的Tests你可以看到的部分Readiness probe条目来自14:48:34 till 16:04:24,因此 Kubernetes 每 10 秒调用一次Readiness Probe.

为什么 Liveness 探针没有运行,并且 Readiness 探针的间隔发生了变化?

正如我在Tests部分, 的Readiness probe没有改变。在这种情况下误导是使用$ kubectl events。关于Liveiness Probe它仍然在调用,但在 pod 被调用后只调用了 3 次created/restarted。我还包括了输出$ kubectl get po -w. When pod重新创建后,您可能会在 kubelet 日志中找到这些liveness probes.

在我的计划中,我将创建警报策略,其条件如下:

  • 如果活性探测错误在 3 分钟内发生 3 次

If liveness probe失败 3 次,根据您当前的设置,它将重新启动该 pod。在这种情况下,你可以使用每个restart创建一个alert.

Metric: kubernetes.io/container/restart_count
Resource type: k8s_container

您可以在 Stackoverflow 案例中找到一些有用的信息:Monitoring alert like:

  • 使用 Google Container Engine (GKE) 和 Stackdriver 监控 Pod 状态并发出警报或重新启动 https://stackoverflow.com/questions/43789276/monitoring-and-alerting-on-pod-status-or-restart-with-google-container-engine-g
  • 我可以使用 Google Cloud Monitoring 来监控发生故障的 Container/Pod 吗? https://stackoverflow.com/questions/61248752/can-i-use-google-cloud-monitoring-to-monitor-a-failing-container-pod
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未在预期持续时间内调用活性探针、就绪探针 的相关文章

随机推荐

  • Linq:GroupBy、Sum 和 Count

    我有一系列产品 public class Product public Product public string ProductCode get set public decimal Price get set public string
  • 在Java中生成数百万个不重复的随机数

    我有一个问题 我可以使用什么算法在Java中生成一组2 21随机唯一数字 java中除了math random之外还有另一个生成随机数的库吗 提前致谢 关键问题是你所说的 数字 是什么意思 一般来说 这个问题可以通过 生成一个数字列表 将其
  • 将整个文件夹从 Windows 移动到 Android 模拟器

    是否可以将整个文件夹按原样从 Windows 移动到 Android 模拟器 我确信这个问题的答案存在于某处 但我无法找到它 我可以通过 adb 命令行或通过 ddms 一次移动一个文件 但都没有给我提供移动包含多个文件夹和文件的整个文件夹
  • 表单标签可以包含正文标签吗?

    今天我遇到一些代码 在正文标签开始之前有一个表单标签 我的意思是 表单标签包含在正文标签中 这可能吗 如果是的话 它有什么帮助呢
  • 如何使用 Unix 变量在会话 {bash} 中设置和保留值 [重复]

    这个问题在这里已经有答案了 我需要做这样的事情 设置一个带有默认值的 unix 变量 运行一个 shell 脚本来读取该变量并对其进行处理 处理后可能会也可能不会改变该变量的值 每小时运行此脚本并确保此变量现在的值是上次运行此脚本时设置的值
  • 使用 PHP 获取/读取 Javascript cookie

    我有一个理论问题 我知道你可以使用 javascript 获取 读取 PHP cookie 文档 cookie PHP 中有类似的方法吗 PHP 可以获取 读取在 JavaScript 中创建的 cookie 吗 如果是 那么你怎么能这样做
  • 为什么 ENUM 在 MySQL 中不存储多个值?

    我想用ENUM表中的特征使用MySQL 我创建了一个表tbl test having id作为主键和enum col字段为ENUM数据类型 CREATE TABLE tbl test id INT NOT NULL AUTO INCREME
  • 具有相同工作空间的 2 个 Eclipse 版本

    目前 我的系统上正在运行 Eclipse Ganymede 我想安装 Eclipse Indigo 并将其连接到同一工作区 然后删除 Eclipse Ganymede 这可以正常工作还是我应该重新创建所有项目 理论上它应该有效 在实践中 我
  • Spring Cloud Sleuth 与 OpenTracing

    有没有办法将 Spring Cloud Sleuth 与 OpenTracing 结合使用 我想将 Spring 客户端与 Jaeger 连接 Spring Sleuth 现在与 OpenTracing 兼容 您所要做的就是在类路径中使用
  • 使用 preRemove/postRemove 事件来获取哪些查询可以执行,哪些不能执行

    我在脑海中思考这个问题有一段时间了 现在我需要一些关于 preRemove postRemove 事件的建议 因为我将执行的查询基本上是DELETE但这也应该适用于 prePersist postPersist 和 preUpdate po
  • 我如何了解如何在 jQuery AJAX 应用程序中启用后退按钮?

    我查看了这里所有最热门的问题 包括引用最流行插件 如 BBQ 和 jQuery Address 的问题 然而 我缺少一些东西 我需要从我在这些项目中看到的任何事情中退一步进行指导 他们假设了一些我显然不具备的基本知识 并且我无法推断出示例中
  • 尝试在android中写入只读数据库

    当尝试更新值时 会发生这些错误 02 09 11 37 53 573 ERROR AndroidRuntime 4809 android database sqlite SQLiteException attempt to write a
  • Matplotlib - 财务量叠加

    我正在制作一个包含两个数据集的烛台图 开盘价 最高价 最低价 收盘价 和交易量 我试图将交易量叠加在图表底部 如下所示 我正在打电话卷 覆盖3 http doc astro wise org matplotlib finance html
  • 带有大量参数的Sql存储过程

    我正在使用 Sql Server 2008 我的存储过程接受近 150 个参数 性能方面有什么问题吗 当您使用 SQL Server 2008 时 您可以使用新的 Table 参数 如果参数相同 可以轻松使用表参数 这是链接到MSDN ht
  • Android - 当删除部分 ImageSpan 时删除整个 ImageSpan?

    我通过插入 ImageSpan 将图像添加到我的编辑文本中 我对跨度没有透彻的了解 但似乎我的 ImageSpan 需要包装一部分文本 因此 我向 EditText 添加一些文本 并用 ImageSpan 包裹它 看起来不错 但是 当我退格
  • 如何找出 Python 3 中 .pyc 标头的幻数

    Python 字节码 pyc 文件的标头以一个幻数开头 该幻数在 Python 版本之间会发生变化 我如何 以编程方式 找出当前 Python 版本的编号以生成有效的标头 我目前正在对 Python 3 7 1 进行硬编码 但这意味着我现在
  • 在不重新启动应用程序的情况下更改系统语言时,某些字符串不会被翻译

    我遇到一个问题 如果我打开 Android 应用程序 然后进入系统设置更改语言 然后再次打开应用程序 则应用程序中的某些字符串将不会被翻译 除非应用程序强制退出并重新启动 知道为什么会发生这种情况吗 我没有android configCha
  • 如何从 AlertDialog.Builder 或等效项构建 AppCompatDialog?

    在此之前我用过一个DialogBuilder创造AlertDialog像这样 AlertDialog Builder builder new AlertDialog Builder context AlertDialog dialog bu
  • Imgur 图像返回 403

    我一直在制作一个 React 应用程序 最近每当我尝试像这样从 imgur 访问图像时 this setState imgUrl https i imgur com this props image id b png imgBigUrl h
  • 未在预期持续时间内调用活性探针、就绪探针

    在GKE上 我尝试使用readinessprobe livenessprobe 并使用监控发布警报https cloud google com monitoring alerts using alerting ui https cloud