简单说一下原因,一般情况下,刚创建的资源,还未使用的时候删除,肯定可以删除成功。一旦使用了资源,即使将使用了该资源的其他资源一并删除,再来删除该资源,还是失败。类似于当我们的电脑插入u盘时,拔掉之前,你确认你自己没有在使用u盘中的任何内容了,在手动弹出u盘时,还是提示被占用的类似信息。和Kubernetes这个BUG是异曲同工之妙,还是有一些未知的信息在占用着资源。(个人见解,仅供参考)

NameSpace

当ns处于Terminating状态时使用

方法1

# 把命令中的{NAMESPACE}改为自己要删除的ns
kubectl get namespace {NAMESPACE} -o json \
            | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
            | kubectl replace --raw /api/v1/namespaces/{NAMESPACE}/finalize -f -

方法2

需要用到kubelet的临时代理服务

# 新开一个终端运行以下命令
kubectl proxy
# 将会进入阻塞,此命令启动了一个代理服务来接收来自你本机的HTTP连接并转发至API服务器,同时处理身份认证

编写脚本,该脚本是复制网上大神的,我还没弄懂,欢迎大佬留言指教

#------------------------------------------------------------------------------------
#!/bin/bash

set -eo pipefail

die() { echo "$*" 1>&2 ; exit 1; }

need() {
        which "$1" &>/dev/null || die "Binary '$1' is missing but required"
}

# checking pre-reqs

need "jq"
need "curl"
need "kubectl"

PROJECT="$1"
shift

test -n "$PROJECT" || die "Missing arguments: kill-ns <namespace>"

kubectl proxy &>/dev/null &
PROXY_PID=$!
killproxy () {
        kill $PROXY_PID
}
trap killproxy EXIT

sleep 1 # give the proxy a second

kubectl get namespace "$PROJECT" -o json | jq 'del(.spec.finalizers[] | select("kubernetes"))' | curl -s -k -H "Content-Type: application/json" -X PUT -o /dev/null --data-binary @- http://localhost:8001/api/v1/namespaces/$PROJECT/finalize && echo "Killed namespace: $PROJECT"

运行脚本删除

bash 脚本 {NAMESPACE}

PV

当PV处于Terminating状态时使用

kubectl patch pv {PV} -p '{"metadata":{"finalizers":null}}'
# {PV}就是你要删除的PV名字

PVC

当PVC处于Terminating状态时使用

kubectl patch pvc {PVC} -p '{"metadata":{"finalizers": []}}' --type=merge
#  {PVC}就是你要删除的PVC名字

删除状态为Evicted的pod

kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c

删除状态为NodeAffinity的pod

kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("NodeAffinity")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c