首页 > 其他分享 >K8S:分享一次“乌龙问题”(人为导致的无法正常删除命名空间)

K8S:分享一次“乌龙问题”(人为导致的无法正常删除命名空间)

时间:2023-05-07 22:23:05浏览次数:62  
标签:kube 删除 5d19h metrics 01 14 k8s K8S 乌龙

问题背景

背景是这样的,我有一套测试用的K8S集群,发现无法正常删除命名空间了,一直处于Terminating状态,强制删除也不行。于是,再次手动创建了一个名为“test-b”的命名空间,同样也是不能正常删除。于是,展开了排查。不过,查到最后,发现是个毫无技术含量的“乌龙问题”。结果不重要,重要的是我想把这个过程分享一下。

排查过程

  1. 正常删除命名空间时,一直处于阻塞状态,只能Ctrl+C掉
[root@k8s-b-master ~]# kubectl delete ns test-b
namespace "test-b" deleted
  1. 查看状态一直处于Terminating状态
[root@k8s-b-master ~]# kubectl get ns
test-b            Terminating   18h
  1. 尝试强制删除,也是一直处于阻塞状态,也只能Ctrl+C掉
[root@k8s-b-master ~]# kubectl delete namespace test-b --grace-period=0 --force
  1. 查看详细信息发现
[root@k8s-b-master ~]# kubectl describe ns test-b
Name:         test-b
Labels:       kubernetes.io/metadata.name=test-b
Annotations:  <none>
Status:       Terminating
Conditions:
  Type                                         Status  LastTransitionTime               Reason                  Message
  ----                                         ------  ------------------               ------                  -------
  NamespaceDeletionDiscoveryFailure            True    Fri, 05 May 2023 14:06:52 +0800  DiscoveryFailed         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
  NamespaceDeletionGroupVersionParsingFailure  False   Fri, 05 May 2023 14:06:52 +0800  ParsedGroupVersions     All legacy kube types successfully parsed
  NamespaceDeletionContentFailure              False   Fri, 05 May 2023 14:06:52 +0800  ContentDeleted          All content successfully deleted, may be waiting on finalization
  NamespaceContentRemaining                    False   Fri, 05 May 2023 14:06:52 +0800  ContentRemoved          All content successfully removed
  NamespaceFinalizersRemaining                 False   Fri, 05 May 2023 14:06:52 +0800  ContentHasNoFinalizers  All content-preserving finalizers finished

No resource quota.

No LimitRange resource.

问题出在这里:DiscoveryFailed: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

难道API Server出问题了?于是继续排查。

  1. 检查API Server是否正常运行
[root@k8s-b-master ~]# kubectl get componentstatus
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE                         ERROR
controller-manager   Healthy   ok                              
etcd-0               Healthy   {"health":"true","reason":""}   
scheduler            Healthy   ok                              

从输出来看,controller-manager、scheduler和etcd集群都处于正常状态(Healthy)。

  1. 继续检查API Server的日志看看是否有错误或异常
# 获取API Server Pod的名称:
[root@k8s-b-master ~]# kubectl get pods -n kube-system -l component=kube-apiserver -o name
pod/kube-apiserver-k8s-b-master

# 查看API Server的日志:
[root@k8s-b-master ~]# kubectl get pods -n kube-system -l component=kube-apiserver -o name
pod/kube-apiserver-k8s-b-master
[root@k8s-b-master ~]# kubectl logs -n kube-system kube-apiserver-k8s-b-master
...
...
W0506 01:00:12.965627       1 handler_proxy.go:105] no RequestInfo found in the context
E0506 01:00:12.965711       1 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
, Header: map[Content-Type:[text/plain; charset=utf-8] X-Content-Type-Options:[nosniff]]
I0506 01:00:12.965722       1 controller.go:129] OpenAPI AggregationController: action for item v1beta1.metrics.k8s.io: Rate Limited Requeue.
W0506 01:00:12.968678       1 handler_proxy.go:105] no RequestInfo found in the context
E0506 01:00:12.968709       1 controller.go:113] loading OpenAPI spec for "v1beta1.metrics.k8s.io" failed with: Error, could not get list of group versions for APIService
I0506 01:00:12.968719       1 controller.go:126] OpenAPI AggregationController: action for item v1beta1.metrics.k8s.io: Rate Limited Requeue.
I0506 01:00:43.794546       1 controller.go:616] quota admission added evaluator for: endpointslices.discovery.k8s.io
I0506 01:00:44.023629       1 controller.go:616] quota admission added evaluator for: endpoints
W0506 01:01:12.965985       1 handler_proxy.go:105] no RequestInfo found in the context
E0506 01:01:12.966062       1 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
, Header: map[Content-Type:[text/plain; charset=utf-8] X-Content-Type-Options:[nosniff]]
I0506 01:01:12.966069       1 controller.go:129] OpenAPI AggregationController: action for item v1beta1.metrics.k8s.io: Rate Limited Requeue.
W0506 01:01:12.969496       1 handler_proxy.go:105] no RequestInfo found in the context
E0506 01:01:12.969527       1 controller.go:113] loading OpenAPI spec for "v1beta1.metrics.k8s.io" failed with: Error, could not get list of group versions for APIService
...
...
# 后面都是这样的Log
...
...

