kubernetes中常见的exited code总结

什么是容器退出码

当容器终止时,容器引擎使用退出码来报告容器终止的原因。如果是 Kubernetes 用户,容器故障是 pod 异常最常见的原因之一,了解常见的容器退出码可以帮助在排查时更快捷找到 pod异常的根本原因。可以参考https://komodor.com/learn/exit-codes-in-containers-and-kubernetes-the-complete-guide/
下面是容器常见的退出码:

退出码名称大致含义
0正常退出正常退出
1应用错误容器因代码程序错误或镜像规范中的错误引用停止
125容器未能运行docker run 命令没有执行成功
126命令调用错误无法调用镜像中指定的命令
127找不到文件或目录指定命令引用了不存在的文件或目录
128退出时使用的参数无效退出是用无效的退出码触发的(有效代码是 0-255 之间的整数)
134异常终止 (SIGABRT)容器使用 abort() 函数自行中止
137立即终止 (SIGKILL)容器被操作系统通过 SIGKILL 信号终止
139分段错误 (SIGSEGV)容器试图访问未分配给它的内存并被终止
143优雅终止 (SIGTERM)容器收到即将终止的警告,然后终止
255退出状态超出范围容器退出,返回可接受范围之外的退出代码,表示错误原因未知

说明:在使用kubernetes时,我们其实不需要记住具体的代码含义,很多时候,我们通过describe中event中的提示信息就能知道容器异常的原因。

下面我们将解释如何在宿主机和 Kubernetes 中对失败的容器进行故障排除,并提供有关上面列出的所有退出代码的更多详细信息。容器生命周期
为了更好地理解容器故障的原因,让我们先要了解容器的生命周期。以 Docker 为例 ,Docker 容器可能会处于以下几种状态之一:

  • Created:Docker 容器已创建但尚未启动(这是运行docker create 后但实际运行容器之前的状态)
  • Up:Docker 容器当前正在运行。这意味着容器管理的操作系统进程正在运行。当使用命令docker start 或docker run 时会发生这种情况,使用docker start 或docker run 可能会发生这种情况。
  • Paused:容器进程正在运行,但 Docker 暂停了容器。通常,当运行docker pause 命令时会发生这种情况
  • Exited:Docker 容器已经被终止,通常是由于容器的进程被杀死了

当一个容器达到 Exited 状态时,Docker 会在日志中报告一个退出码,告诉你容器发生了什么导致它退出。

了解容器退出码

下面我们将详细说明每个退出码。
退出码 0:正常退出
退出代码 0 由开发人员在任务完成后故意停止容器时触发。从技术上讲,退出代码 0 意味着前台进程未附加到特定容器。如果容器以退出码 0 终止怎么办?

  1. 检查容器日志,确定哪个库导致容器退出;
  2. 查看现有库的代码,并确定它触发退出码 0 的原因,以及它是否正常运行。

退出码 1:应用错误
退出代码 1 表示容器由于以下原因之一停止:

  1. 应用程序错误:这可能是容器运行的代码中的简单编程错误,例如“除以零”,也可能是与运行时环境相关的高级错误,例如 Java、Python 等;
  2. 无效引用:这意味着镜像规范引用了容器镜像中不存在的文件。

如果容器以退出码 1 终止怎么办?

  1. 检查容器日志以查看是否找不到映像规范中列出的文件之一。如果这是问题所在,请更正镜像以指向正确的路径和文件名。
  2. 如果您找不到不正确的文件引用,请检查容器日志以查找应用程序错误,并调试导致错误的库。

