Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubernetes 中容器的退出状态码参考指南

Kubernetes 中容器的退出状态码参考指南

作者头像
公众号: 云原生生态圈
发布于 2024-01-23 05:08:34
发布于 2024-01-23 05:08:34
60900
代码可运行
举报
文章被收录于专栏:云原生生态圈云原生生态圈
运行总次数:0
代码可运行

什么是容器退出码

容器终止时,容器引擎使用退出码来报告容器终止的原因。如果您是 Kubernetes 用户,容器故障是 pod 异常最常见的原因之一,了解容器退出码可以帮助您在排查时找到 pod 故障的根本原因。

以下是容器使用的最常见的退出码:

退出码

名称

含义

0

正常退出

开发者用来表明容器是正常退出

1

应用错误

容器因应用程序错误或镜像规范中的错误引用而停止

125

容器未能运行

docker run 命令没有执行成功

126

命令调用错误

无法调用镜像中指定的命令

127

找不到文件或目录

找不到镜像中指定的文件或目录

128

退出时使用的参数无效

退出是用无效的退出码触发的(有效代码是 0-255 之间的整数)

134

异常终止 (SIGABRT)

容器使用 abort() 函数自行中止

137

立即终止 (SIGKILL)

容器被操作系统通过 SIGKILL 信号终止

139

分段错误 (SIGSEGV)

容器试图访问未分配给它的内存并被终止

143

优雅终止 (SIGTERM)

容器收到即将终止的警告,然后终止

255

退出状态超出范围

容器退出,返回可接受范围之外的退出代码,表示错误原因未知

下面我们将解释如何在宿主机和 Kubernetes 中对失败的容器进行故障排除,并提供有关上面列出的所有退出代码的更多详细信息。

容器生命周期

为了更好地理解容器故障的原因,让我们先讨论容器的生命周期。以 Docker 为例 —— 在任何给定时间,Docker 容器都会处于以下几种状态之一:

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

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

了解容器退出码

下面我们将更详细地介绍每个退出码。

退出码 0:正常退出

退出代码 0 由开发人员在任务完成后故意停止容器时触发。从技术上讲,退出代码 0 意味着前台进程未附加到特定容器。

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

退出码 1:应用错误

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

  1. 应用程序错误:这可能是容器运行的代码中的简单编程错误,例如“除以零”,也可能是与运行时环境相关的高级错误,例如 JavaPython 等;
  2. 无效引用:这意味着镜像规范引用了容器镜像中不存在的文件。
如果容器以退出码 1 终止怎么办?
  1. 检查容器日志以查看是否找不到映像规范中列出的文件之一。如果这是问题所在,请更正镜像以指向正确的路径和文件名。
  2. 如果您找不到不正确的文件引用,请检查容器日志以查找应用程序错误,并调试导致错误的库。

退出码 125:容器未能运行

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

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

退出码 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

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

退出码 137:立即终止 (SIGKILL)

退出码 137 表示容器已收到来自主机操作系统的 SIGKILL 信号。该信号指示进程立即终止,没有宽限期。可能的原因是:

  • 当通过容器引擎杀死容器时触发,例如使用 docker kill 命令时;
  • 由 Linux 用户向进程发送 kill -9 命令触发;
  • 在尝试终止容器并等待 30 秒的宽限期后由 Kubernetes 触发(默认情况下);
  • 由主机自动触发,通常是由于内存不足。在这种情况下,docker inspect 命令将指示 OOMKilled 错误。
如果容器以退出码 137 终止怎么办?
  1. 检查主机上的日志,查看在容器终止之前发生了什么,以及在接收到 SIGKILL 之前是否之前收到过 SIGTERM 信号(优雅终止);
  2. 如果之前有 SIGTERM 信号,请检查您的容器进程是否处理 SIGTERM 并能够正常终止;
  3. 如果没有 SIGTERM 并且容器报告了 OOMKilled 错误,则排查主机上的内存问题。

退出码 139:分段错误 (SIGSEGV)

退出码 139 表示容器收到了来自操作系统的 SIGSEGV 信号。这表示分段错误 —— 内存违规,由容器试图访问它无权访问的内存位置引起。SIGSEGV 错误有三个常见原因:

  • 编码错误:容器进程没有正确初始化,或者它试图通过指向先前释放的内存的指针来访问内存
  • 二进制文件和库之间不兼容:容器进程运行的二进制文件与共享库不兼容,因此可能会尝试访问不适当的内存地址
  • 硬件不兼容或配置错误:如果您在多个库中看到多个分段错误,则主机上的内存子系统可能存在问题或系统配置问题
