2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

Kubernetes 部署失败的常见原因

  • 2017-03-06
  • 本文字数:1892 字

    阅读完需:约 6 分钟

最近一系列文章重点介绍了 Kubernetes 部署失败的 10 种常见原因。这些原因涵盖了从缺少输入和错误输入,到超出资源限制。在大多数情况下,kubectl describe 命令可以帮助确定背后的原因。

Kubernetes 部署的无效输入包括指定不存在的容器镜像,或者指定没有访问权限的容器镜像。因为默认的 registry 是 Dockerhub,所以如果使用了其它 registry (如 Amazon ECR 或 Quay.io),则需要指定 registry URL。私有 registry 在访问镜像时需要相关证书。 当要拉取的标签名称无效时,镜像拉取也可能遇到错误。比如在 latest 标签不存在但镜像存在时,镜像拉取就会失败(如果没有特别指定,“latest”就是默认标签)。此外网络问题也可能会导致错误。这类情况下的错误消息彼此间十分相似,因此需要更深入的检查以确定确切的原因。

Kubernetes 中的部署失败常常导致特定的 Pod 无法启动。可以使用“kubectl describe pod ”命令输出描述失败原因的事件日志。kubectl 命令采用“pod”,“replicaset”,和“deployment”参数。这些命令与“kubectl logs ”组合是调试部署失败的关键。

如果把 Kubernetes 中的默认策略设置为不总是从registry 中拉取,则即使提交了更新后的改动并推送镜像,这些改动也可能不可见。在产品中推荐的解决方法是为每个镜像分配唯一标签,并在拉取请求中使用这些标签。此外在部署配置中指定不存在的持久卷(persistent volumes)也可能导致部署失败。

另外两种无效输入是缺少程序运行时ConfigMap 或Secrets,以及无效的Spec 对象。 ConfigMap 是一组键值对的映射,该组键值对属于应用程序所需的配置数据。ConfigMap 可以被指定为CLI 参数,环境变量,或已安装卷中的文件。如果缺少了这些信息,那么Pod 创建会停止,并且状态被设置为“RunContainerError”。Secrets 是一种用于存储敏感数据(如证书)的机制。Secrets 缺失将导致类似的问题。ConfigMap 和Secrets 都可以安装为卷,如果安装失败,则容器创建停止,事件日志的状态停留在“ContainerCreating”。

另一种部署失败的原因是无效的Kubernetes Spec 对象,这些无效对象是由YAML 中的缩进错误或拼写错误所导致。通过基于CLI 的YAML 验证和使用–dry-run 参数,我们可以很容易地避免此类错误,如下所示:

kubectl create -f test-application.deploy.yaml --dry-run --validate=true

但该方法需要运行 Kubernetes 集群。移除对集群依赖的工作正在进行当中,同时也会提供对客户端验证的支持。YAML 验证可以被添加到源控制系统中,成为预提交钩子(pre-commit hook)的一部分。

另一类失败的Kubernetes 部署是因为超出资源限制。Pod 和容器都有指定的CPU 和内存限制。超出这些限制将导致无法创建Pod。调试该问题需要花一点精力。命令“kubectl describe deployment ”可以帮助我们获取ReplicaSet 的名称,此ReplicaSet 正是Kubernetes 所尝试去创建的。键入“kubectrl describe replicaset ”,并把上一步中获取的副本集(replica set)名称传递给它,就可以像在其它情况下一样,打印出事件日志,并显示错误消息。

部署失败也可能是因为超出资源配额。当团队间共享节点数固定的集群时,这种资源配额机制可以用来限制每个命名空间的资源消耗。资源包括Pod,服务和部署,以及计算资源的总量。 同样,在这种情况下,“kubectl describe”命令能够帮助我们挖掘出实际的错误消息。

当节点未充分使用资源时或者由于资源不足而无法运行Pod 时,集群自动调整程序(cluster autoscaler)会自动调整Kubernetes 集群大小。如果该自动调整程序未被启用,那么超出资源配额的部署将会失败,并且Pod 停留在“Pending”状态。 事件日志将显示出实际短缺的资源(由于该资源短缺而导致部署失败)。

