写点什么

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:006373

评论

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

投稿开奖丨云服务器ECS征文活动(2&3月)奖励公布

阿里云弹性计算

云服务器 征文投稿开奖 玩转ECS

MySQL__数据处理之查询

编程江湖

《2022微隔离技术与安全用例研究报告》重磅发布 | 附PDF全文下载

青藤云安全

09-条件查询器Wrapper

爱好编程进阶

Java 程序员 后端开发

互联网用户画像,精准营销,数仓有妙招

华为云开发者联盟

位图 GaussDB(DWS) 用户画像 精准营销 Roaringbitmap

gRPC三种客户端类型实践【Java版】

FunTester

1024程序员节特别篇:Linux三十年的发展历程以及未来的走向

爱好编程进阶

Java 程序员 后端开发

15个经典面试问题及回答思路,很多人死在了最后一个问题上

爱好编程进阶

Java 程序员 后端开发

万亿储能的极限拉力赛

钛禾产业观察

JAVA异常情况如何处理?

源字节1号

后端开发

Carina 全新版本 V0.10发布 :支持裸盘作为存储卷

BoCloud博云

开源 本地存储

数据增强(三)-Batch Augmentation

AIWeker

人工智能 深度学习 数据增强 5月月更

2021-06-05# Java基础(dayFourteen):锁的两种方式

爱好编程进阶

Java 程序员 后端开发

直播预告|争夺存量用户关键战,助力企业构建完美标签体系

袋鼠云数栈

大数据 数据中台

如何真正将企业知识管理做出价值?

小炮

企业知识管理

盲盒系统开发盲盒源码搭建需要多长时间

WDL22119

让客户实现 AI 算力“自由”,博云与趋动科技完成算力调度容器化验证

BoCloud博云

AI

得物技术消息中间件应用的常见问题与方案

得物技术

kafka 分布式 MQ 中间件 消息队列

web技术支持| Web 客户端实现录音、录像

anyRTC开发者

前端 Web 音视频 WebRTC 视频通话

vue 自从使用了组件,工作量减去了一半

CRMEB

博云:Kubernetes 近年影响最大版本发布,这几点值得关注

BoCloud博云

Kubetnetes

存储卷指标消失之谜 | K8S Internals 系列第二期

BoCloud博云

Kubernetes kubelet

姐姐驾到 | 零基础小白如何学前端!

锋享前端

2021年证券类APP更新迭代检测专题分析(上)发布

易观分析

金融 券商App

告诉你使用预约小程序的9个理由

天天预约

小程序 SaaS 企业服务 预约工具

线程通信

急需上岸的小谢

5月月更

SAP 订单模型的编排方式概述

汪子熙

订单管理 订单 5月月更 b2b 编排系统

记一次存储系统IOPS翻倍的性能优化

Vincent

性能优化 存储系统

TiDB 6.0 新特性解读丨 Collation 规则

PingCAP

【国产】自动化运维ETL统一调度平台TASKCTL流程触发方式

敏捷调度TASKCTL

DevOps 分布式 数据仓库 ETL 自动化运维

案例分享|智慧广电的“宽带加速”之路,博睿数据来“私人定制”

博睿数据

数字化转型 博睿数据 智慧广电

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