自动收集K8s Pod重启原因、日志和事件

图片由 Carles Rabada 在Unsplash

在这篇博文中,我将向您展示我们如何自动化 K8s Pod 重启问题的故障排除过程。通过编写和部署 K8s 自定义控制器,我们自动收集 K8s Pod Restart ReasonsLogsEvents 并将其发送到 Slack 通道,这使得该过程比以前更容易。

收集的数据概述

首先,让我们看一下示例消息的两张 Slack 截图。

简短的警报消息

带有显示更多的简短警报消息

详细告警信息

如下图,点击Show more,我们可以看到Reason, Pod Status, Pod Events, Node Status and Events,Pod Logs Before Restart。

带有 Show less 的详细警报消息

Pod Status 部分中,它显示了 Restart CountState、Last State、Reason 和容器 Limits 和 Requests 设置。

根据上述消息,Pod 因 OOMKilled 而重启。另外,我们可以查看重启前的 Pod 日志,看到 Memory Limit 设置为1Gi

非常清晰、高效、省时,不是吗?

我们为什么要建造这个?

Airwallex,我们有 数千个 Pods 在超过 100 个 K8s 集群上运行。在 K8s 中,Pod 被认为是相对短暂(而不是持久)的资源。 Pod 重启事件经常发生在这种规模的集群中。

每次手动排查 K8s Pod 问题是一项耗时且效率低下的工作。工程师曾经一次又一次地重复它。

“为什么我们不能自动化整个流程?” 我们的一位 DevOps 工程师在一次警报审查会议上问道。 _“为什么不呢?”_另外2名DevOps工程师立即表现出兴趣并开始研究。

接下来的两节展示了详细的步骤以及如何自动化它们。

解决 Pod 问题

过去,当 Pod 重新启动时,我们必须运行以下命令来手动分析上下文**。**

1\。检查 Pod RESTARTS、READY 和 STATUS

$ kubectl 获取 pod demoservice-56d5f9f7ff-slr7d

NAME READY STATUS RESTARTS AGE

demoservice-56d5f9f7ff-slr7d 1/2 运行 2 164h13m57s

2\。检查 Pod Restart Reason、Last State 和资源设置。在解决 OOMKilled 问题时,应特别注意资源 LimitsRequests

$ kubectl 描述 pod demoservice-56d5f9f7ff-slr7d

...

就绪: false **重启次数:2

状态:**正在运行 开始: 2022 年 8 月 10 日,星期三 02:34:48 +0000 最后状态: 终止 **原因:OOMKilled

退出代码:** 137 开始时间: 2022 年 8 月 8 日星期一 07:28:33 +0000 结束时间: 2022 年 8 月 10 日星期三 02:34:46 +0000 **限制:

cpu:** 1 内存: 1Gi **请求:

cpu:** 20m 内存: 500Mi

...

3\。通过**kubectl get events | grep** <podName>检查 Pod 事件

4\。通过**kubectl logs --previous **<podName>重启前检查 Pod 日志

5\。通过**kubectl get node** <nodeName>检查节点状态

6\。通过**kubectl get events | grep** <nodeName>检查节点事件

自动化它

以下是自动执行上述故障排除步骤的 2 种方法。

方法 #1:使用 Bash 脚本和 Kubectl 编写收集器

这是一个非常简单的方法。我们可以让**kubectl get pod -A**命令定期运行,并比较 RESTARTS 计数。如果 RESTARTS 值上升,则表明 Pod 已重新启动。然后依次运行上面的kubectl命令以收集相关信息。

最后,收集到的信息将使用Slack Incoming Webhooks 发布到 Slack 频道。

方法二:使用client-go库编写K8s自定义控制器

第一种方法简单但效率低。我们可以使用client-go库编写一个Kubernetes 自定义控制器来观察 Pod 的变化,并在 Pod 重新启动时收集 Pod Restart Reasons、Logs 和 Events

K8s 控制器是一个控制循环,通过 API 服务器监视集群的状态。 client-go 库包含几个有用的实用程序,用于访问 API 和创建自定义控制器。

构建 K8s 自定义控制器,请参考编写控制器和client-go 示例。

总结

自动化 K8s Pod 问题的故障排除过程既高效又省时。在 Airwallex,我们编写了一个Kubernetes 自定义控制器来自动收集并发送 K8s Pod 重启原因、日志和事件到 Slack。现在,解决 Pod 问题非常容易,并且为我们的工程师节省了数百小时。

GitHub 回购:https://github.com/airwallex/k8s-pod-restart-info-collector

参考文献

  • 写控制器

  • client-go 示例

  • Slack 传入 Webhooks

非常感谢 Jetson Pan、Michael Liu 和 Michelle Narayan 审阅此博客。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