在使用openshift的过程中(kubernetes原理一样),经常会发现由于docker daemon 僵死或者是网络通信状况不佳导致node失联,从而导致一些pod通过常规的手段无法删除,例如:oc delete pod <pod_name> -n <namespace>
或者kubectl delete pod <pod_name> -n <namespace>
一般来说kubernetes会将这种pod标记为Terminating或者Unknow
碰到这种情况有三种方法来解决:
- 首先可以尝试官方提供的强制删除命令
oc delete pod <pod_name> -n <namespaces> --force --grace-period=0
- 如果以上命令也无法删除,此时一般是由于
finalizers
导致的,通过kubectl edit
将finalizers
删除即可解决。
oc patch pod <pod_name> -p '{"metadata":{"finalizers":null}}'
- 如果第二条命令无法执行,或者报错。那么说明该pod的元数据的状态已经有冲突了。此时只能通过etcd删除该pod
# 首先查询到该pod的建,我这里的版本为etcd 3.2.5
# 其中ETCDCTL_API=3意思是使用v3版的api也可以通过export ETCDCTL_API=3来指定
# --prefix是指的以/为前缀的key --keys-only表示只列出key
ETCDCTL_API=3 etcdctl --cacert=/etc/etcd/ca.crt --cert=/etc/etcd/peer.crt --key=/etc/etcd/peer.key --endpoints="https://10.19.51.34:2379" get --prefix --keys-only /
/kubernetes.io/pods/openshift-web-console/webconsole-7f9d8454bf-422rs
/kubernetes.io/pods/openshift-web-console/webconsole-7f9d8454bf-lmfqt
/kubernetes.io/pods/openshift-web-console/webconsole-7f9d8454bf-szfck
/kubernetes.io/pods/paas-job/clear-xin-kong-1563732000-6jx5k
/kubernetes.io/pods/paas-job/clear-xin-kong-1563732000-hhm6d
# 此处以/kubernetes.io/pods/openshift-web-console/webconsole-7f9d8454bf-szfck为例
ETCDCTL_API=3 etcdctl --cacert=/etc/etcd/ca.crt --cert=/etc/etcd/peer.crt --key=/etc/etcd/peer.key --endpoints="https://10.19.51.34:2379" del /kubernetes.io/pods/openshift-web-console/webconsole-7f9d8454bf-szfck
以上三步基本上就能解决所有不能删除的pod了