如果容器以退出码 139 终止怎么办?
  1. 检查容器进程是否处理 SIGSEGV。在 Linux 和 Windows 上,您都可以处理容器对分段错误的响应。例如,容器可以收集和报告堆栈跟踪;
  2. 如果您需要对 SIGSEGV 进行进一步的故障排除,您可能需要将操作系统设置为即使在发生分段错误后也允许程序运行,以便进行调查和调试。然后,尝试故意造成分段错误并调试导致问题的库;
  3. 如果您无法复现问题,请检查主机上的内存子系统并排除内存配置故障。

退出码 143:优雅终止 (SIGTERM)

退出码 143 表示容器收到来自操作系统的 SIGTERM 信号,该信号要求容器正常终止,并且容器成功正常终止(否则您将看到退出码 137)。该退出码可能的原因是:

  • 容器引擎停止容器时触发,例如使用 docker stopdocker-compose down 命令时;
  • 由 Kubernetes 将 Pod 设置为 Terminating 状态触发,并给容器 30 秒的时间以正常关闭。
如果容器以退出码 143 终止怎么办?

检查主机日志,查看操作系统发送 SIGTERM 信号的上下文。如果您使用的是 Kubernetes,请检查 kubelet 日志,查看 pod 是否以及何时关闭。

一般来说,退出码 143 不需要故障排除。这意味着容器在主机指示后正确关闭。

退出码 255:退出状态超出范围

当您看到退出码 255 时,意味着容器的 entrypoint 以该状态停止。这意味着容器停止了,但不知道是什么原因。

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

哪些 Kubernetes 错误与容器退出代码有关?

每当 pod 中容器发生故障,或者 Kubernetes 指示 pod 出于任何原因终止时,容器将关闭并记录退出代码。识别退出代码可以帮助您了解 pod 异常的根本原因。

您可以使用以下命令查看 pod 错误:kubectl describe pod [name]

结果将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Containers:
kubedns:
Container ID: ...
Image: ...
Image ID: ...
Ports: ...
Host Ports: ...
Args: ...
State: Running
   Started: Fri, 15 Oct 2021 12:06:01 +0800
Last State: Terminated
   Reason: Error
   Exit Code: 255
   Started: Fri, 15 Oct 2021 11:43:42 +0800
   Finished: Fri, 15 Oct 2021 12:05:17 +0800
Ready: True
Restart Count: 1

使用kubectl提供的退出代码解决问题:

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

