0.前言
在k8s集群中,通常我们删除pod和pod所依赖存储资源的顺序为:删除pod--> 删除pvc ---> 删除pv --> 删除名称空间,有些时候如果删除顺序不对比如先删除了namespace会导致kubelet阻塞,之后再删除pod就会出现pod一直处于terminate状态,这个时候就要采取一些强硬的手段或者特别的方法来删除pod、pv、pvc等资源,今天就来看下有哪些办法可以强制删除pod,pv,pvc和namespace等资源,并对集群本身没有太大影响。
1.强制删除pod
正常情况下删除pod的命令如下:
kubectl delete pod <pod-name> -n <namespace>
如果需要强制删除pod,就需要添加别的参数,命令如下:
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
--force:强制删除
--grace-period:表示过渡存活期,默认30s,在删除POD之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止POD
2.强制删除pv,pvc
遇到pv,pvc夯住的情况,使用删除命令是没用的,可以通过修改配置的方式从ectd中完全删除pv,pvc,命令如下: (1)删除pv
kubectl patch pv <pv-name> -p '{"metadata":{"finalizers":null}}'
(2)删除pvc
kubectl patch pvc <pvc-name> -p '{"metadata":{"finalizers":null}}'
其实都是修改finalizers字段,将其置为空。
3.强制删除namespace
正常的强制删除命令如下:
kubectl delete ns <terminating-namespace> --force --grace-period=0
如果执行以上命令没用,可以使用如下办法: (1)首先将namespace资源导入yaml文件
kubectl get namespace <terminating-namespace> -o yaml
(2)查看namespace中的finalizers字段
apiVersion: v1
kind: Namespace
metadata:
annotations:
cattle.io/status: '{"Conditions":[{"Type":"ResourceQuotaInit","Status":"True","Message":"","LastUpdateTime":"2024-12-24T03:45:30Z"},{"Type":"InitialRolesPopulated","Status":"True","Message":"","LastUpdateTime":"2024-12-24T03:45:30Z"}]}'
field.cattle.io/projectId: c-m-lmzvtvb5:p-k4h7v
lifecycle.cattle.io/create.namespace-auth: "true"
creationTimestamp: "2024-12-24T03:46:49Z"
labels:
field.cattle.io/projectId: p-k4h7v
kubernetes.io/metadata.name: <terminating-namespace>
name: <terminating-namespace>
resourceVersion: "28181022"
uid: 4019db96-7d9c-478b-bb17-4df80ab87ea3
spec:
finalizers:
- kubernetes
status:
phase: Terminating
(3)以json的格式导出namespace
kubectl get namespace <terminating-namespace> -o json ><terminating-namespace>.json
(4)编辑json文件
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"annotations": {
"cattle.io/status": "{\"Conditions\":[{\"Type\":\"ResourceQuotaInit\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2024-12-24T03:45:30Z\"},{\"Type\":\"InitialRolesPopulated\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2024-12-24T03:45:30Z\"}]}",
"field.cattle.io/projectId": "c-m-lmzvtvb5:p-k4h7v",
"lifecycle.cattle.io/create.namespace-auth": "true"
},
"creationTimestamp": "2024-12-24T03:46:49Z",
"labels": {
"field.cattle.io/projectId": "p-k4h7v",
"kubernetes.io/metadata.name": "<terminating-namespace>"
},
"name": "<terminating-namespace>",
"resourceVersion": "2818101",
"uid": "4019db96-7d9c-478b-bb17-4df80ab87ea3"
},
// "spec": {
// "finalizers": [] // 将这三行删除
// },
"status": {
"phase": "Terminating"
}
}
(5)开启kube-proxy
kubectl proxy
注意:执行该命令后,终端会被卡住,可以开启一个新的终端 (6)发起请求删除namespace
curl -k -H "Content-Type: application/json" -X PUT --data-binary @<terminating-namespace>.json http://127.0.0.1:8001/api/v1/namespaces/<terminating-namespace>/finalize
之后检查namespace,会发现namespace已经被删除掉了。
4.结语
虽然以上办法可以强制删除pod等资源,但在日常工作中还是少用为好,正确的操作更为重要。