摘要:Kubernetes 部署错误常见,多因配置或资源。文章详解 10 常见错误与故障排除,并强调自动化、资源限制及可观测性,旨在预防问题。
Kubernetes 部署错误常见,多因配置或资源。文章详解 10 常见错误与故障排除,并强调自动化、资源限制及可观测性,旨在预防问题。
译自:Top 10 Kubernetes Deployment Errors: Causes and Fixes (And Tips)
当您的 Kubernetes 部署失败时,可能会感觉像大海捞针。一个小小的错误——一个字段缺失、镜像名称拼写错误或内存不足——都可能使一切停滞。您可能会惊讶地发现,配置错误是高达 80% 的 Kubernetes 安全和稳定性问题的根本原因。
了解 Kubernetes 部署错误发生的原因以及如何准确地排除故障。无论您是处理 CrashLoopBackOff、卡住的 Pod 还是 YAML 问题,我们都将深入探讨 10 个常见问题,并提供简单的方法来在未来预防它们。
Kubernetes 帮助您在容器中运行应用程序,但即使是设置中的小错误也可能导致大问题。大多数问题发生是因为配置不正确或您的集群没有足够的资源。让我们看看部署失败的几个常见原因。
Kubernetes 使用 YAML 文件来定义您的应用程序应有的样子。这被称为声明式配置。但如果该文件中有哪怕一个小错误——例如拼写错误、错误的缩进或字段缺失——您的应用程序将无法正确部署。
此外,有时文件是有效的 YAML 但对 Kubernetes 无效。例如,您可能忘记设置副本数量或指向尚不存在的服务。这些小错误可能难以发现,但一旦发现就容易修复。
您的容器镜像就是 Kubernetes 运行的应用程序。如果镜像名称错误或镜像未推送到注册表,Kubernetes 就无法拉取它,您的应用程序也无法启动。另一个常见问题是没有为您的 Pod 设置足够的 CPU 或内存。如果 Pod 请求的资源多于可用资源,Kubernetes 可能会延迟它或使其处于“Pending”状态。
有时问题不在于您的应用程序——而在于集群本身。如果节点已满、离线或出现问题,您的应用程序可能没有地方运行。集群的网络或存储设置也可能存在问题。例如,Pod 可能无法连接到其他服务,或者如果存储不可用,它可能会崩溃。
当 Kubernetes 部署出现问题时,一开始可能会感到困惑。但许多错误是常见的,并且有明确的原因。以下是您可能会遇到的 10 个最常见的错误以及如何修复它们。
此错误意味着 Pod 启动后立即崩溃,然后反复尝试重新启动。这通常发生在容器内的应用程序启动后立即失败时。
故障排除方法:
运行 kubectl logs 查看应用程序崩溃的原因。检查您的启动命令或环境变量。确保任何所需的文件、服务或依赖项都可用。2. ImagePullBackOff / ErrImagePull当 Kubernetes 无法下载您的容器镜像时,会显示这些错误。这可能是因为镜像名称错误、注册表需要登录或镜像不存在。
故障排除方法:
检查 YAML 文件中的镜像名称和标签。确保镜像已推送到容器注册表。如果是私有注册表,请添加有效的镜像拉取密钥。OOM 代表内存不足(out of memory)。此错误意味着您的容器使用的内存超出允许范围,并被系统终止。
故障排除方法:
增加部署文件中的内存限制。优化您的应用程序以减少内存使用。使用 kubectl describe pod 检查内存限制和使用情况。此错误意味着 Pod 设置中的某些内容有误。这可能是一个错误的 Secret、ConfigMap 或 Volume。
故障排除方法:
使用 kubectl describe pod 查看详细错误消息。检查 Secret、ConfigMap 或 Volume 是否在 YAML 中被引用。确保路径和键是正确的。此错误意味着集群中的节点不可用于运行 Pod。它可能已关闭或断开连接。
故障排除方法:
使用 kubectl get nodes 检查节点状态。查看 kubectl describe node 获取更多信息。根据问题重启或修复节点。处于“Pending”状态的 Pod 尚未启动。这通常意味着资源不足(CPU 或内存)或卷不可用。
故障排除方法:
运行 kubectl describe pod 找出它处于 Pending 状态的原因。检查您的集群是否有足够的可用资源。确保存储卷或节点选择器是正确的。此错误意味着 Kubernetes 找不到符合您的 Pod 要求的节点。这通常与资源限制或调度规则有关。
故障排除方法:
使用 kubectl describe pod 查看调度详情。减少 Pod 规格中的 CPU 或内存请求。检查您是否使用了可能阻止调度的任何节点选择器或污点。这意味着容器根本未能启动。这可能是因为入口点命令错误或容器没有所需的权限。
故障排除方法:
使用 kubectl logs 或 describe pod 查看错误。确保 YAML 中的命令和参数是正确的。检查是否存在文件缺失、权限损坏或所需的访问权限。这些退出代码表示您的应用程序在启动后立即失败。代码 1 通常表示一般错误。代码 125 可能意味着容器命令在应用程序运行之前就失败了。
故障排除方法:
使用 kubectl logs 查看错误输出。仔细检查您的入口命令、环境变量和依赖项。尝试使用 docker run 在本地运行镜像进行测试。有时 Pod 会长时间停留在“Init”或“Waiting”状态。这发生在 Init 容器或主容器无法正常启动时。
当 Kubernetes 出现问题时,遵循按部就班的方法会有所帮助。不要猜测,而是使用 Kubernetes 内置的工具来找出发生了什么。
这是一个简单的框架,可以指导您进行故障排除:
步骤作用工具或命令kubectl describe查看 Pod 状态、事件和错误消息kubectl describe pod检查事件和日志了解 Kubernetes 的行为和应用程序行为kubectl get events, kubectl logs试运行 (Dry run)在 YAML 错误影响集群之前捕获它们kubectl apply –dry-run=client资源监控识别内存/CPU 问题kubectl top pod 或仪表板工具健康探针确保应用程序正常运行并准备好接收流量YAML 中的存活探针和就绪探针kubectl describe 命令提供了 Pod、节点或其他资源正在发生的事情的完整细分。它显示了当前状态、任何错误消息和相关事件。这应该是您获取问题线索的第一站。
事件告诉您 Kubernetes 一直在尝试做什么,例如调度 Pod 或拉取镜像。日志显示您的应用程序或容器实际在做什么。使用 kubectl get events 获取全局视图,使用 kubectl logs 查看容器内部。
YAML 文件中的小拼写错误或错误的格式可能会导致大问题。在应用配置之前,使用 kubectl apply –dry-run=client -f .yaml 来检查您的配置。这有助于在不更改集群任何内容的情况下尽早发现错误。
使用 kubectl top 或指标仪表板等工具检查您的 Pod 正在使用的 CPU 和内存量。如果 Pod 没有足够的资源——或者请求过多——它们可能会崩溃、卡住或被系统终止。
存活探针和就绪探针帮助 Kubernetes 了解您的应用程序何时健康并准备好提供流量。如果这些探针缺失或设置不正确,Pod 可能会频繁重启或在准备好之前接收流量。添加适当的健康检查使您的应用程序更稳定。
一旦您修复了常见的 Kubernetes 问题,下一步就是阻止它们再次发生。一些聪明习惯对于保持部署顺畅无忧大有裨益。
在部署之前,使用工具检查您的 YAML 文件是否存在错误。静态分析器可以捕获缺失的字段、错误的格式或无效的值。在您的 CI/CD 流水线中自动化此步骤有助于您在问题影响生产之前尽早发现它们。
YAML 静态分析和验证的有用工具:
Kubevalkube-linterDatreekubectl –dry-run始终为您的容器设置 CPU 和内存请求和限制。这有助于 Kubernetes 正确调度您的 Pod,并保护您的集群免受单个 Pod 使用过多资源的影响。但不要猜测——从小处着手,并根据实际使用情况进行调整。
设置资源请求和限制的技巧:
从小的默认值开始(例如,100m CPU,128Mi 内存),并监控使用情况。使用 kubectl top pod 或指标仪表板查看实际资源消耗。设置请求(最低需求)和限制(最大允许)。避免将限制设置得过低,因为它可能导致您的应用程序崩溃或重启。实施可观测性工具添加工具,让您实时查看集群中发生的事情。仪表板和监控解决方案可以帮助您更快地发现问题,并更容易理解整体性能。
Kubernetes 流行的可观测性工具:
Kubernetes 中的部署错误可能会拖慢您的团队,浪费资源并导致不必要的停机。这就是为什么理解常见问题——以及如何修复或预防它们——对于任何使用容器和集群的人来说都是一项非常有价值的技能。
通过使用尽早发现问题的工具、设置智能资源限制并密切关注您的环境,您可以在问题开始之前避免大多数麻烦。而当需要清理旧的或损坏的部署时,以正确的方式进行同样重要。
在我们的指南 如何在 Kubernetes 中移除部署 中了解如何安全地从集群中移除部署。
主要资源
来源:余定武是谁