请参阅上面的相关部分,了解如何对每个退出代码的容器进行故障排除。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生生态圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[译] SIGSEGV:Linux 容器中的分段错误(退出代码 139)
SIGSEGV,也称为分段违规或分段错误,是基于 Unix 的操作系统(如 Linux)使用的信号。它表示程序尝试在其分配的内存之外进行写入或读取,由于编程错误、软件或硬件兼容性问题或恶意攻击(例如缓冲区溢出)。
CS实验室
2022/08/01
8.9K0
[译] SIGSEGV:Linux 容器中的分段错误(退出代码 139)
[译] 容器和 Kubernetes 中的退出码完整指南
当容器终止时,容器引擎使用退出码来报告容器终止的原因。如果您是 Kubernetes 用户,容器故障是 pod 异常最常见的原因之一,了解容器退出码可以帮助您在排查时找到 pod 故障的根本原因。
CS实验室
2022/08/01
6.1K0
[译] 容器和 Kubernetes 中的退出码完整指南
解读Kubernetes常见退出码
在这篇文章中,我们将深入分析Kubernetes中的典型退出码127与137,解释它们是什么,K8s和Docker中常见的原因是什么,以及如何修复
zouyee
2024/03/04
6540
解读Kubernetes常见退出码
Kubernetes 如何优雅的重启Pod
在应用程序的整个生命周期中,正在运行的 pod 会由于多种原因而终止。在某些情况下,Kubernetes 会因用户输入(例如更新或删除 Deployment 时)而终止 pod。在其他情况下,Kubernetes 需要释放给定节点上的资源时会终止 pod。无论哪种情况,Kubernetes 都允许在 pod 中运行的容器在可配置的时间内正常关闭。
kubernetes中文社区
2022/10/27
4.5K0
Docker stop或者Docker kill为何不能停止容器
我们内部压力(cpu 80%,内存90%)通过stress (做页面压力测试)在容器内部做测试中,发现某几个时候通过
Criss@陈磊
2019/08/02
4.1K0
Kubernetes故障排查指南-分析容器退出状态码
大家在使用 Kubernetes 时,会遇到创建Pod失败,这时会分析什么原因导致创建Pod失败?
YP小站
2020/06/24
3.8K0
Kubernetes 问题定位技巧:分析 ExitCode
使用 kubectl describe pod 查看异常的 pod 的状态,在容器列表里看 State 字段,其中 ExitCode 即程序退出时的状态码,正常退出时为0。如果不为0,表示异常退出,我们可以分析下原因。
imroc
2018/12/21
2.7K0
Linux 信号(Signal)
我们经常会使用 kill 命令杀掉运行中的进程,对多次杀不死的进程进一步用 kill -9 干掉它。你可能知道这是在用 kill 命令向进程发送信号,优雅或粗暴的让进程退出。我们能向进程发送很多类型的信号,其中一些常见的信号 SIGINT 、SIGQUIT、 SIGTERM 和 SIGKILL 都是通知进程退出,但它们有什么区别呢?很多人经常把它们搞混,这篇文章会让你了解 Linux 的信号机制,以及一些常见信号的作用。
mazhen
2023/11/24
1.4K0
Linux 信号(Signal)
[译] SIGTERM:Linux 容器的优雅终止(退出代码 143)
SIGTERM(信号 15)在基于 Unix 的操作系统(如 Linux)中用于终止进程。SIGTERM 信号提供了一种优雅的方式来终止程序,使其有机会准备关闭并执行清理任务,或者在某些情况下拒绝关闭。Unix/Linux 进程可以以多种方式处理 SIGTERM,包括阻塞和忽略。
CS实验室
2022/08/01
12.3K0
[译] SIGTERM:Linux 容器的优雅终止(退出代码 143)
Kubernetes Pod 网络精髓:pause 容器详解
当检查你的 Kubernetes 集群的节点时,在节点上执行 docker ps 命令,你可能会注意到一些被称为“暂停”(pause)的容器,例如:
米开朗基杨
2020/02/14
9.6K0
Kubernetes Pod 网络精髓:pause 容器详解
PHP 容器化引发线上 502 错误状态码的修复
笔者所在公司技术栈为 Golang + PHP,目前部分项目已经逐步转 Go 语言重构,部分 PHP 业务短时间无法用 Go 重写。
仁扬
2023/08/01
4050
Docker核心技术之容器详解
容器(Container):容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何地方以相同的方式运行 Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。 容器具备一定的生命周期。 另外,可以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。
Lansonli
2021/10/09
2.2K0
【重识云原生】第六章容器6.4.2.1节——pod详解
        Pod是Kubernetes应用程序的最基本执行单元—是你创建或部署Kubernetes对象模型中的最小和最简单的单元。 Pod表示在集群上运行的进程。Pod封装了应用程序的容器(或者在某些情况下是多个容器)、存储资源、唯一的网络标识(IP地址)以及控制容器应该如何运行的选项。 Pod表示一个部署单元:Kubernetes中的应用程序的单个实例,该实例可能由单个容器或少量紧密耦合并共享资源的容器组成。Docker是Kubernetes Pod中最常见的容器,但Pods也支持其他容器。        Kubernetes集群中的Pod是如何管理容器的:
江中散人_Jun
2022/10/04
2.6K0
【重识云原生】第六章容器6.4.2.1节——pod详解
Kubernetes分析ExitCode
问题 最近总有开发小伙伴来找我,为什么我的容器总退出呢,在哪能看到原因。故写篇文章整理下docker退出的状态码。
院长技术
2020/06/11
5.1K0
kubernetes 实用技巧: 在 SHELL 中传递信号
在 Kubernetes 中,Pod 停止时 kubelet 会先给容器中的主进程发 SIGTERM 信号来通知进程进行 shutdown 以实现优雅停止,如果超时进程还未完全停止则会使用 SIGKILL 来强行终止。
imroc
2021/05/18
2.8K0
优雅地终止:Graceful Shutdown指南
您是否曾经因沮丧而拔掉电脑的电源线?虽然这似乎是一个快速解决方案,但它会导致数据丢失和系统不稳定。在软件世界中,存在类似的概念:硬关闭。这种突然的终止会导致与物理对应物相同的问题。值得庆幸的是,有一种更好的方法:优雅关闭。
云云众生s
2024/07/18
2030
优雅地终止:Graceful Shutdown指南
一个 Node 进程的死亡与善后
人固有一死,一个 Node 进程亦是如此,总有万般不愿也无法避免。从本篇文章我们看看一个进程灭亡时如何从容离去。
山月
2021/03/16
1.2K0
TKE学习笔记
GlobalRouter模式是在每个节点下起一个agent从整个VPC中指定一个子网进行通信和数据的传输。该模式其实就是在VPC下为每个节点分配一个子网进行网络通讯和传输
聂伟星
2020/06/08
1.6K0
Linux 信号
Linux进程间通信(Inter-Process communication, IPC)机制通常分6种:
Laikee
2022/04/25
5.1K0
Linux 信号
【Linux探索学习】第十七弹——进程终止:深入解析操作系统中的进程终止机制
https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482
GG Bond1
2024/11/30
4090
【Linux探索学习】第十七弹——进程终止:深入解析操作系统中的进程终止机制
相关推荐
[译] SIGSEGV:Linux 容器中的分段错误(退出代码 139)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验