写点什么

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

评论

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

ARM和X86云服务器的算力对比

Python研究所

签约计划

获5项大奖,发布《云计算开放应用架构标准》,阿里云持续领航云原生

阿里巴巴中间件

云计算 最佳实践 云原生 案例 白皮书

Fabric | 自动化神器

Python研究所

签约计划

云原生加速落地,金融行业应用上云来打样儿

BoCloud博云

云原生

公安局重点人员研判分析系统解决方案

MeterSphere | 超好用的开源测试平台

Python研究所

签约计划

面阿里P7,竟问这么简单的题目?

Java架构师迁哥

【得物技术】得物App分发平台的探索建设历程

得物技术

效率 平台 实践 心路历程 迭代

盘点golang中的开发神器

捉虫大师

Go 语言

智能IP先锋:从园区网络智能变革,到数字化转型新突破

脑极体

发展农村数字普惠金融的问题及对策分析

CECBC

论证:iOS安全性,为什么需要审核?

37手游iOS技术运营团队

ios SIP Sandbox iOS Developer ios安全

OKR 八问 —— 关于 OKR 的常见问题与思考

CODING DevOps

团队管理 DevOps OKR

100W点击 10w人获取,阿里Java高级面试题及答案 到底有多强

???

面试 java真题分享

如何评估 Serverless 服务能力?这份报告给出了 40 条标准

Serverless Devs

云计算 云原生 Forrester Wave #Serverless

牛x运维常用的工具系列-1

运维研习社

运维 工具分享 5月日更

极光开发者周刊【No.0528】

极光GPTBots-极光推送

程序员 开发者 开发者工具

使用Docker运行DataX定时全量备份关键数据表

白粥

DataX 数据表备份

5分钟速读之Rust权威指南(十二)

wzx

rust

🔎【Java源码探索】深入浅出的分析HashMap(JDK8)

码界西柚

Java 源码 源码分析 hashmap 5月日更

Vue-1-初识

Python研究所

签约计划

MPP大规模并行处理架构详解

五分钟学大数据

大数据 MPP 5月日更

🔎【Java 源码探索】深入浅出的分析ThreadLocal

码界西柚

Java 多线程 ThreadLocal 5月日更 ThreadLocalMap

人生算法:找到可复制的最小内核

石云升

读书笔记 5月日更 人生算法

40K成功入职:六年开发终获小米Offer(附面经+面试题+答案详解)

Java架构师迁哥

百余大企业共赴新文明之约:2021 DEMO WORLD 世界创新峰会拉开帷幕

创业邦

创新

AI年中钜惠来袭—全场低至6折 企业新客1元优享福利翻倍

百度大脑

福利 Iphone12

python脚本编写——自动剪切移动文件夹

YUKI0506

编曲新手可以用什么编曲软件?

奈奈的杂社

编曲 编曲宿主 编曲软件

脉脉3小时转发65w次!这份Java面试宝典发生了什么?

Java架构师迁哥

列举出常见的Java面试题,我靠这个在春招拿到了阿里的offer

???

面试 Java面经 java真题分享

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