k8s集群健康检测 - 屌丝逆袭记

k8s集群健康检测 - 屌丝逆袭记

💡 原文中文,约4900字,阅读约需12分钟。
📝

内容提要

Kubernetes应用健康保障通过Readiness和Liveness探针判断Pod就绪与存活,支持exec、httpGet、tcpSocket三种探测方式。K8s基于状态机设计,Pod经历Pending、Running等状态转换,并产生Normal或Warning事件。常见故障包括Pending调度失败、Waiting镜像拉取失败、反复重启、Running但服务异常、Service无法工作。诊断手段有kubectl describe、exec进入容器、port-forward及Telepresence本地调试。

🔎

延伸解读

探针配置的三种方式与关键参数

Readiness和Liveness探针支持exec、httpGet、tcpSocket三种探测方式。exec通过命令返回值判断,httpGet检查指定路径和端口,tcpSocket尝试建立TCP连接。此外还有五个全局参数可调整探测行为,如初始延迟、超时等。合理配置这些参数能避免误判,确保应用健康状态准确反映。

从Pod状态与事件快速定位问题

K8s基于状态机设计,Pod经历Pending、Running等状态,每个状态转换会产生Normal或Warning事件。通过kubectl describe pod可查看事件和Condition字段,快速判断问题根源。例如Pending常因调度失败,Waiting多因镜像拉取问题,反复重启需查应用日志,Running但服务异常则检查配置和探针。

Service异常排查:关注Endpoint与Selector

Service无法工作时,首先检查其后端Endpoint是否存在。Service通过Selector匹配Pod标签来关联Endpoint,若标签配置错误,Service将找不到Endpoint,导致服务不可用。因此,排查时应确认Service的Selector与Pod标签是否一致,并验证Endpoint是否正常提供服务。

本地调试与远程集群联调手段

诊断时可用kubectl exec进入容器,或通过port-forward将远程服务映射到本地端口进行调用。Telepresence工具则能将本地应用代理到远程集群,实现本地调试远程服务。这些方法帮助开发者在接近真实环境的情况下快速验证和修复问题,减少部署循环。

❓

Q&A

Kubernetes 中 Readiness 探针和 Liveness 探针有什么区别?

Readiness 探针用于判断 Pod 是否就绪,只有就绪时应用层流量才会进入;Liveness 探针用于判断 Pod 是否存活,如果不存活,上层会根据重启策略(如 restart always)重新拉起 Pod。

K8s 的 Liveness 和 Readiness 探针支持哪些探测方式?

支持三种探测方式:exec(在容器内执行命令,返回 0 表示健康)、httpGet(通过 HTTP 请求指定路径和端口,可配置 header)、tcpSocket(尝试与指定端口建立 TCP 连接,成功则健康)。

Pod 一直处于 Pending 状态可能是什么原因?如何排查?

Pending 表示调度器未介入,可能由于资源不足、端口占用或 node selector 不满足。可通过 kubectl describe pod 查看事件,事件中会显示不满足的节点数量及原因(如 CPU、节点或标签不满足)。

Pod 处于 Waiting 状态通常是什么原因?

Waiting 状态通常表示镜像拉取失败,可能原因包括:私有镜像未配置 Pod secret、镜像地址不存在、或公网镜像拉取失败。

Pod 不断重启并出现 backoff,应该如何排查?

这通常表示 Pod 已调度成功但启动失败,应关注应用自身状态而非配置或权限问题,需要查看 Pod 的具体日志来定位原因。

Service 无法正常工作,可能是什么原因?如何排查?

常见原因是 Service 与 Pod 之间的 label selector 配置错误,导致 Service 找不到 endpoint。排查时首先检查 Service 后端是否有真正的 endpoint,然后确认 endpoint 是否能正常提供服务。

如何进入正在运行的 Pod 进行调试?

使用 kubectl exec -it pod_name /bin/bash 进入单个容器的 Pod;如果 Pod 包含多个容器,使用 kubectl exec -it pod_name -c container-name /bin/bash 指定容器。

如何将远程 K8s 集群中的服务暴露到本地进行调试?

可以使用 port-forward 将远程服务端口映射到本地,例如 kubectl port-forward;或者使用 Telepresence 将本地应用代理到远程集群,通过 Telepresence-swap-deployment 命令将远程 deployment 替换为本地应用,实现本地调试。

🏷️

标签

➡️

继续阅读