退出码 125:容器未能运行
退出码 125 表示该命令用于运行容器。例如 docker run 在 shell 中被调用但没有成功执行。以下是可能发生这种情况的常见原因:

  1. 命令中使用了未定义的 标志,例如docker run --margu;
  2. 镜像中用户的定义命令在本机权限不足;
  3. 容器引擎与宿主机操作系统或硬件不兼容。
    如果容器以退出码 125 终止怎么办?
  4. 检查运行容器的命令语法是否正确;
  5. 检查运行容器的用户,或者镜像中执行命令的上下文,是否有足够的权限在宿主机上创建容器;
  6. 如果您的容器引擎提供了运行容器的 option,请尝试它们。例如,在 Docker 中,尝试docker start 而不是docker run;
  7. 测试您是否能够使用相同的用户名或上下文在主机上运行其他容器。如果不能,重新安装容器引擎,或者解决容器引擎和主机设置之间的底层兼容性问题。

退出码 126:命令调用错误
退出码 126 表示无法调用容器镜像中使用的命令。这通常是用于运行容器的持续集成脚本中缺少依赖项或错误的原因。如果容器以退出码 126 终止怎么办?

  1. 检查容器日志,查看无法调用哪个命令;
  2. 尝试在没有命令的情况下运行容器以确保隔离问题;
  3. 对命令进行故障排除以确保您使用正确的语法,并且所有依赖项都可用;
  4. 更正容器规范并重试运行容器。

退出码 127:找不到文件或目录
退出码 127 表示容器中指定的命令引用了不存在的文件或目录。如果容器以退出码 127 终止怎么办?
与退出码 126 相同,识别失败的命令,并确保容器镜像中引用的文件名或文件路径真实有效。退出码

128:退出时使用的参数无效
退出码 128 表示容器 内的代码触发了退出命令,但没有提供有效的退出码。 Linux exit 命令只允许 0-255 之间的整数,因此如果进程以退出码 3.5 (小数)退出,则日志将报告退出代码 128。如果容器以退出码 128 终止怎么办?

  1. 检查容器日志以确定哪个库导致容器退出。
  2. 确定有问题的库在哪里使用了exit 命令,并更正它以提供有效的退出代码。

退出码 134:异常终止 (SIGABRT)
退出码 134 表示容器自身异常终止,关闭进程并刷新打开的流。此操作是不可逆的,类似 SIGKILL(请参阅下面的退出码 137)。进程可以通过执行以下操作之一来触发 SIGABRT:

1.调用libc 库中的abort() 函数;
2.调用assert() 宏,用于调试。如果断言为假,则该过程中止。

如果容器以退出码 134 终止怎么办?
1.检查容器日志,查看哪个库触发了SIGABRT 信号;
2. 检查中止进程是否是预期内的(例如,因为库处于调试模式),如果不是,则对库进行故障排除,并修改以避免中止容器。

退出码 137:立即终止 (SIGKILL)
退出码 137 表示容器已收到来自主机操作系统的 SIGKILL 信号。该信号指示进程立即终止,没有宽限期。可能的原因是:
1.当通过容器引擎杀死容器时触发,例如使用docker kill 命令时;
2.由 Linux 用户向进程发送kill -9 命令触发;
3.在尝试终止容器并等待 30 秒的宽限期后由 Kubernetes 触发(默认情况下);
4.由主机自动触发,通常是由于内存不足。在这种情况下,docker inspect 命令将指示OOMKilled 错误。

如果容器以退出码 137 终止怎么办?

  1. 检查主机上的日志,查看在容器终止之前发生了什么,以及在接收到SIGKILL 之前是否之前收到过SIGTERM 信号(优雅终止);
  2. 如果之前有SIGTERM 信号,请检查您的容器进程是否处理SIGTERM 并能够正常终止;
  3. 如果没有SIGTERM 并且容器报告了OOMKilled 错误,则排查主机上的内存问题。

退出码 139:分段错误 (SIGSEGV)
退出码 139 表示容器收到了来自操作系统的 SIGSEGV 信号。这表示分段错误 —— 内存违规,由容器试图访问它无权访问的内存位置引起。SIGSEGV 错误有三个常见原因:
1.编码错误:容器进程没有正确初始化,或者它试图通过指向先前释放的内存的指针来访问内存
2.二进制文件和库之间不兼容:容器进程运行的二进制文件与共享库不兼容,因此可能会尝试访问不适当的内存地址
3.硬件不兼容或配置错误:如果您在多个库中看到多个分段错误,则主机上的内存子系统可能存在问题或系统配置问题

