k8s delete namespace Terminating

版本情况

kubenetes版本: v1.19.10
docker版本: v20.10.6

一、问题经过

早上发现 kubectl delete ns时, 删除namespace一直处于Terminating状态
尝试加上--force参数,执行kubectl delete ns --force,也是一样Terminating

当时Terminating截图

1、猜测原因:master节点资源不足

前段时间pod的数量增加,怀疑是master节点机器资源不足导致处理效率问题

目前运行的pod数量

查看Prometheus监控,可以看到master节点的使用率都很低,排除资源不足问题

k8s delete namespace Terminating_第1张图片

2、猜测原因:有依赖资源没有释放,如pvc、pod等 

执行查看资源情况, 没有发现依赖资源未释放情况,排查依赖资源没有释放问题

kubectl get all -n test

3、猜测原因:k8s本身存在bug,查验源码和官方issue,分析delete namespace过程

查看ns状态,也没有异常情况

kubectl describe ns test

使用json查看ns详情

kubectl get ns test -o json
k8s delete namespace Terminating_第2张图片
{
"lastTransitionTime": "2023-06-20T06:19:29Z",
"message": "Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request",
"reason": "DiscoveryFailed",
"status": "True",
"type": "NamespaceDeletionDiscoveryFailure"
},

参考:kubernetes -- 删除namespace的过程以及遇到的bug解决_LanVv的博客-CSDN博客

二、治标不治本删除方法

了解完源码,还是没得到彻底解决方法

网上很多介绍使用api去解决 使用/api/v1/namespaces/${ns}/finalize 去删除namespace, 只能治标不治本,顺便贴上curl的解决方法

# 注意修改ip地址和生成k8s证书
for ns in `kubectl get ns  | grep Terminating | awk '{print $1}'`
do
    # 获取ns的json
    kubectl get namespace ${ns} -o json > /tmp/${ns}.json
    # 将spec内容清空, 剔除finalizers
    cat ${ns}.json | jq 'del(.spec.finalizers)' > /tmp/del_${ns}.json
    # 用api去删除ns
    curl --cert /tmp/client.pem --key /tmp/client-key.pem --cacert /tmp/ca.pem -H "Content-Type: application/json" -X PUT --data-binary @/tmp/del_${ns}.json https://master_IP:6443/api/v1/namespaces/${ns}/finalize
    # 删除残留文件
    rm -f /tmp/del_${ns}.json /tmp/${ns}.json
done

参考:k8s删除Terminating状态的命名空间_LanVv的博客-CSDN博客

三、kubeernetes组件日志分析

查看kube-apiserver 503

controller.go:116] loading OpenAPI spec for "v1beta1.metrics.k8s.io" failed with: failed to retrieve openAPI spec, http error: ResponseCode: 503, Body: service unavailable
v1beta1.metrics.k8s.io
http error: ResponseCode: 503, Body: service unavailable 简单明了

查看kube-controller-manager

namespace_controller.go:162] deletion of namespace test failed: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
也是metrics.k8s.io/v1beta1

四、问题解决 

具体根因,kube-prometheus项目 的prometheus-adapter服务未Running

kube-prometheus项目地址

https://github.com/prometheus-operator/kube-prometheus

根据kube-apiserver和kube-controller-manager的错误日志定位,metrics.k8s.io/v1beta1这个apiservice有问题

kubectl get apiserver | grep False

metrics.k8s.io/v1beta1是monitoring/prometheus-adapter生成出来的

kubectl -n monitoring get pods | grep prometheus-adapter

查看服务发现,该pod异常了

Back-off pulling image "directxman12/k8s-prometheus-adapter:v0.8.4"

因node not ready 将pod驱逐了,而公司内网在做防火墙升级,禁止了一部分网络,导致pull失败

问题解决,解决问题的方式很简单,但可收获了一些排查思路

把服务拉起即可,尽量使用国内镜像仓库/公司级镜像仓库,使用dockerhub,可能发生网络问题

服务起来后

已经变成True状态

再次删除namespace,成功

其他参考:unable to retrieve the complete list of server APIs

  1. 【k8s错误处理】——unable to retrieve the complete list of server APIs_unable to retrieve connectors_Teingi的博客-CSDN博客
  2. https://github.com/prometheus-operator/kube-prometheus/issues/275

你可能感兴趣的:(kubernetes)