30·Deployment进阶

删除 Deployment

kubernetesdeploymentdelete

删除 Deployment

学习目标

  1. 掌握删除 Deployment 的方法
  2. 理解删除的影响范围
  3. 掌握优雅删除的配置

核心概念

删除 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...

继续学习

完成本课后,建议继续学习下一课「Service 是什么」 以巩固所学知识。