使用 YAML 文件,如何优雅地删除 k8s 资源?
在 Kubernetes 中,删除资源是日常运维中不可避免的操作。如果你习惯了使用 kubectl create
和 kubectl 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
的标签。
- 最初,你的文件目录中有
deployment.yaml
和service.yaml
,都带有app=my-app
标签。你使用kubectl apply -f .
部署了它们。 - 现在,你决定不再需要
service.yaml
。你从目录中删除了这个文件。 - 为了让集群状态与你的目录同步,你运行:
kubectl apply --prune -f . -l app=my-app
kubectl
会比较集群状态和你的文件目录:
- 它发现
deployment
在文件中,所以会保留它。 - 它发现
service
不在文件中,但它带有app=my-app
标签,所以kubectl
会自动将其删除。
总结与选择
特性 | kubectl delete -f | kubectl apply --prune |
---|---|---|
工作原理 | 直接删除文件中定义的资源 | 比较文件与集群状态,移除多余资源 |
主要用途 | 手动或脚本化地删除特定资源 | 保持集群与 Git 仓库的完全同步 |
风险 | 低,你明确指定了要删除什么 | 较高,如果标签选择器不当,可能误删 |
对于日常的、简单的删除操作,kubectl delete -f
是最安全和最推荐的选择。如果你正在实践 GitOps,并希望通过提交和删除 Git 仓库中的文件来自动化集群状态的变更,那么 kubectl apply --prune
将是你的强大工具。