摘要:从标签选择器、Pod 模板和 OwnerReference 理解 ReplicaSet 副本管理,掌握 Deployment 的滚动更新、回滚与发布排查。
1. Deployment、ReplicaSet 与 Pod 的职责
1. 什么是 Deployment?
Deployment 是 Kubernetes 中用于管理无状态应用的工作负载控制器。
它并不直接创建和管理容器,而是通过 ReplicaSet 间接管理 Pod。
架构关系:
flowchart TB
N0["Deployment"]
N1["ReplicaSet-v1"]
N2["ReplicaSet-v2"]
N3["Pod"]
N4["Pod"]
N5["Pod"]
N6["Pod"]
N7["Pod"]
N8["Pod"]
N0 --> N1
N0 --> N2
N1 --> N3
N1 --> N4
N1 --> N5
N2 --> N6
N2 --> N7
N2 --> N8
Deployment 负责:
- 创建 ReplicaSet。
- 管理 ReplicaSet 的版本。
- 控制 Pod 副本数量。
- 实现滚动更新。
- 实现版本回滚。
- 管理应用发布历史。
ReplicaSet 负责:
- 维护 Pod 副本数量。
- 发现异常 Pod。
- 创建新的 Pod 补充副本。
Pod 负责:
- 运行容器。
- 提供应用服务。
2. 为什么需要 Deployment?
对比一下:
| 能力 | Pod | ReplicaSet | Deployment |
|---|---|---|---|
| 运行容器 | 是 | 间接 | 间接 |
| 维持副本数量 | 否 | 是 | 是 |
| 自动补充 Pod | 否 | 是 | 是 |
| 滚动更新 | 否 | 否 | 是 |
| 版本回滚 | 否 | 否 | 是 |
| 发布历史管理 | 否 | 否 | 是 |
实际生产环境中:
无状态应用通常优先使用 Deployment,而不是直接使用 ReplicaSet。
2. ReplicaSet 是什么?
1. 基本概念
ReplicaSet 是 Kubernetes 中用于维护 Pod 副本数量的控制器。
它的核心任务是:
确保指定数量的 Pod 副本始终处于符合要求的状态。
例如,我们希望运行 3 个 Nginx Pod:
replicas: 3ReplicaSet 会持续检查实际 Pod 数量。
假设:
期望副本数:3
实际情况:
Pod-1 RunningPod-2 RunningPod-3 Running此时状态正常。
如果 Pod-2 意外退出:
期望副本数:3
实际情况:
Pod-1 RunningPod-2 TerminatedPod-3 RunningReplicaSet 发现实际副本数不足,就会创建新的 Pod。
Pod-1 RunningPod-2 TerminatedPod-3 RunningPod-4 Running(新创建)最终恢复到 3 个符合要求的副本。
注意:ReplicaSet 不是直接重启原来的 Pod,而是创建新的 Pod 来满足副本数量。
2. ReplicaSet 的工作原理
ReplicaSet 的核心是控制循环(Reconciliation Loop)。
工作过程:
flowchart TB
N0["ReplicaSet Controller"]
N1["获取期望副本数"]
N2["获取实际 Pod 数量"]
N3["比较两个数量"]
N4["创建 Pod"]
N5["删除 Pod"]
N6["再次检查状态"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 -->|"数量不足"| N4
N3 -->|"数量过多"| N5
N4 --> N6
N5 --> N6
这就是 Kubernetes 的声明式控制机制。
你只需要声明:
replicas: 3不需要自己编写程序不断检查 Pod 数量。
ReplicaSet Controller 会自动完成协调。
3. Label 与 Selector:标签查询与匹配规则
这是理解 ReplicaSet 的关键,也是 CKA 常见考点。
1. 什么是 Label?
Label(标签)是 Kubernetes 中附加在资源对象上的键值对。
例如:
metadata: labels: app: nginx env: production version: v1一个资源可以有多个标签。
标签本身只是元数据,不会自动产生管理行为。
真正利用标签进行资源筛选的是 Selector。
2. Label 查询命令
查看所有 Pod 的标签:
kubectl get pods --show-labels输出:
NAME LABELSnginx-1 app=nginx,env=prodnginx-2 app=nginx,env=testnginx-3 app=redis,env=prod根据标签查询:
kubectl get pods -l app=nginx查询多个标签:
kubectl get pods -l app=nginx,env=prod查询不包含某个标签:
kubectl get pods -l 'env!=test'3. Selector 的两种表达方式
Kubernetes 主要支持两类标签选择表达式:
1. 第一种:matchLabels
selector: matchLabels: app: nginx env: production含义:
app = nginxANDenv = production两个条件必须同时满足。
2. 第二种:matchExpressions
selector: matchExpressions: - key: app operator: In values: - nginx - apache表示:
app = nginxORapp = apache常见操作符:
| Operator | 含义 |
|---|---|
| In | 标签值属于指定集合 |
| NotIn | 标签值不属于指定集合 |
| Exists | 存在指定标签 |
| DoesNotExist | 不存在指定标签 |
例如:
selector: matchExpressions: - key: env operator: In values: - prod - test
- key: app operator: Exists表示:
env 属于 prod 或 testAND存在 app 标签注意:同一个 Selector 中的多个条件通常是 AND 关系;In 中的多个 values 才是 OR 关系。
4. ReplicaSet 如何识别和管理 Pod?
这是一个非常重要的底层原理。
假设我们创建了一个 ReplicaSet:
spec: replicas: 3 selector: matchLabels: app: nginx那么 ReplicaSet 会根据标签选择符合条件的 Pod。
例如,集群中存在:
Pod-A:app=nginxPod-B:app=nginxPod-C:app=redisPod-D:app=nginxReplicaSet 只会把符合选择器的 Pod 纳入管理。
但这里有一个重要问题:
如果某个 Pod 不是 ReplicaSet 创建的,只是恰好具有相同标签,会怎样?
答案:它也可能被 ReplicaSet 认领。
ReplicaSet 并不只管理自己创建的 Pod,还可以通过 Selector 发现符合条件且未被其他控制器认领的 Pod。
不过要注意:
- 已经被其他控制器管理的 Pod,不能被另一个 ReplicaSet 随意抢占。
- 被 ReplicaSet 认领后,会通过 OwnerReference 建立所属关系。
- 直接删除被管理的 Pod,ReplicaSet 仍会补充副本。
1. OwnerReference
Kubernetes 通过 OwnerReference 建立资源之间的所属关系。
例如:
flowchart TB
N0["ReplicaSet"]
N1["Pod"]
N0 -->|"OwnerReference"| N1
查看 Pod 的 OwnerReference:
kubectl get pod <pod-name> \ -o jsonpath='{.metadata.ownerReferences}'输出中可以看到类似:
[ { "apiVersion": "apps/v1", "kind": "ReplicaSet", "name": "nginx-rs" }]这表示 Pod 属于 nginx-rs。
OwnerReference 是 Kubernetes 管理资源生命周期和垃圾回收机制的重要基础。
5. ReplicaSet 的 YAML 结构
下面创建一个完整的 ReplicaSet。
1. 创建 ReplicaSet
新建文件:
vim replicaset.yaml编写:
apiVersion: apps/v1kind: ReplicaSet
metadata: name: nginx-rs
spec: replicas: 3
selector: matchLabels: app: nginx
template: metadata: labels: app: nginx
spec: containers: - name: nginx image: nginx:1.27 ports: - containerPort: 80这里有几个关键字段。
| 字段 | 作用 |
|---|---|
| apiVersion | API 版本 |
| kind | 资源类型 |
| metadata | ReplicaSet 自身的元数据 |
| replicas | 期望 Pod 数量 |
| selector | 选择需要管理的 Pod |
| template | 创建 Pod 使用的模板 |
其中最重要的是:
- replicas
- selector
- template
2. 理解 selector 和 template
这是 ReplicaSet 最容易出错的地方。
先看:
selector: matchLabels: app: nginx它表示 ReplicaSet 通过标签选择器寻找具有 app=nginx 标签的 Pod。
再看:
template: metadata: labels: app: nginx它表示 ReplicaSet 创建的 Pod 会自动携带 app=nginx 标签。
两者必须匹配。
标签匹配关系
flowchart TB
N0["ReplicaSet Selector<br/>app=nginx"]
N1["Pod Template<br/>labels: app=nginx<br/>匹配成功"]
N2["Pod-1<br/>app=nginx"]
N3["Pod-2<br/>app=nginx"]
N4["Pod-3<br/>app=nginx"]
N0 --> N1
N1 --> N2
N1 --> N3
N1 --> N4
如果标签不匹配,ReplicaSet 就无法正确管理自己创建的 Pod。
6. Deployment YAML 结构
1. 创建一个 Deployment
创建文件:
vim deployment.yaml编写:
apiVersion: apps/v1kind: Deployment
metadata: name: nginx-deployment
spec: replicas: 3
selector: matchLabels: app: nginx
template: metadata: labels: app: nginx
spec: containers: - name: nginx image: nginx:1.27 ports: - containerPort: 80创建:
kubectl apply -f deployment.yaml查看:
kubectl get deploymentskubectl get replicasetskubectl get pods你会看到:
NAME READY UP-TO-DATE AVAILABLEnginx-deployment 3/3 3 3同时会创建一个 ReplicaSet:
NAME DESIRED CURRENT READYnginx-deployment-xxxxxxxxxx 3 3 3以及三个 Pod。
2. Deployment 核心字段
| 字段 | 作用 |
|---|---|
| replicas | 期望副本数 |
| selector | 选择需要管理的 Pod |
| template | Pod 模板 |
| strategy | 更新策略 |
| minReadySeconds | Pod Ready 后至少稳定多久才算可用 |
| revisionHistoryLimit | 保留多少个旧 ReplicaSet 历史版本 |
| progressDeadlineSeconds | 部署进度超时判定时间 |
其中最重要的是 replicas、selector、template 和 strategy。
3. 查看 Deployment 的完整配置
kubectl get deployment nginx-deployment -o yaml查看运行状态:
kubectl describe deployment nginx-deployment查看 Deployment 管理的 ReplicaSet:
kubectl get rs7. Deployment 扩缩容(Scaling)
假设现在有一个运行 3 个 Pod 的 Deployment。
需要扩容到 5 个。
1. 使用 scale 命令
kubectl scale deployment nginx-deployment --replicas=5查看:
kubectl get deploymentkubectl get pods缩容到 2 个:
kubectl scale deployment nginx-deployment --replicas=22. 使用 YAML 修改
spec: replicas: 5执行:
kubectl apply -f deployment.yaml3. 使用 edit 修改
kubectl edit deployment nginx-deployment修改:
spec: replicas: 5保存退出即可。
4. 扩缩容的底层过程
flowchart TB
N0["kubectl scale"]
N1["Deployment.spec.replicas"]
N2["Deployment Controller"]
N3["ReplicaSet.spec.replicas"]
N4["ReplicaSet Controller"]
N5["创建或删除 Pod"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
注意:扩容和缩容一般不会触发新的 Deployment 版本发布,因为它们不改变 Pod 模板。
8. Deployment 更新策略(Deployment Strategy)
这是本节最重要的知识点,也是 CKA 高频考点。
Kubernetes Deployment 支持两种更新策略:
- RollingUpdate:滚动更新。
- Recreate:重新创建。
1. RollingUpdate(滚动更新)
滚动更新是 Deployment 默认使用的更新策略。
核心思想:
逐步创建新版本 Pod,同时逐步删除旧版本 Pod,尽可能保证应用持续可用。
假设:
- 当前有 4 个 Nginx 1.27 Pod。
- 需要升级到 Nginx 1.28。
- 副本数量为 4。
初始状态:
初始版本:nginx:1.27
Pod-1 v1.27
Pod-2 v1.27
Pod-3 v1.27
Pod-4 v1.27
4 个旧版本 Pod 正常运行
开始滚动更新:
阶段一:创建新版本 Pod
旧版
旧版
旧版
新版
3 个旧版 + 1 个新版
阶段二:逐步替换旧版本
旧版
旧版
新版
新版
2 个旧版 + 2 个新版
阶段三:完成升级
Pod-1 v1.28
Pod-2 v1.28
Pod-3 v1.28
Pod-4 v1.28
升级完成
实际替换过程由控制器根据更新参数、Pod 就绪状态和调度情况动态协调,并不一定严格按照上述每一步的数量执行。
1. RollingUpdate YAML
spec: replicas: 4
strategy: type: RollingUpdate
rollingUpdate: maxSurge: 1 maxUnavailable: 1这里有两个非常重要的参数。
2. maxSurge(最大超出数量)
表示滚动更新过程中,允许超过期望副本数的最大 Pod 数量。
例如:
replicas: 4
maxSurge: 1含义:
期望副本数:4最大额外副本:1
更新期间最多允许:4 + 1 = 5 个 Pod也就是说,更新过程中最多可以同时存在 5 个目标 Deployment 管理的旧、新版本 Pod。
3. maxUnavailable(最大不可用数量)
表示滚动更新期间,允许低于期望副本数的最大不可用 Pod 数量。
例如:
replicas: 4
maxUnavailable: 1含义:
期望副本数:4
最大不可用数量:1
至少保持:4 - 1 = 3 个可用副本注意,这里的 Available 是 Deployment 对 Pod 可用性的判断,不完全等同于容器进程处于 Running。
4. 两个参数如何配合?
假设:
replicas: 4
rollingUpdate: maxSurge: 1 maxUnavailable: 1则:
- 最多允许 5 个 Pod。
- 正常更新过程中至少保持 3 个 Available Pod。
比较一下:
| 参数 | 作用 | 影响 |
|---|---|---|
| maxSurge | 控制额外创建多少 Pod | 影响资源占用 |
| maxUnavailable | 控制允许多少 Pod 不可用 | 影响服务可用性 |
两者可以根据业务需求调整。
例如:
方案 A:尽可能保证可用性
maxSurge: 1maxUnavailable: 0先创建新 Pod,等新 Pod 可用后,再逐步删除旧 Pod。
方案 B:尽可能减少资源占用
maxSurge: 0maxUnavailable: 1不允许超过期望副本数,但允许暂时少一个可用副本。
重要规则:
- 两者可以使用整数。
- 也可以使用百分比,例如
25%。 - 默认
maxSurge为 25%。 - 默认
maxUnavailable为 25%。 - 两者不能同时为 0。
当使用百分比时:
- maxSurge 向上取整。
- maxUnavailable 向下取整。
例如,副本数为 5:
maxSurge: 25%maxUnavailable: 25%计算:
- maxSurge:5 × 25% = 1.25,向上取整为 2。
- maxUnavailable:5 × 25% = 1.25,向下取整为 1。
因此最多允许 7 个 Pod,至少保持 4 个 Available Pod。
5. Recreate(重新创建)
另一种更新策略是 Recreate。
它的核心思想:
先删除旧版本的 Pod,再创建新版本的 Pod。
例如:
flowchart TB
N0["初始状态:<br/>nginx-v1<br/>nginx-v1<br/>nginx-v1"]
N1["删除所有旧版本 Pod"]
N2["创建新版本 Pod"]
N3["nginx-v2<br/>nginx-v2<br/>nginx-v2"]
N0 --> N1
N1 --> N2
N2 --> N3
YAML:
spec: replicas: 3
strategy: type: Recreate特点:
- 不采用滚动替换。
- 旧版本 Pod 全部删除后,再创建新版本 Pod。
- 更新期间可能出现服务中断。
- 适用于不能同时运行新旧版本的应用。
例如:
某些应用升级时,新旧版本不能同时访问同一份数据或不能同时运行,这时可以考虑 Recreate。
6. 两种更新策略对比
| 对比 | RollingUpdate | Recreate |
|---|---|---|
| 更新方式 | 逐步替换 | 先删旧再建新 |
| 服务中断 | 可以尽量避免 | 通常会出现 |
| 新旧版本共存 | 可以 | 不会在正常更新过程中共存 |
| 资源需求 | 可能需要额外资源 | 不需要滚动更新的额外副本 |
| 默认策略 | 是 | 否 |
CKA 必考重点
记忆:
- RollingUpdate:滚动更新。
- Recreate:全部删除后重新创建。
9. Deployment 版本回滚(Rollback)
这是 Deployment 非常重要的功能。
假设:
v1:nginx:1.27v2:nginx:1.28v3:nginx:1.29现在升级到 v3 后发现应用异常。
需要回到 v2。
Kubernetes 可以通过 Deployment 的历史版本机制进行回滚。
1. 查看更新历史
kubectl rollout history deployment nginx-deployment输出示例:
REVISION CHANGE-CAUSE1 <none>2 <none>3 <none>每次 Pod 模板发生新的版本变更,通常会形成一个新的 Revision。
2. 查看某个版本详情
kubectl rollout history deployment nginx-deployment --revision=2可以查看该版本的 Pod 模板信息。
3. 回滚到上一个版本
kubectl rollout undo deployment nginx-deployment查看:
kubectl rollout status deployment nginx-deployment4. 回滚到指定版本
kubectl rollout undo deployment nginx-deployment \ --to-revision=2这样就可以回到 Revision 2。
5. 回滚的底层原理
Deployment 并不是简单地把旧 Pod 重新启动。
它主要通过调整旧 ReplicaSet 和新 ReplicaSet 的副本数,重新恢复目标版本。
例如:
flowchart TB
subgraph G0["回滚之前"]
direction TB
N0["Deployment"]
N1["RS-v1<br/>0 Pods"]
N2["RS-v2<br/>3 Pods"]
end
subgraph G1["回滚之后"]
direction TB
N3["Deployment"]
N4["RS-v1<br/>3 Pods"]
N5["RS-v2<br/>0 Pods"]
end
N0 --> N1
N0 --> N2
N3 --> N4
N3 --> N5
G0 -->|"rollout undo"| G1
因此,ReplicaSet 的历史记录非常重要。
10. Deployment Revision(版本历史管理)
前面我们已经使用了:
kubectl rollout history deployment nginx-deployment这里进一步理解 Revision。
1. 什么是 Revision?
Revision 是 Deployment 的发布版本记录。
当 Deployment 的 Pod 模板发生变化时,Deployment Controller 通常会创建新的 ReplicaSet,并形成新的 Revision。
例如:
| Revision | 镜像版本 | 副本数 |
|---|---|---|
| 1 | nginx:1.27 | 3 |
| 2 | nginx:1.28 | 3 |
| 3 | nginx:1.29 | 3 |
注意:仅仅修改副本数量,一般不会创建新的 Revision。
因为副本数量不属于 Pod 模板内容。
2. 设置版本变更原因
可以在 Deployment 中添加:
metadata: annotations: kubernetes.io/change-cause: "upgrade nginx to 1.28"这样查看历史记录时,就能看到版本变更原因。
也可以使用:
kubectl annotate deployment nginx-deployment \ kubernetes.io/change-cause="upgrade nginx to 1.28"注意:Annotation 是元数据。单独修改 Annotation 不会因为 Pod 模板变化而触发新的 ReplicaSet Revision。
3. 控制历史版本保留数量
Deployment 默认保留一定数量的旧 ReplicaSet 历史记录,默认值为 10。
可以修改:
spec: revisionHistoryLimit: 5表示最多保留 5 个旧版本 ReplicaSet 历史记录。
为什么需要限制?
因为每次更新都可能产生新的 ReplicaSet,如果无限保留,会增加集群中的历史资源数量。
注意:revisionHistoryLimit: 0 表示不保留旧版本历史 ReplicaSet,可能导致无法通过常规 Deployment 回滚到之前的版本。
11. Deployment 暂停与恢复更新
生产环境中,有时我们需要连续修改多个配置,但不希望每修改一次就触发一次发布。
这时可以使用暂停更新功能。
1. 暂停 Deployment
kubectl rollout pause deployment nginx-deployment2. 修改镜像
kubectl set image deployment/nginx-deployment \ nginx=nginx:1.293. 修改资源限制
kubectl set resources deployment nginx-deployment \ -c nginx \ --limits=cpu=500m,memory=512Mi4. 恢复更新
kubectl rollout resume deployment nginx-deployment查看:
kubectl rollout status deployment nginx-deployment整个过程:
flowchart TB
N0["Deployment"]
N1["暂停更新"]
N2["修改镜像"]
N3["修改资源限制"]
N4["恢复更新"]
N5["统一执行更新"]
N0 --> N1
N1 --> N2
N2 --> N3
N3 --> N4
N4 --> N5
注意:
暂停期间对 Pod 模板的修改不会立即启动新的滚动更新,恢复后才会继续协调。
12. Deployment 部署进度与超时控制
在生产环境中,还有一个问题:
如果新版本一直无法启动,Deployment 会怎样?
例如:
- 镜像无法拉取。
- Pod 一直无法调度。
- Readiness Probe 一直失败。
- 应用启动异常。
Deployment 提供了部署进度超时控制。
1. progressDeadlineSeconds
示例:
spec: progressDeadlineSeconds: 600表示:
如果 Deployment 在 600 秒内没有取得新的部署进展,就会被判定为 ProgressDeadlineExceeded。
可以查看:
kubectl describe deployment nginx-deployment可能看到:
Conditions: Type: Progressing Status: False Reason: ProgressDeadlineExceeded注意:
部署超时不意味着 Kubernetes 会自动回滚。
它主要是报告部署进度异常,之后仍可由控制器继续协调,也可以由运维人员主动回滚。
2. minReadySeconds
示例:
spec: minReadySeconds: 10含义:
Pod 变为 Ready 后,需要持续保持 Ready 至少 10 秒,才会被 Deployment 认为是 Available。
为什么需要这个配置?
假设应用刚启动时:
flowchart TB
N0["Pod 启动"]
N1["Ready"]
N2["运行 2 秒"]
N3["立即崩溃"]
N0 --> N1
N1 --> N2
N2 --> N3
如果没有稳定时间要求,Deployment 可能过早地认为新版本已经可用。
设置 minReadySeconds 可以让控制器等待一段稳定时间。
注意:它不会替代 Readiness Probe,也不会自动保证业务完全正常。
13. Deployment 与 Service 的关系
到目前为止,我们已经学习了:
- Deployment:管理应用副本。
- ReplicaSet:维持 Pod 数量。
- Pod:运行应用。
那么用户如何访问这些 Pod?
通常需要 Service。
架构:
flowchart TB
N0["Client"]
N1["Service"]
N2["Pod-1"]
N3["Pod-2"]
N4["Pod-3"]
N5["Deployment"]
N6["ReplicaSet"]
N0 --> N1
N1 -->|"请求"| N2
N1 -->|"请求"| N3
N1 -->|"请求"| N4
N5 -.->|"管理"| N6
N6 -.->|"管理"| N2
N6 -.->|"管理"| N3
N6 -.->|"管理"| N4
注意:Service 不直接管理 Deployment。
Service 主要通过 Label Selector 选择符合条件的 Pod,并提供稳定的访问入口。
例如:
Deployment 中的 Pod:
labels: app: nginxService:
apiVersion: v1kind: Servicemetadata: name: nginx-servicespec: selector: app: nginx ports: - port: 80 targetPort: 80 type: ClusterIP只要 Pod 的标签匹配,Service 就可以将流量转发给相应的就绪后端。
这也说明为什么标签设计非常重要:
- Deployment 使用 Selector 管理 Pod。
- Service 使用 Selector 选择流量后端。
二者可以使用相同的标签,但职责不同。
14. Deployment 配置示例
apiVersion: apps/v1kind: Deployment
metadata: name: web-app annotations: kubernetes.io/change-cause: "initial deployment"
spec: replicas: 3
revisionHistoryLimit: 5
minReadySeconds: 10
progressDeadlineSeconds: 600
selector: matchLabels: app: web
strategy: type: RollingUpdate
rollingUpdate: maxSurge: 1 maxUnavailable: 0
template: metadata: labels: app: web
spec: containers: - name: nginx image: nginx:1.27
ports: - containerPort: 80
resources: requests: cpu: 100m memory: 128Mi
limits: cpu: 500m memory: 256Mi
readinessProbe: httpGet: path: / port: 80 periodSeconds: 5
livenessProbe: httpGet: path: / port: 80 periodSeconds: 1015. ReplicaSet 常见故障排查
1. ReplicaSet 无法创建 Pod
检查:
kubectl describe rs nginx-rs重点查看 Events。
可能原因:
- Pod 模板 YAML 配置错误。
- 镜像不存在。
- 资源不足。
- 节点调度失败。
- 配额限制。
2. ReplicaSet 副本数量始终不正确
例如:
DESIRED CURRENT READY3 5 5可能原因:
Selector 匹配到了其他未被控制器认领的 Pod。
也可能是多个控制器的标签选择范围设计不合理。
检查:
kubectl get pods --show-labels检查 ReplicaSet 的选择器:
kubectl get rs nginx-rs -o yaml3. Pod 不断被创建和删除
重点检查:
- 是否存在多个 ReplicaSet 使用重叠的 Selector。
- 是否存在其他控制器管理相同标签的 Pod。
- 是否有手动修改标签的行为。
- 是否有其他自动化程序修改副本数。
生产环境中应避免多个控制器对同一批 Pod 形成重叠管理。
16. 常用命令
1. Deployment 命令
建议把下面这些命令练到不需要查阅文档就能使用。
| 操作 | 命令 |
|---|---|
| 查看 Deployment | kubectl get deploy |
| 查看详细信息 | kubectl describe deploy nginx |
| 创建 Deployment | kubectl create deployment nginx --image=nginx |
| 扩容 | kubectl scale deploy nginx --replicas=5 |
| 更新镜像 | kubectl set image deploy/nginx nginx=nginx:1.28 |
| 查看更新状态 | kubectl rollout status deploy/nginx |
| 查看更新历史 | kubectl rollout history deploy/nginx |
| 回滚上一个版本 | kubectl rollout undo deploy/nginx |
| 回滚指定版本 | kubectl rollout undo deploy/nginx --to-revision=2 |
| 暂停更新 | kubectl rollout pause deploy/nginx |
| 恢复更新 | kubectl rollout resume deploy/nginx |
| 重启 Deployment | kubectl rollout restart deploy/nginx |
| 编辑 Deployment | kubectl edit deploy nginx |
特别注意:
kubectl rollout restart deployment nginx它会触发 Pod 模板的重启更新,使 Pod 逐步重新创建,但不会改变镜像版本。
2. ReplicaSet 命令与级联删除
| 操作 | 命令 |
|---|---|
| 查看 ReplicaSet | kubectl get rs |
| 查看详细信息 | kubectl describe rs nginx-rs |
| 创建 ReplicaSet | kubectl apply -f rs.yaml |
| 扩容 | kubectl scale rs nginx-rs --replicas=5 |
| 修改副本数 | kubectl edit rs nginx-rs |
| 删除 ReplicaSet | kubectl delete rs nginx-rs |
| 查看标签 | kubectl get pods --show-labels |
| 按标签筛选 | kubectl get pods -l app=nginx |
| 查看 YAML | kubectl get rs nginx-rs -o yaml |
注意删除 ReplicaSet 时,默认会级联删除它管理的 Pod。如果只想删除 ReplicaSet、保留 Pod,可以使用:
kubectl delete rs nginx-rs --cascade=orphan17. 知识检查清单
Deployment 知识结构
flowchart LR
N0["Deployment<br/>无状态应用部署控制器"]
N1["副本管理<br/>replicas<br/>scale"]
N2["更新策略<br/>RollingUpdate<br/>Recreate"]
N3["发布控制<br/>pause / resume<br/>progressDeadlineSeconds"]
N4["版本管理<br/>Revision<br/>rollout undo"]
N0 --> N1
N0 --> N2
N0 --> N3
N0 --> N4
ReplicaSet 核心知识
- ReplicaSet 用于维护 Pod 副本数量。
- 通过 Selector 选择和管理 Pod。
- 通过 Template 创建新的 Pod。
- 通过控制循环不断协调实际状态与期望状态。
- 通过 OwnerReference 建立资源所属关系。
- ReplicaSet 可以认领符合条件且尚未被其他控制器认领的 Pod。
- Deployment 通常通过 ReplicaSet 实现应用发布与版本管理。