删除 Deployment
学习目标
- 掌握删除 Deployment 的方法
- 理解删除的影响范围
- 掌握优雅删除的配置
核心概念
删除 Deployment
# 方式一:按名称删除
$ kubectl delete deployment nginx-deployment
# 方式二:使用 YAML 文件删除
$ kubectl delete -f deployment.yaml
# 方式三:删除所有 Deployment
$ kubectl delete deployments --all
# 方式四:删除特定命名空间的 Deployment
$ kubectl delete deployment nginx-deployment -n my-namespace
删除的影响范围
删除 Deployment 会级联删除:
Deployment
│
├── ReplicaSet ← 自动删除
│ │
│ ├── Pod 1 ← 自动删除
│ ├── Pod 2 ← 自动删除
│ └── Pod 3 ← 自动删除
│
└── ReplicaSet (旧版本) ← 自动删除
└── Pod (0)
删除 Deployment = 删除 Deployment + ReplicaSet + Pod
优雅删除
# 默认优雅删除(等待 30 秒)
$ kubectl delete deployment nginx-deployment
# 指定优雅删除时间
$ kubectl delete deployment nginx-deployment --grace-period=60
# 强制删除(不推荐)
$ kubectl delete deployment nginx-deployment --force
优雅删除过程
步骤 1: 发送删除信号
Deployment 标记为删除中
步骤 2: 删除 ReplicaSet
ReplicaSet 标记为删除中
步骤 3: 删除 Pod
向 Pod 发送 SIGTERM 信号
Pod 中的应用收到信号,开始优雅关闭
步骤 4: 等待优雅关闭
等待 gracePeriodSeconds(默认 30 秒)
应用应该在这段时间内完成清理
步骤 5: 强制终止
如果超时,发送 SIGKILL 强制终止
preStop Hook
spec:
template:
spec:
containers:
- name: app
image: my-app
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 10"]
用途:
- 在收到 SIGTERM 前执行清理操作
- 从负载均衡器注销
- 保存状态
- 关闭数据库连接
删除但保留 Pod
# 删除 Deployment 但不删除 Pod
$ kubectl delete deployment nginx-deployment --cascade=orphan
# Pod 会继续运行,但不再被 Deployment 管理
使用场景
1. 临时调试
- 删除 Deployment,保留 Pod 进行调试
2. 迁移
- 将 Pod 移交给其他控制器
3. 重建
- 删除 Deployment,稍后重建
确认删除
# 删除前确认
$ kubectl get deployment nginx-deployment
# 删除
$ kubectl delete deployment nginx-deployment
# 确认已删除
$ kubectl get deployment nginx-deployment
# 应该显示 "NotFound"
# 确认 Pod 已删除
$ kubectl get pods -l app=nginx
# 应该显示空
批量删除
# 删除所有 Deployment
$ kubectl delete deployments --all
# 删除特定标签的 Deployment
$ kubectl delete deployment -l app=nginx
# 删除特定命名空间的所有 Deployment
$ kubectl delete deployments --all -n my-namespace
# 删除所有命名空间的 Deployment(危险!)
$ kubectl delete deployments --all --all-namespaces
删除失败的处理
# 如果删除卡住
$ kubectl delete deployment nginx-deployment --force --grace-period=0
# 如果仍然卡住
$ kubectl patch deployment nginx-deployment -p '{"metadata":{"finalizers":null}}'
# 查看是否有终结器
$ kubectl get deployment nginx-deployment -o yaml | grep finalizers
实践练习
练习 1:基本删除
# 1. 创建 Deployment
$ kubectl create deployment web --image=nginx --replicas=3
# 2. 确认创建成功
$ kubectl get deployment web
$ kubectl get pods -l app=web
# 3. 删除 Deployment
$ kubectl delete deployment web
# 4. 确认已删除
$ kubectl get deployment web
$ kubectl get pods -l app=web
练习 2:优雅删除
# 1. 创建 Deployment
$ kubectl create deployment web --image=nginx --replicas=3
# 2. 删除并指定优雅时间
$ kubectl delete deployment web --grace-period=60
# 3. 观察删除过程
$ kubectl get pods -w
练习 3:级联删除
# 1. 创建 Deployment
$ kubectl create deployment web --image=nginx --replicas=3
# 2. 查看 ReplicaSet
$ kubectl get rs
# 3. 删除 Deployment
$ kubectl delete deployment web
# 4. 确认 ReplicaSet 也已删除
$ kubectl get rs
常见问题
1. 删除卡住
# 查看状态
$ kubectl get deployment web -o yaml | grep -A 5 finalizers
# 强制删除
$ kubectl delete deployment web --force --grace-period=0
2. 想要保留 Pod
# 使用 --cascade=orphan
$ kubectl delete deployment web --cascade=orphan
# Pod 会继续运行
$ kubectl get pods -l app=web
3. 误删除了 Deployment
# 如果有 YAML 文件,重新创建
$ kubectl apply -f deployment.yaml
# 如果没有,需要重新编写配置
小结
| 要点 | 说明 |
|---|---|
| 删除命令 | kubectl delete deployment <name> |
| 级联删除 | Deployment + ReplicaSet + Pod |
| 优雅删除 | 默认等待 30 秒 |
| 强制删除 | --force --grace-period=0 |
| 保留 Pod | --cascade=orphan |
| 批量删除 | --all 或 -l <label> |
练习编辑器
bash
Loading...