如果容器以退出码 139 终止怎么办?

  1. 检查容器进程是否处理SIGSEGV。在 Linux 和 Windows 上,您都可以处理容器对分段错误的响应。例如,容器可以收集和报告堆栈跟踪;
  2. 如果您需要对SIGSEGV 进行进一步的故障排除,您可能需要将操作系统设置为即使在发生分段错误后也允许程序运行,以便进行调查和调试。然后,尝试故意造成分段错误并调试导致问题的库;
  3. 如果您无法复现问题,请检查主机上的内存子系统并排除内存配置故障。

退出码 143:优雅终止 (SIGTERM)
退出码 143 表示容器收到来自操作系统的 SIGTERM 信号,该信号要求容器正常终止,并且容器成功正常终止(否则您将看到退出码 137)。该退出码可能的原因是:
1.容器引擎停止容器时触发,例如使用docker stop 或docker-compose down 命令时;
2.由 Kubernetes 将 Pod 设置为 Terminating 状态触发,并给容器 30 秒的时间以正常关闭。

如果容器以退出码 143 终止怎么办?
1.检查主机日志,查看操作系统发送 SIGTERM 信号的上下文。如果您使用的是 Kubernetes,请检查 kubelet 日志,查看 pod 是否以及何时关闭。一般来说,退出码 143 不需要故障排除。这意味着容器在主机指示后正确关闭。

退出码 255:退出状态超出范围
当您看到退出码 255 时,意味着容器的 entrypoint 以该状态停止。这意味着容器停止了,但不知道是什么原因。如果容器以退出码 255 终止怎么办?

  1. 如果容器在虚拟机中运行,首先尝试删除虚拟机上配置的 overlay 网络并重新创建它们。
  2. 如果这不能解决问题,请尝试删除并重新创建虚拟机,然后在其上重新运行容器。
  3. 如果上述操作失败,则 bash 进入容器并检查有关 entrypoint 进程及其失败原因的日志或其他线索。

哪些 Kubernetes 错误与容器退出代码有关?
每当 pod 中容器发生故障,或者 Kubernetes 指示 pod 出于任何原因终止时,容器将关闭并记录退出代码。识别退出代码可以帮助您了解 pod 异常的根本原因。
可以使用以下命令查看 pod 错误:kubectl describe pod
如下所示:

[root@k8s-m1 k8s-volumes]# kubectl describe pod -n metallb-system  speaker-76lcc State:          WaitingReason:       CrashLoopBackOffLast State:     TerminatedReason:       ErrorExit Code:    1Started:      Mon, 24 Jul 2023 15:44:08 +0800Finished:     Mon, 24 Jul 2023 15:44:08 +0800Ready:          FalseRestart Count:  7876Environment:METALLB_NODE_NAME:       (v1:spec.nodeName)METALLB_HOST:            (v1:status.hostIP)METALLB_ML_BIND_ADDR:    (v1:status.podIP)METALLB_ML_LABELS:      app=metallb,component=speakerMETALLB_ML_SECRET_KEY:  <set to the key 'secretkey' in secret 'memberlist'>  Optional: falseMounts:/var/run/secrets/kubernetes.io/serviceaccount from speaker-token-z5mww (ro)

使用kubectl提供的退出代码解决问题:
如果退出代码为 0:容器正常退出,无需排查
如果退出代码在 1-128 之间:容器因内部错误而终止,例如镜像规范中缺少或无效的命令
如果退出代码在 129-255 之间:容器因操作信号而停止,例如 SIGKILL 或 SIGINT
如果退出代码是exit(-1)或 0-255 范围之外的另一个值,kubectl将其转换为 0-255 范围内的值。

如上,Exit Code为1 ,大致推断为程序内部错误。可以结合kubectl logs进行排查

