如何检测k8s集群中的 CrashLoopBackOff

这篇具有很好参考价值的文章主要介绍了如何检测k8s集群中的 CrashLoopBackOff。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CrashLoopBackOff 是一种 Kubernetes 状态,表示 Pod 中发生的重启循环:Pod 中的容器已启动,但一遍又一遍的崩溃然后又重新启动。

Kubernetes 将在重新启动之间等待越来越长的BackOff时间,以便您有机会修复错误。因此,CrashLoopBackOff 本身并不是一个错误,而是表明发生了一个错误,导致 Pod 无法正常启动。
如何检测k8s集群中的 CrashLoopBackOff
Pod 在 Running、Failed 和 Waiting 之间循环
请注意,它重新启动的原因是因为它restartPolicy设置为Always(默认情况下)或OnFailure,然后 kubelet 读取此配置并重新启动 Pod 中的容器并导致循环。这种行为实际上很有用,因为这为丢失的资源完成加载提供了一些时间,也为我们检测问题和调试提供了一些时间,稍后会详细介绍。

这解释了CrashLoop部分,但是BackOff时间呢?基本上,这是重启之间的指数延迟(10 秒、20 秒、40 秒……),上限为 5 分钟。当 Pod 状态显示 CrashLoopBackOff 时,表示它当前正在等待指示的时间,然后再重新启动 Pod。除非它被修复,否则它可能会再次失败。

如何检测k8s集群中的 CrashLoopBackOff
Pod 处于循环中。尝试运行,但失败了,所以进入失败状态。稍等片刻以帮助您调试,则会尝试再次运行。如果问题没有解决,就陷入了循环,将再次失败

在本文中,您将看到:

  1. 什么是 CrashLoopBackOff
  2. 如何检测 CrashLoopBackOff 问题
  3. CrashLoopBackOff 的常见原因
  4. 用于调试 CrashLoopBackOff 的 Kubernetes 工具
  5. 如何使用 Prometheus 检测 CrashLoopBackOff

如何检测集群中的 CrashLoopBackOff?

最有可能的是,您通过kubectl get pods列出一个或多个处于此状态的 Pod:

$ kubectl get pods
NAME                     READY     STATUS             RESTARTS   AGE
flask-7996469c47-d7zl2   1/1       Running            1          77d
flask-7996469c47-tdr2n   1/1       Running            0          77d
nginx-5796d5bc7c-2jdr5   0/1       CrashLoopBackOff   2          1m
nginx-5796d5bc7c-xsl6p   0/1       CrashLoopBackOff   2          1m

从输出中,您可以看到最后两个 pod:

  • 不处于READY( 0/1) 状态。
  • 他们的状态显示CrashLoopBackOff
  • RESTARTS显示重新启动次数。

这三个信号指向我们解释的内容:Pod 出现故障,它们正在重新启动。在重新启动之间,有一个宽限期,表示为CrashLoopBackOff.

您可能在 Pod 处于RunningFailed状态的短暂时间内找到它。

如何检测k8s集群中的 CrashLoopBackOff
CrashloopBackoff 的时间线。每次失败时,BackoffTime 和 Restart Count 都会增加

CrashLoopBackOff 的常见原因

重要的是要注意 CrashLoopBackOff 不是导致 pod 崩溃的实际错误。请记住,它只是显示STATUS列中发生的循环。您需要找到影响容器的潜在错误。

与实际应用程序相关的一些错误是:

  • 错误配置: 就像配置文件中的错误配置
  • 资源不可用: 例如未挂载的 PersistentVolume
  • 错误的命令行参数: 要么丢失,要么不正确的命令行参数
  • bug 和异常: 这可以是任何异常,对你的应用来说都是非常具体的

最后是网络和权限的错误:

  • 您试图绑定被占用的端口。
  • 内存限制太低,容器被 Out Of Memory 杀死。
  • liveness 探针返回错误,未报告 Pod 已 Ready。
  • 只读文件系统,或缺乏权限。

以上这些只是可能原因的列表,可能还有很多其他原因。

现在让我们看看如何深入挖掘并找到真正的原因。

调试、排障和修复

上文,了解到 pod 最终处于 CrashLoopBackOff 状态的原因有很多。现在,怎么知道是哪个在影响?让我们回顾一下可以用来调试它的一些命令,以及使用它的顺序。

这可能是我们最好的做法:

  1. 检查pod 描述
  2. 检查pod 日志
  3. 检查 events
  4. 检查 deployment
1.查看 pod 描述:kubectl describe pod

