前言
- 管理 Kubernetes 的時候不時需要刪除一些資源;大部分的情況下可以輕鬆刪除,但偶而會 hang 住。
- 都先假設已經有裝
kubectl
囉 - 文中的 resource object 包含 pod, service, statefulset 等
說明
一般刪除方式
|
|
強迫刪除
- 有些狀況下,刪除的處理時間會過久,主要是看
[finalizer](https://kubernetes.io/docs/concepts/overview/working-with-objects/finalizers/)
到底在做什麼 - 如果真的卡住、想強迫刪除資源:
|
|
kubectl 版本如果小於 1.4,就不需要 --force
flag:
kubectl delete <resource_object> -n <namespace> --grace-periods=0
強迫刪除 namespace
- 預設是無法強迫刪除
namespace
的,即使給了--grace-periods=0
也是一樣。 - 這時候要:
手動方法:
- 手動
get
並存成 json - 清空 yaml 檔中的
finalizer
- 用
kubectl replace
通知 apiserver
|
|
|
|
像是這樣
|
|
然後 replace
套用:
|
|
快速方法
快速方法 - jq
|
|
jq
沒有支援直接更新原檔的參數 (類似sed -i
),所以要自行替換檔案
快速方法 - 如果沒有 jq
如果沒有 jq
、或是不方便安裝的話,就只好用 sed
了:
假設你的 namespace 是 my_namespace
:
|
|
- (像我) 懶得產生 JSON 檔的話,可以用這樣
echo
的方式;如果有檔案的話,就把最後的-f -
換成檔案路徑-f <file>.json
即可 export
是為了方便後續的sed
取用變數。
包成函數,方便需要重複使用的情境:
|
|
然後就可以用 for loop 批次處理,像是:
|
|
Note
- 強迫刪除 namespace 之前,如果確定該 namespace 底下的資源都要刪除,可以先
|
|
REF
- https://kubernetes.io/docs/concepts/overview/working-with-objects/finalizers/
- https://kubernetes.io/docs/tasks/run-application/force-delete-stateful-set-pod/
- https://godleon.github.io/blog/Kubernetes/k8s-CoreConcept-ResourceObject-Overview/
- https://medium.com/%E8%BC%95%E9%AC%86%E5%B0%8F%E5%93%81-pks%E8%88%87k8s%E7%9A%84%E9%BB%9E%E6%BB%B4/%E7%A7%BB%E9%99%A4%E8%A9%B2%E6%AD%BB%E7%9A%84terminating-namespace-c6594ebe351