生产中的小技巧:k8s删除namespaces状态一直为terminating问题处理

    1. # kubectl get ns
    2. NAME STATUS AGE
    3. default Active 5d4h
    4. ingress-nginx Active 30h
    5. kube-node-lease Active 5d4h
    6. kube-public Active 5d4h
    7. kube-system Active 5d4h
    8. kubevirt Terminating 2d2h # <------ here
    9. 1、新开一个窗口运行命令 kubectl proxy
    10. > 此命令启动了一个代理服务来接收来自你本机的HTTP连接并转发至API服务器,同时处理身份认证
    11. 2、新开一个终端窗口,将下面shell脚本整理到文本内`1.sh`并执行,$1参数即为删除不了的ns名称
    12. #------------------------------------------------------------------------------------
    13. #!/bin/bash
    14. set -eo pipefail
    15. die() { echo "$*" 1>&2 ; exit 1; }
    16. need() {
    17. which "$1" &>/dev/null || die "Binary '$1' is missing but required"
    18. }
    19. # checking pre-reqs
    20. need "jq"
    21. need "curl"
    22. need "kubectl"
    23. PROJECT="$1"
    24. shift
    25. test -n "$PROJECT" || die "Missing arguments: kill-ns <namespace>"
    26. kubectl proxy &>/dev/null &
    27. PROXY_PID=$!
    28. killproxy () {
    29. kill $PROXY_PID
    30. }
    31. trap killproxy EXIT
    32. sleep 1 # give the proxy a second
    33. 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"
    34. #------------------------------------------------------------------------------------
    35. 3. 执行脚本删除
    36. # bash 1.sh kubevirt
    37. Killed namespace: kubevirt
    38. 1.sh: line 23: kill: (9098) - No such process
    39. 5、查看结果
    40. # kubectl get ns
    41. NAME STATUS AGE
    42. default Active 5d4h
    43. ingress-nginx Active 30h
    44. kube-node-lease Active 5d4h
    45. kube-public Active 5d4h
    46. kube-system Active 5d4h