kubectl describe pod命令提供特定 Pod 及其容器的详细信息:

$ kubectl describe pod the-pod-name
Name:         the-pod-name
Namespace:    default
Priority:     0
…
State:          Waiting
Reason:       CrashLoopBackOff
Last State:     Terminated
Reason:       Error
…
Warning  BackOff                1m (x5 over 1m)   kubelet, ip-10-0-9-132.us-east-2.compute.internal  Back-off restarting failed container
…

从描述输出中,您可以提取以下信息:

  • 当前 podStateWaiting.
  • 等待状态的 原因是 CrashLoopBackOff
  • 上一个 状态是 Terminated
  • 上次终止的原因Error

这与我们一直在解释的循环行为一致。

通过使用kubectl describe pod,您可以检查以下配置错误:

  • Pod 定义
  • 容器
  • 为容器拉取的 镜像
  • 为容器分配的 资源
  • 错误或缺少的 参数
Warning  BackOff                1m (x5 over 1m)   kubelet, ip-10-0-9-132.us-east-2.compute.internal  Back-off restarting failed container

在最后几行中,您会看到与此 pod 关联的最后一个事件的列表,其中之一是"Back-off restarting failed container",这是重启循环的事件。即使发生了多次重新启动,也应该只有一行。

2.查看日志:kubectl logs

您可以查看 pod 的所有容器的日志:

kubectl logs mypod --all-containers

或者指定的容器:

kubectl logs mypod -c mycontainer

日志可能会显示有用的信息。

3.查看事件:kubectl get events

可以列出相关的事件:

kubectl get events

或者,您可以使用以下命令列出单个 Pod 的所有事件:

kubectl get events --field-selector involvedObject.name=mypod

请注意,此信息也出现在describe pod输出的底部。

4.检查部署:kubectl describe deployment

您可以通过以下方式获取此信息:

kubectl describe deployment mydeployment

如果deployment定义了所需的 Pod 状态,它可能包含导致 CrashLoopBackOff 的错误配置。

结合起来看

在下面的示例中,您可以看到如何挖掘日志,在其中发现命令参数中的错误。

如何检测k8s集群中的 CrashLoopBackOff

调试 Crashloopbackoff。它显示了三个终端以及几个调试命令之间的关系。

在 Prometheus 中检测 CrashLoopBackOff

如果您使用 Prometheus 进行监控,这里有一些提示可以帮助您在发生 CrashLoopBackOff时发出警报。

使用以下表达式,可以快速扫描集群中处于CrashLoopBackOff状态的容器。您需要提前部署 Kube State Metrics

https://github.com/kubernetes/kube-state-metrics

kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff"} == 1

如何检测k8s集群中的 CrashLoopBackOff

检测 pod 状态为 CrashLoopBackOff 的 PromQL 示例

或者,你可以用以下方法跟踪 pod 发生的重启次数:

rate(kube_pod_container_status_restarts_total[5m]) > 0

如何检测k8s集群中的 CrashLoopBackOff

基于重启率检测 CrashLoopBackOff 的 PromQL 示例

**警告:**并非集群中发生的所有重启都与 CrashLoopBackOff 状态有关。

如何检测k8s集群中的 CrashLoopBackOff

重新启动和 crashloopbackoff 之间的相关性。并非所有重启都是由 crashloopbackoff 引起的

在每个 CrashLoopBackOff 周期之后应该有一个重新启动 (1),但可能有与 CrashLoopBackOff (2) 无关的重新启动。

可以创建如下所示的 Prometheus 警报规则,当任何 pod 处于此状态时接收通知:

- alert: RestartsAlert
  expr: rate(kube_pod_container_status_restarts_total[5m]) > 0
  for: 10m
  labels:
    severity: warning
  annotations:
    summary: Pod is being restarted
  description: Pod {{ $labels.pod }} in {{ $labels.namespace }} has a container {{ $labels.container }} which is being restarted

结论

在这篇文章中,我们看到了 CrashLoopBackOff 本身并不是一个错误,而只是一个在 pod 中发生的重试循环的通知。

我们看到了它所经过的状态的描述,以及如何使用kubectl命令跟踪它。

此外,我们还看到了可能导致此状态的常见错误配置,以及您可以使用哪些工具来调试它。

最后,我们回顾了 Prometheus 如何帮助跟踪和提醒 Pod 中的 CrashLoopBackOff 事件。

虽然不是一个直观的消息,但 CrashLoopBackOff 是一个有用的概念,它是有意义的,没有什么可害怕的。文章来源地址https://www.toymoban.com/news/detail-494800.html

