You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何清空Kubernetes节点内容?解决Pod删除后自动重建问题

如何彻底清空Kubernetes节点上的所有资源?

嘿,这个问题我太熟了——很多人刚开始玩K8s都会踩这个坑:删了Deployment以为完事,结果Pod又冒出来,本质就是没搞清楚K8s的资源层级关系!Deployment是上层控制器,它会管理ReplicaSet,而ReplicaSet才是直接负责维持Pod数量的角色。你之前单独删Deployment后Pod还重建,大概率是操作没到位(比如误删了Pod而非Deployment),或者还有其他控制器在兜底。下面给你一套彻底解决的方案:

一、先搞懂:为什么删Deployment后Pod还会回来?

如果你的操作是kubectl delete deployment <名称>,正常情况下Deployment会连带删除它管理的ReplicaSet,进而删除Pod。但如果Pod还在重建,要么是你只删了Pod(kubectl delete pod <名称>),要么是还有其他控制器(比如StatefulSet、DaemonSet)在管理这些Pod,或者是ReplicaSet没被彻底清理。

二、直接删除所有ReplicaSets的命令

如果你就是想先删掉所有ReplicaSet,分两种场景:

  • 单个命名空间内删除
    kubectl delete replicasets --all -n <你的命名空间>
    
  • 全集群所有命名空间删除
    kubectl delete replicasets --all --all-namespaces
    

⚠️ 注意:如果ReplicaSet是由Deployment、StatefulSet这类上层控制器创建的,你删完ReplicaSet后,上层控制器会立刻重新创建一个新的ReplicaSet,Pod还是会回来!所以这步只能临时清理,要彻底解决必须删上层控制器。

三、彻底清空节点的完整步骤

要让节点彻底干净,必须从上层控制器往下删,按这个顺序来:

  1. 删除所有能创建Pod的上层控制器
    先把Deployment、StatefulSet、DaemonSet、Job、CronJob这些“幕后老板”都删掉,它们是Pod不断重建的根源:

    • 单个命名空间:
      kubectl delete deployments,statefulsets,daemonsets,jobs,cronjobs --all -n <你的命名空间>
      
    • 全集群所有命名空间:
      kubectl delete deployments,statefulsets,daemonsets,jobs,cronjobs --all --all-namespaces
      
  2. 清理残留的ReplicaSet和Pod
    上层控制器删除后,理论上ReplicaSet和Pod会被连带删除,但偶尔会有残留,补这一步:

    kubectl delete replicasets,pods --all -n <你的命名空间>
    

    全集群版本:

    kubectl delete replicasets,pods --all --all-namespaces
    
  3. 可选:清空其他非Pod资源
    如果还要清理ConfigMap、Secret、Service这些不直接管Pod的资源,把它们加进去:

    kubectl delete configmaps,secrets,services,ingresses --all -n <你的命名空间>
    

四、如果只想清空单个特定节点的资源

如果你不是要清空整个命名空间/集群,只是想清理某一个节点上的所有资源,这么做:

  1. 先把节点标记为不可调度,防止新Pod跑上来:
    kubectl cordon <节点名称>
    
  2. 驱逐节点上的所有Pod(忽略DaemonSet,因为它会自动重建,后面单独删):
    kubectl drain <节点名称> --delete-emptydir-data --ignore-daemonsets
    
  3. 找到该节点上Pod对应的控制器(比如Deployment、ReplicaSet)并删除:
    先查看节点上的Pod所属控制器:
    kubectl get pods -n <命名空间> -o wide | grep <节点名称> | awk '{print $1}' | xargs kubectl describe pod -n <命名空间> | grep "Controlled By:"
    
    然后根据输出的控制器名称,用kubectl delete <控制器类型> <名称>删掉即可。

最后提醒

操作前一定要确认好资源范围!尤其是生产环境,千万别手滑删错了。如果是测试环境想快速清库,可以用kubectl delete all --all --all-namespaces,但这个命令不会删除ConfigMap、Secret这类资源,要彻底清还是得按上面的步骤来。

内容的提问来源于stack exchange,提问作者Mufeed

火山引擎 最新活动