[root@k8s-m1 k8s-volumes]# kubectl logs  -n metallb-system  speaker-76lcc 
{"branch":"HEAD","caller":"level.go:63","commit":"v0.11.0","goversion":"gc / go1.16.9 / amd64","level":"info","msg":"MetalLB speaker starting version 0.11.0 (commit v0.11.0, branch HEAD)","ts":"2023-07-24T07:49:13.848664833Z","version":"0.11.0"}
{"caller":"level.go:63","error":"Could not set up network transport: failed to obtain an address: Failed to start UDP listener on \"192.168.2.142\" port 7946: listen udp 192.168.2.142:7946: bind: address already in use","level":"error","msg":"failed to create memberlist","op":"startup","ts":"2023-07-24T07:49:13.84936419Z"}

发现是由于端口冲突造成。解决了端口冲突即可解决问题。

更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WebClient,HTTP Interface远程调用阿里云API

HTTP Interface Spring 允许我们通过定义接口的方式&#xff0c;给任意位置发送 http 请求&#xff0c;实现远程调用&#xff0c;可以用来简化 HTTP 远程访问。需要webflux场景才可 <dependency><groupId>org.springframework.boot</groupId><artifactId&…

Spring中最简单的过滤器和监听器

1. 过滤器概念引入 Filter也称之为过滤器&#xff0c;它是Servlet技术中最实用的技术&#xff0c;Web开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截&#xff0c;从而实现一些特殊的功…

uniapp 微信小程序:页面+组件的生命周期顺序

uniapp 微信小程序&#xff1a;页面组件的生命周期顺序 首页页面父组件子组件完整顺序参考资料 这个uniapp的微信小程序项目使用的是 VUE2 首页 首页只提供了一个跳转按钮。 <template><view><navigator url"/pages/myPage/myPage?namejerry" hov…

kafka服务端允许生产者发送最大消息体大小

1、kafka config服务端配置文件server.properties server.properties中加上的message.max.bytes配置&#xff0c;我目前设置为5242880&#xff0c;即5MB&#xff0c;可以根据实际情况增大。 message.max.bytes5242880 在生产者端配置max.request.size&#xff0c;这是单个消息…

【React】精选5题

第1题&#xff1a;简述下 React 的生命周期&#xff1f;每个生命周期都做了什么&#xff1f; React 组件的生命周期可以分为三个阶段&#xff1a;挂载阶段、更新阶段和卸载阶段。每个生命周期方法都有特定的目的和功能。 挂载阶段&#xff1a; constructor&#xff1a;组件的构…

protobuf入门实践2

如何在proto中定义一个rpc服务? syntax "proto3"; //声明protobuf的版本package fixbug; //声明了代码所在的包 &#xff08;对于C来说就是namespace)//下面的选项&#xff0c;表示生成service服务类和rpc方法描述&#xff0c; 默认是不生成的 option cc_generi…

如何正确使用npm常用命令

npm常用命令&#xff1a; 官方文档&#xff1a;CLI Commands | npm Docs 1. npm -v&#xff1a;查看 npm 版本 2. npm init&#xff1a;初始化后会出现一个 Package.json 配置文件&#xff0c;可以在后面加上 -y&#xff0c;快速跳到问答界面 3. npm install&#xff1a;会…

Iceberg 合并datafiles、manifest files,清除过期snapshot、删除孤立文件

本文Iceberg使用的为HiveCataLog&#xff0c;依赖HiveMemstore 1、首先获取要操作的表对象及SparkSession import org.apache.iceberg.{CatalogProperties, Table} import org.apache.iceberg.spark.actions.SparkActions ...... ...... ...... //获取表 val tabled: TableIden…

6个高清图片素材网站,免费下载,值得推荐~

关于图片素材网站&#xff0c;我一直都在推荐这几个&#xff0c;免费下载&#xff0c;可商用&#xff0c;建议收藏起来~ 菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 网站主要是为新手设计师提供免费素材的&#xff0c;素材的质量都很高&#xff0c;类别也很多&a…

