5分钟全面认识 K8s:Deployment 详解

5分钟全面认识 K8s:Deployment 详解

在前一篇里,我们已经了解了 Pod 是 K8s 的最小调度单元。

这一篇我们继续往下走,看看 Deployment 为什么几乎是生产环境里最常用的工作负载对象。134

Deployment 的核心作用是:声明你想要多少个 Pod、如何更新、如何回滚,以及在异常时如何保持应用稳定134

一、Deployment 是什么

Deployment 是 Kubernetes 中用于管理无状态应用的工作负载对象。134

你可以通过它声明应用副本数、镜像版本、更新策略等,Kubernetes 会根据这些声明自动创建和维护底层 Pod。134简单说:

● 你写的是 Deployment

● K8s 实际管理的是它背后的 ReplicaSet 和 Pod

● 你关心的是 应用是否按预期运行134

二、为什么需要 Deployment

如果你直接创建 Pod,Pod 挂了之后通常不会自动补回来,也很难方便地做滚动更新和回滚。134

Deployment 解决的正是这个问题:它让你不需要手工盯着 Pod 的生命周期,而是通过声明式方式持续维护目标状态。134它带来的能力主要有:

副本管理

滚动更新

版本回滚

弹性扩缩容

自我修复134

三、Deployment 和 ReplicaSet 的关系

Deployment 并不直接管理 Pod,而是通过 ReplicaSet 间接管理 Pod。134

Deployment 负责描述"我要什么样的应用状态",ReplicaSet 负责保证指定数量的 Pod 一直存在。134你可以把它们理解成:

Deployment:总指挥

ReplicaSet:执行副本维护

Pod:真正跑应用的实例134

当你更新 Deployment 时,Kubernetes 通常会创建一个新的 ReplicaSet,再逐步替换旧 Pod,这就是滚动更新的基础。134

四、Deployment 的核心字段

一个 Deployment 的 YAML 里,最重要的字段一般包括:

metadata:名称、标签、命名空间等

spec.replicas:副本数

spec.selector:选择哪些 Pod 归它管理

spec.template:Pod 模板

spec.strategy:更新策略134

其中最关键的是 template。

因为 Deployment 本质上不是"一个容器配置",而是"一个创建 Pod 的模板"。134**

五、Deployment 是怎么工作的**

当你提交一个 Deployment 资源后,Kubernetes 会执行一套持续调谐流程。134

大致过程是:

● API Server 接收 Deployment 配置

● 配置被保存到集群状态中

● 控制器发现新的 Deployment

● 创建对应的 ReplicaSet

● ReplicaSet 根据副本数创建 Pod

● Scheduler 为 Pod 选择节点

● kubelet 在节点上拉起容器134

这个过程不是一次性的,而是持续运行的。

只要实际状态和你定义的期望状态不一致,控制器就会继续修正。134**

六、Deployment 的滚动更新**

Deployment 最常用的能力之一就是滚动更新134

当你把镜像版本从 v1 改成 v2,Kubernetes 不会把旧版本全部停掉再一次性启动新版本,而是按策略逐步替换,尽量保证服务可用。134

滚动更新的好处是:

● 降低停机风险

● 支持平滑升级

● 出问题时更容易回滚134

常见更新参数包括:

maxUnavailable:更新过程中最多允许多少 Pod 不可用

maxSurge:更新过程中最多允许额外新增多少 Pod134

这两个参数决定了升级过程是"更稳"还是"更快"。

七、Deployment 的回滚

如果新版本有问题,Deployment 允许你回滚到旧版本。134

这是生产环境特别重要的能力,因为它可以把故障恢复时间压缩得很短。134回滚的本质,是让 Deployment 再次把期望状态切回旧的配置。

**Kubernetes 会根据历史版本记录重新恢复之前的 ReplicaSet 和 Pod 状态。134**八、Deployment 的扩缩容

Deployment 也负责扩缩容。134

你可以手动修改副本数,也可以结合 HPA 让系统根据 CPU、内存或自定义指标自动伸缩。134例如:

● 流量上来时扩容

● 流量下降时缩容

这让应用具备更好的资源利用率和弹性。134

九、Deployment 适合什么场景

Deployment 主要适合无状态应用134

也就是那种 Pod 之间可以相互替换、状态不依赖本地磁盘、任意实例都能处理请求的应用。常见例子包括:

● Web 服务

● API 服务

● 后台无状态任务

● 前端服务134

如果应用需要稳定身份、固定存储、稳定网络标识,通常就更适合看 StatefulSet,而不是 Deployment。134

十、Deployment 和直接创建 Pod 的区别

对比项 直接创建 Pod 使用 Deployment
副本管理 需要手动处理 自动维护
故障恢复 能力弱 支持自愈
滚动更新 不方便 原生支持
回滚 不方便 原生支持
生产可用性 较弱 更适合生产

Deployment 的价值就在于:

它不是只创建一个 Pod,而是持续保证一组 Pod 的目标状态。134

十一、你可以怎么理解 Deployment

你可以把 Deployment 理解成"应用的长期管理器"。

● 它不关心某一个 Pod 具体是谁,而是关心:你要几个实例

● 你要什么版本

● 更新时怎么切换

● 出问题时怎么恢复134

这就是 Kubernetes 的声明式管理哲学:

不是你去盯容器,而是系统按照你的目标去维持容器。134

十二、这一篇最值得记住的三句话

Deployment 是管理无状态应用的核心对象

Deployment 通过 ReplicaSet 间接管理 Pod

滚动更新、回滚、扩缩容,都是 Deployment 的典型能力134

下一篇我们就讲:Service 详解,看看 K8s 是怎么解决 Pod IP 不稳定、服务发现和流量转发问题的。