应用程序行为的意外更改可能以不同的方式引起部署失败。应用程序崩溃常常会导致启动错误,该错误的错误消息是“CrashLoopBackOff”。应用程序日志可以帮助解决此问题。此外,如果配置错误或者响应超时, Liveness/Readiness 探测可能会停止工作,该探测被 Kubernetes 用来检测服务的健康情况。例如,URL 健康检查可能在应用程序中已发生变更,或者由于数据库变动,URL 健康检查可能无法正常工作。某些 URL 可能需要一段时间才能响应 Readiness 检查,这可能会超时并导致部署失败。

文章的作者已开源一个脚本,当创建失败时,该脚本可以在日志里打印出有用的相关信息。

查看英文原文: Common Reasons for Failed Kubernetes Deployments


感谢薛命灯对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-03-06 18:006004

评论

发布
暂无评论
发现更多内容

浅谈云原生安全

HummerCloud

云原生 云安全 云原生安全

大数据ELK(九):使用VSCode测试分词器

Lansonli

ELK 10月月更

面试官:说说Event Loop事件循环、微任务、宏任务

loveX001

JavaScript

promise执行顺序面试题令我头秃,你能作对几道

loveX001

JavaScript

多线程——死锁的原因和解决方案

StackOverflow

编程 多线程 10月月更

数据价值平台化输出:数据服务平台

小鲸数据

数据中台 接口管理 API接口管理 数据服务 数据服务平台

《MySQL入门很轻松》第4章:数据表中存放的数据类型

乌龟哥哥

9月月更

开发者有话说|我想给你讲一个故事

石云升

个人成长 9月月更

计算机网络——MAC地址、IP地址

StackOverflow

编程 计算机网络 10月月更

《MySQL入门很轻松》第5章:数据完整性及其分类

乌龟哥哥

9月月更

GaussDB(DWS)如何实现实时,批量和交付式查询一站式开发

乌龟哥哥

9月月更

Python之鸡兔同笼

芯动大师

9月月更 Python语法 鸡兔同笼

第1章:初识数据库与MySQL----数据库基本概念

乌龟哥哥

9月月更

《MySQL入门很轻松》第2章:MySQL管理工具介绍

乌龟哥哥

9月月更

阿里云搭建halo博客

乌龟哥哥

9月月更

linxu入门指令

乌龟哥哥

9月月更

2022-09-30:以下go语言代码输出什么?A: true true false true false; B: true false false true false; C: true true

福大大架构师每日一题

14个你必须要知道的ubuntu快捷键

乌龟哥哥

9月月更

腾讯云搭建wordpress网站超详细介绍

乌龟哥哥

9月月更

启动 Hello Spring Security Boot 应用

HoneyMoose

问:React的setState为什么是异步的?

beifeng1996

React

Java中的悲观锁和乐观锁是什么意思?其分类依据是啥?

wljslmz

Java 乐观锁 悲观锁 9月月更

极速体验SpringCloud Gateway

程序员欣宸

Java SpringCloud SpringCloud Gateway 9月月更

从单机百万tpmc到分布式千万tpmc,GaussDB性能提升的3个关键技术剖析

乌龟哥哥

9月月更

Python之简易计算器的制作

芯动大师

Python 9月月更 简易计算器

部署华为云DWS过程

乌龟哥哥

9月月更

测试

乌龟哥哥

9月月更

多线程(进阶)

StackOverflow

编程 多线程安全 10月月更

React面试:谈谈虚拟DOM,Diff算法与Key机制

beifeng1996

React

(WebFlux)004、WebFilter踩坑记录

编号94530

Spring Boot WebFlux Reactor3 WebFilter

Python之斐波那契数列的实现

芯动大师

Python 9月月更 斐波那契数列

Kubernetes部署失败的常见原因_DevOps & 平台工程_Hrishikesh Barua_InfoQ精选文章