到了这里,关于如何检测k8s集群中的 CrashLoopBackOff的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8S如何部署Redis(单机、集群)

    在今天的讨论中,我们将深入研究如何将Redis数据库迁移到云端,以便更好地利用云计算的优势提高数据管理的灵活性。 Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis支持多种数据结构,如字符串、列表、集

    2024年02月11日
    浏览(33)
  • K8S下如何搭建eureka集群

    传统应用上云,基于传统应用需要考虑上云的方案和改造成本,这也是传统应用上云过程中的难点,本篇介绍3台eureka搭建的方案。 此方案借助了K8S中Service的一些功能。 这种方案是传统方案的简单迁移版本,比较易于理解;pod通过k8s的service提供稳定的访问url,pod ip是会经常

    2024年02月16日
    浏览(30)
  • 【k8s】:如何进行 Kubernetes 集群健康检查?

    💖The Begin💖点点关注,收藏不迷路💖 在使用 Kubernetes(k8s)部署应用程序时,保证集群的健康状态至关重要。通过定期的健康检查,可以及时发现并解决可能导致应用程序中断或故障的问题,确保集群的稳定性和可靠性。 将列出所有节点的状态,包括节点的名称、状态、版

    2024年04月16日
    浏览(31)
  • 如何重新启动k8s集群,并查看的状态

    重新启动k8s集群的方法取决于您使用的部署方式。 如果您使用的是kubeadm部署,可以使用以下命令重启集群: 如果您使用的是其他部署工具,请按照该工具的说明操作。 查看集群状态可以使用kubectl命令,如: 该命令会列出集群中所有节点的状态。 该命令会列出集群中所有命名

    2024年02月11日
    浏览(32)
  • 一步步教你如何搭建K8S集群

    三台CentOS7虚拟机,默认配置,内存2GB、处理器2核心。 先更新下系统 1、配置阿里源 官网这种带 google 的一看就会被墙,我们直接使用阿里的源: 设置完源后再更新一下: 2、禁用 SELinux 将 SELinux 设置为 permissive 模式,相当于将其禁用 3、关闭防火墙 4、关闭 swap 5、安装并启用

    2024年02月06日
    浏览(34)
  • 通过kube-apiserver访问K8s集群中的App

    K8s集群中的App(或者svc),通常使用ClusterIP,NodePort,Loadbalancer这些方式访问,但是你也可以通过Kube-apiserver(管理面)来访问App。 在《跟唐老师学习云网络 - Kubernetes网络实现》里面,提到K8s集群里面的容器,有几种访问方法: LoadBalancer Ingress ClusterIP NodePort 这里就不再分析

    2024年01月19日
    浏览(36)
  • rancher v2.8.1 如何成功注册已有 k8s 集群

    需要加入的集群为rke2部署的双节点集群 登陆 rancher 注意:直接执行截图中的命令,不要改动yaml内容。当执行完后注册集群的agent会报错,随后,我们通过 kubectl edit deploy cattle-cluster-agent -n cattle-system 命令添加 hostAlias ,其他方式会注册失败,例如:先修改yaml再apply执行。 格式

    2024年02月21日
    浏览(29)
  • K8S集群etcd 某个节点数据不一致如何修复 —— 筑梦之路

      二进制方式安装的k8s集群,etcd集群有3个节点,某天有一台机器hang住了,无法远程ssh登陆,于是被管理员直接重启了,重启后发现k8s集群删除一个deployment应用,多次刷新一会有,一会没有,于是在3个节点上执行etcd命令去查询该数据,发现被重启的节点上仍存在删除的该应

    2024年02月05日
    浏览(28)
  • k8s node 误删除了如何自动创建 csr重新加入集群

    worker node 节点当部署晚 kubelet、kube-proxy就会加入集群,如何加入呢, 集群收到新的 csr 参考: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/certificate-signing-requests/ https://blog.csdn.net/Michaelwubo/article/details/113769391

    2024年02月13日
    浏览(33)
  • 如何基于麒麟操作系统(Kylin)部署K8S集群(详细流程文档)

    序号 操作系统及版本 备注 1 Kylin V10 SP3 需求 CPU 内存 硬盘 角色 主机名 值 4C 8G 100GB master k8s-master01 值 4C 8G 100GB worker(node) k8s-worker01 值 4C 8G 100GB worker(node) k8s-worker02 1.3.1 主机名配置 由于本次使用3台主机完成kubernetes集群部署,其中1台为master节点,名称为k8s-master01;其中2台为work

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包