当前位置: 首页 > news >正文

使用 YAML 文件,如何优雅地删除 k8s 资源?


在 Kubernetes 中,删除资源是日常运维中不可避免的操作。如果你习惯了使用 kubectl createkubectl apply 来创建和更新资源,那么你可能也会想知道如何用同样基于文件的方式来删除它们。

虽然你总是可以用 kubectl delete deployment <name> 这种方式来删除,但基于文件的删除方法能更好地保持声明式管理的原则,特别是在 GitOps 实践中,它能确保集群的状态与你的代码仓库保持一致。

本文将介绍两种主流的、基于文件来删除 Kubernetes 资源的方法。

方法一:最直接的方式 —— kubectl delete -f

这是最常用、最简单、也最安全的方式。它的工作原理非常直接:读取你指定的 YAML 文件,然后删除文件中定义的所有资源。

如果你有一个名为 my-app.yaml 的文件,其中定义了一个 Deployment 和一个 Service

# my-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: my-app-deployment
spec:# ...---
apiVersion: v1
kind: Service
metadata:name: my-app-service
spec:# ...

要删除这两个资源,你只需运行一个命令:

kubectl delete -f my-app.yaml

优点:

  • 安全:你明确知道自己要删除哪些资源,因为它完全依赖于你指定的文件。
  • 简单:命令清晰,易于记忆和使用。
  • 高效:可以一次性删除文件中定义的所有资源。

方法二:最灵活的方式 —— kubectl apply --prune

这是一个更高级、更强大的命令,它不只是简单地删除,而是用于同步集群状态与本地配置文件

--prune(裁剪)标志的作用是:它会删除那些在你的本地文件中不存在,但在集群中存在在你的管理范围之内的资源。

这个方法通常用于以下场景:你将所有资源定义都放在一个目录里,当你想删除某个资源时,你只需从这个目录中移除对应的 YAML 文件,然后运行 apply --prune 命令。

命令格式:

kubectl apply --prune -f <file_or_directory> -l <selector_label>

需要注意的关键点:

  • --prune 必须与 -f(文件/目录)和 -l(标签选择器)一起使用。
  • -l 标签选择器至关重要! 它定义了 kubectl 应该管理的资源“边界”。没有这个边界,--prune 可能会误删整个命名空间中的所有资源。

一个简单的例子:

假设你的所有应用资源都带有一个 app=my-app 的标签。

  1. 最初,你的文件目录中有 deployment.yamlservice.yaml,都带有 app=my-app 标签。你使用 kubectl apply -f . 部署了它们。
  2. 现在,你决定不再需要 service.yaml。你从目录中删除了这个文件。
  3. 为了让集群状态与你的目录同步,你运行:
kubectl apply --prune -f . -l app=my-app

kubectl 会比较集群状态和你的文件目录:

  • 它发现 deployment 在文件中,所以会保留它。
  • 它发现 service 不在文件中,但它带有 app=my-app 标签,所以 kubectl 会自动将其删除

总结与选择

特性kubectl delete -fkubectl apply --prune
工作原理直接删除文件中定义的资源比较文件与集群状态,移除多余资源
主要用途手动或脚本化地删除特定资源保持集群与 Git 仓库的完全同步
风险低,你明确指定了要删除什么较高,如果标签选择器不当,可能误删

对于日常的、简单的删除操作,kubectl delete -f 是最安全和最推荐的选择。如果你正在实践 GitOps,并希望通过提交和删除 Git 仓库中的文件来自动化集群状态的变更,那么 kubectl apply --prune 将是你的强大工具。

http://www.dtcms.com/a/344258.html

相关文章:

  • Apache Druid SSRF漏洞复现(CVE-2025-27888)
  • 孤独伤感视频素材哪里找?分享热门伤感短视频素材资源网站
  • Sklearn 机器学习 房价预估 使用GBDT训练模型
  • 【Linux我做主】细说进程地址空间
  • Ansible入门:自动化运维基础
  • docker 打包
  • 前端项目打包+自动压缩打包文件+自动上传部署远程服务器
  • 设计模式笔记
  • 开题报告被退回?用《基于大数据的慢性肾病数据可视化分析系统》的Hadoop技术,一次通过不是梦
  • Matplotlib 可视化大师系列(五):plt.pie() - 展示组成部分的饼图
  • 故障诊断:基于大模型的实现方法与开源实践(从入门到精通)
  • Matplotlib 可视化大师系列(一):plt.plot() - 绘制折线图的利刃
  • linux----进度条实现和gcc编译
  • [MySQL数据库] MySQL优化策略
  • imx6ull-驱动开发篇35——设备树下的 platform 驱动实验
  • 【渗透测试】SQLmap实战:一键获取MySQL数据库权限
  • 如何在 Axios 中处理多个 baseURL 而不造成混乱
  • 用过redis哪些数据类型?Redis String 类型的底层实现是什么?
  • 【Java后端】 Spring Boot 集成 Redis 全攻略
  • java视频播放网站
  • 正点原子【第四期】Linux之驱动开发学习笔记-2.1LED灯驱动实验(直接操作寄存器)
  • 分布式与微服务
  • 20250822在Ubuntu24.04.2下指定以太网卡的IP地址
  • 深度学习入门详解:从神经网络到实践应用
  • 【English】复合句中的先行词在从句中是否充当成分
  • 吉利汽车与芯鼎微成立联合创新实验室共谱车规级LCoS显示新篇章
  • 面向RF设计人员的微带贴片天线计算器
  • Gamma校正硬件设计实现
  • Elasticsearch搜索原理
  • 加密狗如何抵御各类破解与攻击?深度解析加密狗多层保护机制