从输出日志来看,问题似乎与metrics.k8s.io/v1beta1有关,这个API被用于收集Kubernetes集群的度量数据。可能是因为度量服务器(metrics-server)出现故障,无法满足API Server的请求,导致API Server无法处理请求。

  1. k8s默认是没有metrics-server组件的呀,还是看看:
[root@k8s-b-master ~]# kubectl get pods -n kube-system -l k8s-app=metrics-server
No resources found in kube-system namespace.

kube-system命名空间中没有找到标签为k8s-app=metrics-server的Pod,这很正常呀,K8S本来就是默认没有安装Metrics Server 组件的,为什么现在又依赖了?

查到这里,我突然想起了前段时间部署过kube-prometheus,当时kube-state-metrics拉取镜像失败没有正常运行,因为是临时测试环境,后来就没管了,时间一长居然把这事给忘了。

于是看了一下,发现还真是:

[root@k8s-b-master ~]# kubectl get pod -n monitoring
NAME                                   READY   STATUS             RESTARTS       AGE
alertmanager-main-0                    2/2     Running            14 (30m ago)   5d19h
alertmanager-main-1                    2/2     Running            14 (29m ago)   5d19h
alertmanager-main-2                    2/2     Running            14 (29m ago)   5d19h
blackbox-exporter-69f4d86566-wn6q7     3/3     Running            21 (30m ago)   5d19h
grafana-56c4977497-2rjmt               1/1     Running            7 (29m ago)    5d19h
kube-state-metrics-56f8746666-lsps6    2/3     ImagePullBackOff   14 (29m ago)   5d19h # 拉取镜像失败导致没有正常运行
node-exporter-d8c5k                    2/2     Running            14 (30m ago)   5d19h
node-exporter-gvfx2                    2/2     Running            14 (30m ago)   5d19h
node-exporter-gxccx                    2/2     Running            14 (29m ago)   5d19h
node-exporter-h292z                    2/2     Running            14 (30m ago)   5d19h
node-exporter-mztj6                    2/2     Running            14 (29m ago)   5d19h
node-exporter-rvfz6                    2/2     Running            14 (29m ago)   5d19h
node-exporter-twg9q                    2/2     Running            13 (29m ago)   5d19h
prometheus-adapter-77f56b865b-76nzk    0/1     ImagePullBackOff   0              5d19h
prometheus-adapter-77f56b865b-wbcwl    0/1     ImagePullBackOff   0              5d19h
prometheus-k8s-0                       2/2     Running            14 (30m ago)   5d19h
prometheus-k8s-1                       2/2     Running            14 (29m ago)   5d19h
prometheus-operator-788dd7cb76-85zwj   2/2     Running            14 (29m ago)   5d19h

反正也不用这套环境了,干它:

[root@k8s-b-master ~]# kubectl delete -f kube-prometheus-main/manifests/
[root@k8s-b-master ~]# kubectl delete -f kube-prometheus-main/manifests/setup/

再次查看命名空间,test-b这个命名空间也随之能正常删除掉了,问题解决:

[root@k8s-b-master ~]# kubectl get ns
NAME              STATUS   AGE
default           Active   5d22h
kube-node-lease   Active   5d22h
kube-public       Active   5d22h
kube-system       Active   5d22h
[root@k8s-b-master ~]# 

最后的觉悟

