Kubernetes(K8s)Pods问题的自动化排查
自动收集K8s Pod重启原因、日志和事件
图片由 Carles Rabada 在Unsplash
在这篇博文中,我将向您展示我们如何自动化 K8s Pod 重启问题的故障排除过程。通过编写和部署 K8s 自定义控制器,我们自动收集 K8s Pod Restart Reasons、Logs 和 Events 并将其发送到 Slack 通道,这使得该过程比以前更容易。
收集的数据概述
首先,让我们看一下示例消息的两张 Slack 截图。
简短的警报消息
带有显示更多的简短警报消息
详细告警信息
如下图,点击Show more,我们可以看到Reason, Pod Status, Pod Events, Node Status and Events,和Pod Logs Before Restart。
带有 Show less 的详细警报消息
在 Pod Status 部分中,它显示了 Restart Count、State、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 问题时,应特别注意资源 Limits 和 Requests。
$ 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 审阅此博客。
更多推荐
所有评论(0)