写点什么

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

评论

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

NocoBase 本周更新汇总:新增路由管理

NocoBase

开源 低代码 零代码 无代码 版本更新

AI时代,Java程序员该何去何从

飞算JavaAI开发助手

2025年企业级网盘推荐:10款适合多人共享的工具

易成研发中心

云盘 网盘 企业网盘

企业必备工具:15款员工绩效管理系统推荐

易成研发中心

绩效考核系统

巨日禄AI:一站式创作漫画故事视频,百种画风赋美创作

编程猫

YashanDB数据操作

YashanDB

数据库 yashandb

IT项目管理中开发项目时都有哪些角色

易成研发中心

项目管理

大模型驱动智能合规 | 构建企业个保审计新范式

百度安全

写在2025 MWC前夕:AI与移动网络融合的“奇点时刻”

Alter

AI 5G

懒猫微服无缝连接你所有的设备

玄兴梦影

NAS 远程连接 异地组网 懒猫微服 设备互联

YashanDB索引操作

YashanDB

数据库 yashandb

一台电脑如何搞定手机矩阵(教你从网络搭建开始做矩阵)

kookeey代理严选

亚马逊 TikTok 跨境矩阵 跨进电商

如何建设IT运维管理体系

易成研发中心

IT运维管理

AI听力练习APP的测试

北京木奇移动技术有限公司

软件外包公司 AI口语练习 AI英语口语

用精准与效率说话,一招解决 SQL Server 迁移痛点

NineData

SqlServer NineData 国产化替代 云原生智能数据管理平台 上云迁移

薪酬与绩效管理十大主流厂商对比

易成研发中心

薪酬管理系统

《Operating System Concepts》阅读笔记:p159-p161

codists

操作系统

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