首页 > 其他分享 >Kubernetes故障排除要领

Kubernetes故障排除要领

时间:2023-05-13 16:31:34浏览次数:34  
标签:容器 命令 Kubernetes kubectl 要领 故障 pod 节点

要在最短的停机时间内运行应用程序,需要完善故障排除技能,将应用程序扩展到运行它们的Kubernetes集群。定期对整个Kubernetes集群进行调试和故障排除,以提供一致的支持和服务,这一点至关重要。故障排除包括识别、诊断和解决Kubernetes集群、节点、pod、容器和其他资源中的问题。

由于Kubernetes是一个复杂的系统,故障排除很有挑战性。问题可能发生在单个容器、一个或多个pod、控制器、控制平面组件或这些组件的组合中。这使得即使在小型的本地Kubernetes集群中也很难诊断和修复错误。如果在大规模生产环境中能见度有限,活动部件众多,问题就会恶化。

幸运的是,有一些成功的方法可以解决这些问题。本文探讨了最常见的Kubernetes问题和解决方案,包括ImagePullBackOff、CrashLoopBackOff、内存不足(OOM)错误、BackOffLimitsExceeded消息以及活跃度和就绪度探测问题。

Kubernetes故障排除速成

以下部分列出了一些最常见的Kubernetes错误消息和问题,当它们发生时识别它们的命令以及解决它们的技巧。


ImagePullBackOff
Kubernetes pod无法启动的一个原因是运行时无法从注册表中检索容器镜像。换句话说,pod不启动,因为清单中至少有一个指定的容器没有启动。

当pod遇到此问题时,kubectl get-pods命令将显示pod的状态为ImagePullBackOff。当镜像名称或标签错误地输入到pod清单中时,可能会发生此错误。在这种情况下,使用连接到docker注册表的任何集群节点的docker pull来确认正确的镜像名称。然后,在pod清单中更改它。

当容器注册表的权限和身份验证问题阻止pod检索镜像时,ImagePullBackOff也会出现。这通常发生在秘密持有凭据(ImagePullSecret)出现问题时,或者pod缺少所需的基于角色的访问控制(RBAC)角色时。要解决此问题,请确保pod和节点具有适当的权限和秘密,然后使用docker pull命令手动尝试该操作。

还可以通过为docker pull命令设置--v参数来更改日志的详细程度。打开日志级别以获取有关错误发生原因的详细信息。

如果不知道登录并提取镜像的ImagePullSecret的凭据或内容,可以按照以下步骤操作。

首先,使用kubectl get secret命令,将<SECRET_NAME>替换为要检索的ImagePullSecret的名称。

kubectl get secret <SECRET_NAME> -o JSON

上面的命令将输出秘密的JSON表示,其中包括包含base64编码凭证的数据字段。

要解码base64编码的凭据,可以使用base64命令,该命令在大多数类似Unix的操作系统中可用,包括Linux和macOS。例如:

kubectl get secret <SECRET_NAME> -o json | jq -r '.data.".dockerconfigjson"' | base64 --decode

该命令使用jq提取“.dockerconfigjson”字段的值,该字段包含base64编码的凭据,然后将输出通过管道传输到base64命令进行解码。

一旦获得了解码的凭据,就可以将它们与docker login命令一起使用,以通过docker注册表进行身份验证。例如:

docker login -u <USERNAME> -p <PASSWORD> <REGISTRY_URL>

将<USERNAME>和<PASSWORD>替换为从ImagePullSecret解码的凭据,将<REGISTRY_URL>替换为要进行身份验证的Docker注册表的URL。然后发出docker pull命令来测试拉取镜像。

CrashLoopBackOff

pod可能无法启动的另一个原因是无法在节点上调度指定的容器。当pod遇到此问题时,kubectl get-pods命令会将pod的状态显示为CrashLoopBackOff。

如果pod无法挂载请求的卷,或者节点没有运行pod所需的资源,则可能会发生此错误。要获取有关该错误的详细信息,请运行以下命令:

kubectl describe pod <pod name>

输出的末尾将有助于确定根本原因。如果原因是pod无法挂载请求的卷,请手动验证该卷,方法是确保清单正确指定其详细信息,并且pod可以使用这些定义访问存储卷。

或者,如果节点没有足够的资源,请手动从中删除pod,以便在另一个节点上调度pod。否则,可以扩大节点资源容量。

如果使用nodeSelector来安排pod在Kubernetes集群中的特定节点上运行,就会出现这种情况。

内存不足

当容器因OOM错误而终止时,通常会出现资源短缺或内存泄漏。

执行kubectl describe pod<pod name>命令,以确定pod中的容器是否已达到资源限制。如果是,终止的原因将显示为OOMKilled。此错误表示pod的容器试图使用的内存超过配置的限制。

要解决OOMKilled,作为pod规范的一部分,增加容器的内存限制。如果pod仍然失败,请检查应用程序中是否存在内存泄漏,并通过修复应用程序前端的内存泄漏问题来迅速解决。

为了最大限度地减少OOM错误的可能性并优化Kubernetes环境,可以定义在指定pod时容器需要多少资源,如CPU和内存。kube-scheduler根据容器的资源请求来选择哪个节点来引导pod。然后,kubelet为该容器分配该节点资源的一部分。此外,kubelet对已定义的容器强制执行资源限制,防止正在运行的容器使用超出预期的资源。

BackoffLimitExceeded

BackoffLimitExceeded表示Kubernetes作业在多次失败的重新启动后已达到其重试限制。

Kubernetes中的作业可以控制pod的运行时,监控其状态,并在pod失败时重新启动。backoffLimit是一个作业配置选项,用于控制pod失败的次数,并在作业最终被视为失败之前重试。此配置设置的默认值为6。这意味着作业将重试六次,之后重试将停止。可以执行kubectl describepod<pod name>命令来确定作业是否由于BackoffLimitExceeded错误而失败。

Kubernetes作业的成功或失败状态基于其管理的容器的最终退出代码。因此,如果作业的退出代码不是0,那么它就被视为失败。作业失败的原因有很多,包括指定的路径不存在,或者作业找不到要处理的输入文件。

可以通过对作业定义执行失败分析来克服此作业失败。执行kubectl logs<pod name>命令来检查pod的日志,通常会发现失败的原因。

探测器故障

为了监控和响应pod的状态,Kubernetes提供了探针(健康检查),以确保只有健康的pod才能为请求提供服务。每个探针(启动、活力和就绪)都有助于Kubernetes pod在不健康时自我修复。当探针处于挂起状态的时间过长,或者没有准备好或无法安排时,它可能会失败。

pod有四个阶段的生命周期:挂起、运行、成功和失败。其当前阶段取决于其主要容器的终止状态。如果pod处于挂起状态,则无法将其调度到节点上。在大多数情况下,由于缺乏资源而无法进行调度。

查看kubectl describe命令的输出将使你更加清楚。如果pod保持挂起状态,那么这可能是一个问题,根本原因可能是节点中的资源不足。或者,如果正在为容器指定一个不可用的主机端口,或者该端口已经在Kubernetes集群的所有节点中使用,那么pod可能还没有准备好。

不管失败的原因是什么,都可以使用kubectl describe pod命令来找出pod失败的原因。下一步将根据失败的原因而有所不同。例如,如果在容器中运行的应用程序的响应时间比配置的探针超时时间长,那么Kubernetes中的探针失败就会发生。通过增加探针超时、监视日志和手动测试探针进行故障排除。一旦确定了根本原因,就可以优化应用程序、扩大资源规模或调整探针配置。

结论

Kubernetes中的故障排除是一项艰巨的任务。然而,通过正确诊断问题并了解其背后的原因,你会发现故障排除过程更易于管理,也不那么令人沮丧。

