Kubernetes 系列【11】控制器:Deployment(无状态部署控制器)

Kubernetes 系列【11】控制器:Deployment(无状态部署控制器)
文章目录1. 概述2. 无状态应用3. 工作原理3.1 首次创建3.2 滚动更新发布3.3 故障自愈流程3.4 水平扩缩容3.5 版本回滚4. 运行状态4.1 发布中 Progressing4.2 发布完成 Complete4.3 发布失败 Failed5. 资源清单编写规范5.1 通用顶层基础规范5.2 更新策略5.2.1 Recreate 重建更新5.2.2 RollingUpdate 滚动更新默认5.3 扩展配置字段5.4 历史版本清理策略1. 概述Deployment是K8s 最常用的控制器专门管理无状态应用比如Nginx、SpringBoot后端、网关等。Deployment不直接管理Pod而是创建、管理多个ReplicaSet由ReplicaSet真正管控Pod副本。ReplicaSet提供副本维持、标签筛选管控、缩容清理等能力。核心能力故障自愈持续比对replicas期望副本数Pod异常丢失时自动新建补齐无需人工操作。水平扩缩容修改spec.replicas手动调整实例搭配HPA可基于指标自动弹性扩缩。滚动更新更新配置生成新ReplicaSet先启动新Pod就绪再逐步销毁旧Pod服务不中断。版本回滚自动留存历史ReplicaSet发布故障时一键切回稳定版本快速恢复业务。多版本历史留存持久保存各发布版本ReplicaSet用于发布记录追溯、故障复盘。布对应的ReplicaSet支持查看历次发布配置、Pod版本用于发布记录追溯、故障复盘。✅ 适合无状态应用业务无本地持久化数据数据存外部Redis/MySQL❌ 不适合有状态业务MySQL、Redis集群、ZooKeeper等这类业务使用StatefulSet注意请勿手动管理Deployment所属的ReplicaSet。如果你的业务场景不在本文覆盖范围内可以前往Kubernetes官方代码仓库提交issue。2. 无状态应用无状态应用Stateless Application指服务实例本身不保存用户会话、业务上下文与持久业务数据单次请求不依赖上一次请求留存的信息所有状态数据统一交由数据库、缓存等外部组件存储各实例完全对等、可任意替换的应用程序。关键特征无本地存储依赖不在容器/服务器本地磁盘存业务数据、用户会话、缓存本地磁盘仅放程序二进制、日志日志可收集到外部。请求独立无上下文绑定用户第一次请求到实例 A 第二次调度到实例 B 结果完全一致不需要粘滞会话。实例完全可替换任意销毁、新增、重启实例业务不受影响扩容缩容简单。水平扩展友好直接多副本部署负载均衡分发流量。故障自愈成本低实例挂了调度器直接新建Pod顶替无需同步状态。和有状态应用对比维度无状态应用有状态应用StatefulSet数据存储数据外置DB/Redis本地持久卷、实例专属存储实例标识无固定身份随机Pod名稳定网络标识、有序域名扩缩容随时增减无序有序创建/删除有启动顺序典型组件Nginx、SpringBoot接口、微服务网关MySQL、Redis集群、Zookeeper、Elasticsearch无状态典型例子后端API服务SpringBoot、Node.js接口静态资源服务器Nginx网关、鉴权服务、定时任务worker图片处理、文件转换临时服务不属于无状态有状态典型例子单机MySQL、Redis本地持久化集群分布式注册中心ZooKeeper、etcd需要本地持久卷存数据的中间件云原生K8s无状态应用最佳实践配置、密钥外置使用ConfigMap、Secret不打包进镜像持久数据全部外置会话存Redis业务数据存数据库日志输出由EFK/Loki统一采集不落地本地盘不使用本地缓存做持久会话使用Deployment部署多副本随时滚动更新、重启健康检查只校验服务端口/接口不依赖本地数据3. 工作原理极简流程总结初次创建Deployment→ 生成ReplicaSet-v1→ReplicaSet创建指定数量Pod维持副本稳定。滚动更新修改Pod模板 → 新建ReplicaSet-v2→ 分批启动新Pod、销毁旧Pod零停机切换。故障自愈Pod异常消失 → 对应ReplicaSet自动新建Pod补齐replicas数量。水平扩缩容调整spec.replicas→ 活跃ReplicaSet增减Pod实现弹性扩容缩容。版本回滚指定历史版本 → 切换至旧ReplicaSet→ 逐步下线新版本Pod恢复业务。3.1 首次创建用户提交DeploymentYAML声明期望状态replicas副本数、Pod模板、更新策略等APIServer存储资源对象至etcdDeployment控制器持续监听资源变更Deployment控制器检测到无对应ReplicaSet自动创建第一个副本集ReplicaSet-v1ReplicaSet-v1执行调谐循环根据标签匹配创建对应数量Pod持续循环校验ReplicaSet保证Pod数量等于配置副本数完成初始部署。3.2 滚动更新发布修改Deployment内Pod模板镜像、环境变量、资源限制等并提交Deployment控制器感知配置变更生成全新副本集ReplicaSet-v2控制器按更新策略maxSurge/maxUnavailable执行分步调度先扩容新版本ReplicaSet-v2启动新Pod等待就绪探针就绪逐步缩容旧版本ReplicaSet-v1删除旧Pod交替完成新旧实例切换全过程新旧Pod并行业务不中断更新完成后保留历史ReplicaSet-v1用于后续版本回滚。3.3 故障自愈流程Node节点故障、Pod OOM、Pod被驱逐导致运行Pod数量少于replicas对应ReplicaSet实时比对期望副本数与实际Pod数量发现差值ReplicaSet自动新建同规格Pod补齐至目标副本数Deployment无需干预由底层ReplicaSet完成自愈动作。3.4 水平扩缩容修改Deployment的spec.replicas数值Deployment将副本数同步给所有关联ReplicaSet当前活跃版本的ReplicaSet根据差值新增/删除Pod完成扩容/缩容搭配HPA时可自动触发该流程基于监控指标动态调整副本。3.5 版本回滚执行回滚命令指定历史稳定版本Deployment控制器切换活跃副本集为历史ReplicaSet-v1逐步缩容新版本ReplicaSet-v2扩容旧版本ReplicaSet-v1完成新旧Pod切换业务快速恢复至发布前状态。HPA全称Horizontal Pod Autoscaler中文Pod水平自动扩缩控制器它会根据指定指标自动管理所有实现了scale子资源的资源对象的副本数量。是扩缩控制器只负责自动修改副本数不运行任何业务容器、不产生Pod因此不属于工作负载。4. 运行状态Deployment发布生命周期分为三种核心状态发布中Progressing发布完成Complete发布停滞Failed4.1 发布中 Progressing触发场景任意一种即进入该状态创建全新ReplicaSet首次部署/镜像更新扩容当前最新ReplicaSet缩容历史旧ReplicaSet新Pod就绪且稳定运行满足minReadySeconds控制器在status.conditions写入状态标识type: Progressing, status: True4.2 发布完成 Complete全部条件同时满足才判定发布完成所有Pod已更新至最新Pod模板全部副本标记为可用Available集群无旧版本Pod运行状态标识Progressing: Truereason: NewReplicaSetAvailable该状态会持续保留直到下一次更新触发。4.3 发布失败 Failed发布超时无法完成进入停滞失败状态。常见故障诱因镜像拉取失败、就绪探针故障、资源配额不足、权限缺失、容器参数异常、镜像名称错误。超时控制spec.progressDeadlineSeconds发布超时阈值默认600秒10分钟超时后Progressing: Falsereason: ProgressDeadlineExceeded。关键说明Kubernetes仅标记失败状态不会自动回滚需上层CI/CD工具监听状态实现自动回滚Deployment处于paused: true暂停状态时不计算发布超时临时故障修复后控制器自动继续发布状态恢复正常命令执行失败返回非0退出码1。发布失败不限制操作支持扩缩容、版本回滚、暂停发布、修改Pod模板。5. 资源清单编写规范Nginx Deployment模板覆盖全部规约字段示例# Deployment API 稳定版本apiVersion:apps/v1# 资源类型固定Deploymentkind:Deploymentmetadata:name:nginx-deploymentlabels:app:nginxspec:# 期望运行副本数可选默认1replicas:3# 标签选择器创建后不可修改必须匹配template标签selector:matchLabels:app:nginx# Pod模板spec内必填项template:metadata:labels:app:nginx# 与selector标签严格一致spec:# 重启策略仅允许AlwaysrestartPolicy:Alwayscontainers:-name:nginximage:nginx:1.24-alpineports:-containerPort:80# 滚动更新策略配置strategy:type:RollingUpdaterollingUpdate:maxUnavailable:1maxSurge:1# Pod就绪后稳定5秒才算可用minReadySeconds:5# 发布超时10分钟progressDeadlineSeconds:600# 保留5个历史版本用于回滚revisionHistoryLimit:5# 不暂停发布修改模板自动触发更新paused:false5.1 通用顶层基础规范所有K8s资源通用三要素apiVersion、kind、metadata。核心配置段spec不可省略spec内两个强制字段spec.templatePod模板、spec.selector标签筛选器Pod模板语法与独立Pod完全一致无需填写apiVersion/kindPod模板强制配置标签、重启策略restartPolicy仅允许Always默认spec.replicas可选期望副本数默认1selector约束必须与Pod模板标签完全匹配创建后不可修改禁止多控制器共用同一selector避免争抢Pod。5.2 更新策略spec.strategy.type二选一Recreate/RollingUpdate默认滚动更新5.2.1 Recreate 重建更新逻辑先销毁全部旧Pod再创建新版本Pod缺点发布期间服务完全中断补充手动删除Pod时ReplicaSet会立刻重建不会等待旧Pod终止若需要严格限制最大实例数选用StatefulSet。5.2.2 RollingUpdate 滚动更新默认两个核心参数控制发布节奏maxUnavailable更新期间最大不可用副本支持数值/百分比百分比向下取整默认25%maxSurge发布峰值可额外扩容的副本支持数值/百分比百分比向上取整默认25%。5.3 扩展配置字段扩展配置字段说明progressDeadlineSeconds发布超时秒数数值必须大于minReadySecondsminReadySecondsPod就绪后稳定运行时长达标才判定可用默认0terminatingReplicasv1.35 Beta默认开启开启特性门控DeploymentReplicaSetTerminatingReplicas缩容删除Pod进入Terminating销毁阶段短期总Pod数会临时超过replicas在Deploymentstatus中查看正在销毁的实例数量。paused布尔值true暂停发布修改Pod模板不会触发滚动更新false正常发布。5.4 历史版本清理策略spec.revisionHistoryLimit控制保留可回滚的旧 ReplicaSet 数量超出自动 GC 回收默认10。设为0全部清理历史副本集无法执行回滚长期卡住的发布历史ReplicaSet数量可能临时超出该阈值。查看历史版本命令kubectl rollouthistorydeployment/nginx-deployment# 回滚到指定版本kubectl rollout undo deployment/nginx-deployment --to-revision2