在C++中 ,什么时候用:: ?什么时候用. ?什么时候用->?

在C中 &#xff0c;什么时候用:: ?什么时候用. ?什么时候用->?在 C 中&#xff0c;::、. 和 -> 是三种不同的运算符&#xff0c;用于访问类、结构体、命名空间、指针等的成员。它们的使用场景如下&#xff1a; ::&#xff08;作用域解析运算符&#xff09;&#xff1a…

Git移除commit过的大文件

前言&#xff1a;在提交推送本地更改至仓库时&#xff0c;误将大文件给提交了&#xff0c;导致push时报错文件过大&#xff0c;因此需要将已经commit的大文件移除后再push 若已知要删除的文件或文件夹路径&#xff0c;则可以从第4步开始 1.对仓库进行gc操作 $ git gc 2.查询…

23款奔驰S400豪华型升级后排电动腿托系统,提升后排乘坐舒适性

奔驰S400L后排座椅是不带腿托和脚托的&#xff0c;也没有一键躺平功能&#xff0c;相对于奔驰S级高配车型上配置的右边老板位座椅&#xff0c;舒适性就差强了一些。

【基于Spark的电影推荐系统】环境准备

概览 本科毕设做过电影推荐系统&#xff0c;但当时的推荐算法只有一个&#xff0c;现在已经忘记大部分了&#xff0c;当时也没有记录&#xff0c;因此写这个博客重新来记录一下。此外&#xff0c;技术栈由于快秋招原因来不及做过多的部分&#xff0c;因此只实现简单的功能&…

Vue.nextTick函数的用法及在异步更新中的应用

在Vue.js中&#xff0c;我们经常会遇到需要在DOM更新之后执行一些操作的情况。但是由于Vue的响应式更新是异步执行的&#xff0c;直接在更新数据后立即操作DOM可能得不到正确的结果。为了解决这个问题&#xff0c;Vue提供了Vue.nextTick函数。 Vue.nextTick函数是一个异步方法…

从零开始 Spring Cloud 7:Gateway

从零开始 Spring Cloud 7&#xff1a;Gateway 图源&#xff1a;laiketui.com Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨…

服务都挂了你还在打代码?

服务挂了&#xff1f; 线上服务在疯狂的报错&#xff0c;你还在悠哉悠哉的打代码&#xff0c;等到用户开始反馈问题&#xff0c;这时候才去线上查日志&#xff0c;黄花菜都凉了。老板&#xff1a;“去财务结一下账吧”。 异常告警 对于很多基础设施比较完善的公司&#xff0…

ICC2删除所有电源的方法

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f;知识星球入口 remove_pg_patterns -all remove_pg_strategies -all remove_pg_strategy_via_rules -all remove_pg_via_master_rules -all remove_pg_regions -all remove_routes -net_types {p…

网安周报 | 银行业成为开源软件供应链攻击的目标

网安周报是棱镜七彩推出的安全资讯专栏&#xff0c;旨在通过展示一周内发生的与开源安全、软件供应链安全相关攻击事件&#xff0c;让用户了解开源及软件供应链威胁&#xff0c;提高对安全的重视&#xff0c;做好防御措施。 1、银行业成为开源软件供应链攻击的目标 网络安全研…

微服务入门---SpringCloud(二)

微服务入门---SpringCloud&#xff08;二&#xff09; 1.Nacos配置管理1.1.统一配置管理1.1.1.在nacos中添加配置文件1.1.2.从微服务拉取配置 1.2.配置热更新1.2.1.方式一1.2.2.方式二 1.3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置…

vue2+wangEditor5富文本编辑器(图片视频自定义上传七牛云/服务器)

1、安装使用 安装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --save yarn add wangeditor/editor-for-vue # 或者 npm install wangeditor/editor-for-vue --save在main.js中引入样式 import wangeditor/editor/dist/css/style.css在使用编辑器的页…