Kubernetes故障排除允许你采取适当的步骤来解决组件中的问题并有效地解决这些问题。总是自下而上地处理问题,将帮助你更快地解决问题,方法是专注于pod等本地化资源,而不是跨多个组件的服务等资源。

标签:容器,命令,Kubernetes,kubectl,要领,故障,pod,节点
From: https://blog.51cto.com/u_15958350/6273755

相关文章

  • 云原生第三周--kubernetes组件详解
    etcd组件etcd简介:etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。etcd具有下面这些属性:完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免......
  • ORA-01172 ORA-01151 故障恢复---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:ORA-01172ORA-01151故障恢复作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]节点2报Error:Controlfilesequencenumberinfileheaderisdifferentfromtheoneinmemory,导......
  • kubernetes学习笔记27:etcd性能
    理解etcd性能:etcd集群架构图,包含raft层,storage层(storage层包含treeindex层和boltdb底层持久化存储key-value层),它们每一层都可能造成性能损失,raft层需要网络同步数据,网络io节点之间的rtt和带宽都会影响etcd性能,另外wal也会受到磁盘io的写入速度影响。storage层,磁盘iofdatasync延迟......
  • 服务器使用中硬盘故障的常规表现
    服务器使用中硬盘故障的常规表现 服务器硬盘作为服务器的核心数据仓库,所有用户数据以及软件都存在于此,它的稳定与安全与否直接决定着服务器数据安全。服务器每时每刻都需要对数据进行记录和读取,而这个过程也对服务器的硬盘有着很大的联系,硬盘就是服务器的一个主要存储空间,存储着......
  • Power Quality Disturbance:基于MATLAB/Simulink的各种电能质量扰动仿真模型,包括配电线
    PowerQualityDisturbance:基于MATLAB/Simulink的各种电能质量扰动仿真模型,包括配电线路故障、感应电机启动、变压器励磁、单相/三相非线性负载等模型,可用于模拟各种电能质量扰动和分析研究。附带一份详细的说明文档对各模型进行说明,便于理解。仿真条件:MATLAB/SimulinkR2015bID:9......
  • Kubernetes概述 (一篇教你认识k8s)
    一、Kubernetes概述 1.k8s是什么K8S的全称为Kubernetes(K12345678S),PS:“嘛,写全称也太累了吧,不如整个缩写”。作用:用于自动部署、扩展和管理“容器化(containerized)应用程序"的开源系统。可以理解成K8S是负责自动化运维管理多个容器化程序(比如Docker)的集群,是一......
  • Statcom:基于MATLAB/Simulink的静止无功补偿器仿真模型,负载端加入断路器模拟断路故障。
    Statcom:基于MATLAB/Simulink的静止无功补偿器仿真模型,负载端加入断路器模拟断路故障。仿真条件:MATLAB/SimulinkR2015bID:4750647354331368......
  • Kubernetes 使用 Ingress-nginx 实现灰度发布功能
    推荐阅读Helm3(K8S资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506Helm3(K8S资源对象管理工具)博客专栏:https://blog.csdn.net/xzk9381/category_10895812.html本文原文链接:https://blog.csdn.net/xzk9381/article/details/109570832,转载请注明出处。如有发现文......
  • KingbaseES V8R6 集群运维案例--备库timeline not contain minimum recovery point故
    ​案例现象:KingbaseESV8R6集群备库启动后,加入集群失败,sys_log日志信息提示,如下图所示:适用版本:kingbaseESV8R6一、问题分析在timeline对应的history文件中会记录每次timeline切换时所对应的lsn,如下图所示,在sys_wal目录下:.......-rw-------1kingbasekingbase1.2KFe......
  • KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障
    ​KingbaseESV8R6备份恢复案例之---system-Id不匹配备份故障案例说明:在KingbaseESV8R6执行备份时,在sys_log日志中出现system-id不一致的故障并伴随有归档失败,故障如下图所示:适用版本:KingbaseESV8R6一、问题分析1、查看当前数据库system-id可以通过sys_controldata-D......