在 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
將是你的強大工具。