Kubernetes生产中删除资源失败
简单说一下原因,一般情况下,刚创建的资源,还未使用的时候删除,肯定可以删除成功。一旦使用了资源,即使将使用了该资源的其他资源一并删除,再来删除该资源,还是失败。类似于当我们的电脑插入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
文章作者 🐳Myki
上次更新 2021-05-19