结合官方文档相关资料和自己平常的经验反思了一下这个事情,kube-state-metrics 组件是负责监控 K8S 集群的状态,并且它会定期获取集群内各个资源的指标数据,这些指标数据会被 Metrics Server 组件使用。当 kube-state-metrics 组件无法正常工作时,Metrics Server 组件就无法获取到指标数据,从而导致 Metrics Server 组件无法正常运行。在 K8S 集群中,很多组件都会使用 Metrics Server 组件提供的指标数据,例如 HPA、kubelet 等。如果 Metrics Server 组件无法正常运行,可能会导致其他组件出现问题,包括删除命名空间时提示错误。也就是说 Metrics Server 组件无法正常运行,导致了API Server组件在处理其它一些请求时可能会失败,从而发生了无法正常删除命名空间的情况。

本文转载于WX公众号:不背锅运维(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/JLeL4j-mX2x2BBZxWu414g

标签:kube,删除,5d19h,metrics,01,14,k8s,K8S,乌龙
From: https://www.cnblogs.com/ttropsstack/p/17380298.html

相关文章

  • Git:删除所有 Commit 提交记录
    如果想要删除 Git 项目下的所有 Commit 提交,可以使用以下方法。 创建孤立分支,并切换到该分支:gitcheckout--orphanlatest_branch2.暂存所有文件:gitadd-A3.提交所有更改:gitcommit-am"FirstCommit"4.删除主分支 master:gitbranch-Dmaster5.......
  • k8s集群组件
    k8s集群有以下组件:Master:Kubernetes集群的控制中心,包括:APIServer:在Kubernetes集群中,APIserver扮演一个接口,使用户和管理员可以通过kubectl或其他工具与集群进行交互,而不必直接与底层组件打交道。同时,所有其他Kubernetes组件,包括kubelet、kube-proxy、controllerman......
  • Windows下SYSTEM权限文件夹的删除方法
    (不一定对所有情况都能用..。但是目前发现比较简单有效...)以C:/Windows.old文件夹为例,一般来说都无法完全删除,到最后总会提示需要SYSTEM权限。怎么办呢,下载一个VSCode,然后用VSCode打开Windows.old文件夹,便可采用VSCode将该文件夹下的所有内容删除干净...(我也不知道原理,但是属......
  • k8s pod概念
    KubernetesPod是Kubernetes中最小的可部署单元,是一个或多个相互协作的应用容器的集合,它们共享相同的网络命名空间和存储卷。每个Pod都有一个唯一的IP地址,用于和其他Pod进行通信。Pod的核心概念如下:Pod是一个逻辑主机,它可以包含多个容器,其中pause容器作为其他容器的......
  • 还原k8s控制节点
    0、基础环境配置参照节点建立搭建配置1、从旧控制节点拷贝/opt/kubernets/usr/local/bin/kubectl/usr/lib/systemd/system/etcd.service/usr/lib/systemd/system/kube-apiserver.service/usr/lib/systemd/system/kube-controller-manager.service/usr/lib/systemd/system/ku......
  • 删除GitHub上的历史commit
    1.背景由于之前的加水印脚本存在问题,在对同一张图片进行加水印时,会有一定的概率产生不一样md5的图片,在git提交的时候,就认为被修改了,从而被提交的github仓库中,如此反反复复,到现在已经有11个G大小了;今天把水印脚本重写了一下,解决了上述问题,所以准备给之前的垃圾提交清理了,让我的博......
  • 二进制部署K8S v1.27.x
    1.1系统环境系统:Rockylinux8.7x64cat/etc/hosts----172.16.10.81flyfish81172.16.10.82flyfish82172.16.10.83flyfish83172.16.10.84flyfish84172.16.10.85flyfish85-----本次部署为前三台Rockylinux8.6x64flyfish81做为master部署flyfish82......
  • MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片
    关键字:MongoDB中缩减Shard集群(删除一个Shard)--删除一个分片对MongoDB的Shard集群来说,添加一个分片很简单,AddShard就可以了。但是缩减集群(删除分片)这种一般很少用到。由于某服务器挂了,所以想送修之前必须把它上面的数据自动迁移到其他Shard上。以下......
  • 01 磁盘分区创建删除及逻辑卷挂载
    磁盘分区删除、创建及逻辑卷挂载磁盘分区查看使用lsblk命令查看当前磁盘分区情况[root@localhost~]#lsblkNAMEMAJ:MINRMSIZEROTYPEMOUNTPOINTSsda8:00447.1G0disk└─sda18:10447.1G0partsdb8:160......
  • zabbix通过api方式批量创建和删除主机
    zabbix库连接信息,文件名为Conn.pyimportpymysql"""获取后台数据库连接"""defCON():con=pymysql.connect(host='rm-xxx.xxxxx.rds.aliyuncs.com',user='xxx',password='xxxx',db=�......