KubeSphere Namespace 数据删除事故分析与解决全记录

news2024/10/1 12:13:27

作者:宇轩辞白,运维研发工程师,目前专注于云原生、Kubernetes、容器、Linux、运维自动化等领域。

前言

2023 年 7 月 23 日在项目上线前夕,K8s 生产环境出现故障,经过紧急修复之后,K8s 环境恢复正常;另外我们环境引入了 KubeSphere 云原生平台技术,为了方便研发人员对于 K8s 权限的细粒度管理,我方手动将 K8s Namespace(生产环境业务命名空间)加入到 KubeSphere 中的 Workspace(企业空间),就在此时,发生了让人后背一凉、极度可怕的事故,就是生产命名空间(Namespace)被自动删除了,熟悉 K8s 的人都知道,这意味着该命名空间下的所有数据,都被清空了。

问题简述

事故的来龙去脉

我们项目环境有两套 K8s 集群(即生产/测试),两套 K8s 环境准备完毕之后,分别在两套 K8s 引入 KubeSphere 云原生平台,计划通过 KubeSphere 启用多集群模式去管理两套 K8s:生产 K8s 集群将设置为 Host 主集群,测试环境 K8s 设置为 Member 集群。在此期间一切准备就绪,就等次日正式对外上线。

在 2023 年 7 月 22 号晚上七点十分,忽然收到研发人员反馈:测试环境 KubeSphere 平台无法正常使用,数据库都无法打开。

随后我展开排查,发现整个 KubeSphere 平台都瘫痪了。经过确认,是因第三方客户技术人员做资源克隆,间接性影响了生产环境。

排查未果,情急之下我直接卸载了 KubeSphere 进行重装,重装之后暂时恢复了正常。随后我将两套 K8s 集群重新加入到 KubeSphere 平台托管,再将 K8s 的 Namespace 加入到 KubeSphere 所创建好的 WorkSpace 进行管理。

就在此刻,我发现加入到 WorkSpace 的 Namespace 竟在顷刻间自动删除,致使我 NameSpace 下的所有生产数据资源全部丢失。我以为是 Workspace 的问题,因此重建新的 Workspace 测试进行测试,结果同样被删除。

此时此刻,我心想,坏了出大事了!

集群环境

  • Kubesphere 3.3.1
  • K8s v1.22
[root@k8s-master01 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@k8s-master01 ~]# kubectl get node
NAME           STATUS                     ROLES    AGE   VERSION
k8s-master01   Ready,SchedulingDisabled   <none>   51d   v1.22.0
k8s-master02   Ready,SchedulingDisabled   <none>   51d   v1.22.0
k8s-master03   Ready,SchedulingDisabled   <none>   51d   v1.22.0
k8s-node01     Ready                      <none>   51d   v1.22.0
k8s-node02     Ready                      <none>   51d   v1.22.0
k8s-node03     Ready                      <none>   51d   v1.22.0
k8s-node04     Ready                      <none>   12d   v1.22.0
k8s-node05     Ready                      <none>   12d   v1.22.0
[root@k8s-master01 ~]# kubectl get cluster
NAME        FEDERATED   PROVIDER     ACTIVE   VERSION
host        true        KubeSphere   true     v1.22.0
test-host   true                              v1.22.0
[root@k8stst-master01 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@k8stst-master01 ~]# kubectl get node
NAME              STATUS                     ROLES    AGE   VERSION
k8stst-master01   Ready,SchedulingDisabled   <none>   58d   v1.22.0
k8stst-master02   Ready,SchedulingDisabled   <none>   58d   v1.22.0
k8stst-master03   Ready,SchedulingDisabled   <none>   58d   v1.22.0
k8stst-node01     Ready                      <none>   58d   v1.22.0
k8stst-node02     Ready                      <none>   58d   v1.22.0

分析排查

故障演示

创建一个名为 testv1 的 Namespace,然后将其加入到名为 ws1 的 Workspace 中。

testv1 分配至 ws1 下,点击确定右上角就出现了错误提示。

role.rbac.authorization.k8s.io"admin" not fount

这表示在 K8s 集群中没有找到名为 admin 的 KubeSphere role。这个错误通常发生在试图为 KubeSphere 添加或配置角色时,使用了一个不存在的角色名称。此时我们继续往下看。

加入之后你会发现,Namespace 已处于自动删除状态中。

然后我发现刚才创建的 Namespace testv1 这个命名空间确实被删除了。

而且这个删除是彻底的,在 Etcd 中都找不到丝毫痕迹。

随后我进一步展开排查,想通过 kubefed-controller-manager pod 日志寻找一些有价值的线索。

#kubectl -n kube-federation-system get pod
NAME                                          READY   STATUS    RESTARTS      AGE
kubefed-admission-webhook-6f9f5dcbbf-8krrp    1/1     Running   1 (13d ago)   13d
kubefed-controller-manager-78c4dbc5f8-bbqj6   1/1     Running   0             11d
kubefed-controller-manager-78c4dbc5f8-qvsrb   1/1     Running   0             11d
#kubectl -n kube-federation-system logs -f  kubefed-controller-manager-78c4dbc5f8-qvsrb

你可以手动模拟将 Namespace 加入到 Workspace 的同时,实时输出 kubefed-controller-manager 日志信息。

可以看到,在 Namespace 加入 Workspace 之后,Namespace 就被干掉了。

最后我检查了 KubeSphere Workspace 的状态,发现 Workspace 不稳定,从现象上看 Host 集群中 Workspace 被不停的创建和删除。

分析判断

首先我们可以将问题范围缩小至 KubeSphere 多集群管理这里,该功能使用了 Kubefed 这个组件,思考以下几点疑问:

  • 问题 1:为什么重装了 KubeSphere 之后会出现这种情况呢?难道是我卸载之后再重装,该环境没有彻底清除干净?

  • 问题 2:什么情况会导致创建一个 Namespace 加入到 Workspace 之后会被删除掉呢?

  • 问题 3:这里面的逻辑是什么样的呢?

以上,我带着疑问翻阅了 KubeSphere 多集群管理 Kubefed 托管的相关官网,得知,Kubefed 托管是指在 KubeSphere 平台上通过 Kubefed 控制器来管理和操作多个 K8s 集群的联邦特性:

  • Kubefed 控制器:Kubefed 是一个 K8s 控制器,用于提供联邦特性,使得多个 K8s 集群可以联合管理。Kubesphere 通过部署 Kubefed 控制器来实现对多集群的联邦管理。
  • 联邦 API 服务器:Kubefed 控制器在每个 K8s 集群上启动一个联邦 API 服务器。这些联邦 API 服务器相互通信,用于管理联邦资源和配置。
  • 联邦配置:在 KubeSphere 中配置联邦相关的资源,例如联邦命名空间、联邦服务、联邦副本集等。这些联邦资源将通过联邦 API 服务器进行同步和管理。
  • 联邦控制:Kubefed 控制器会周期性地检查联邦资源的状态和配置,并根据配置的策略自动进行同步和调度。例如,当创建一个联邦副本集时,Kubefed 控制器会将该副本集在各个联邦集群中进行创建和调度。
  • 跨集群资源访问:通过联邦特性,可以在一个集群中访问和管理其他集群的资源。在 KubeSphere 中,可以通过联邦命名空间和联邦服务来实现跨集群的资源访问和通信。 总而言之,KubeSphere Kubefed 托管通过部署 Kubefed 控制器和联邦 API 服务器,结合联邦配置和控制机制,实现了对多个 K8s 集群的联邦管理和操作。

验证问题猜想

通过分析,我有了一点点头绪。很有可能当前的主集群 Host 被多个 Kubefed 托管产生了冲突。但为什么产生冲突?可能当时卸载 KubeSphere 没有清理干净:当时删除只是通过脚本清理了 KubeSphere-system 相关 pod,但是 Kubefed 相关资源没有清理掉,当重新配置新 Host 集群的时候,导致当前的 Host 集群被多个 Kubefed 托管产生了冲突。

一个是当前集群的 Kubefed,因创建的 Workspace 关联了 Host 集群,所以 Kubefed 会在 Host 上创建出 Workspace,然而在此之前,这个 Host 集群也被另外一个 Kubefed 进行托管,由于创建出来的 Workspace 带有 kubfed.io/managed: 'true' 这个标签,此时就会产生冲突,导致 Workspace 不停的被创建和删除。

为了验证该猜想,我把当前集群中的 Kubefed controller 停止(可设置为 0),然后再手动创建一个 Workspace 并打上 kubfed.io/managed: 'true' 标签,验证一下是否仍然被删除。

#kubectl get deployment  -n kube-federation-system
停止当前 kubefed controller
#kubectl scale  deployment kubefed-controller-manager --replicas=0 -n kube-federation-system
deployment.apps/kubefed-controller-manager scaled

Deployment 副本控制器设置为 0 之后,再手动将 Namespace 加入 Workspace。此时发现 Namespace 没有被删除,Workspace 也没有出现不断创建删除等现象。

最后我们再将设置为 0 的 Kubefed controller 还原回来。

问题解决

经过上述验证发现:将当前的 kubefed controller-manager 停掉,然后再创建的 Workspace 在加入了 Namespace 之后,没有继续被删除,等再将 Kubefed controller 还原之后,Workspace 又出现之前的现象。

此时就可以断定,除了当前 Host 集群中的 Kubfed 之外,很有可能原始 Host 集群的 Kubfed 没有被删除。也就是说两个相同的 Host Kubefed 同时托管当前的 Host 集群,自然而然就会对当前 Host 集群产生了影响,究其原因,在起初卸载 KubeSphere 环境的时候,没有正确的将 Kubefed Host 集群中移除,当新的 Kubefed Host 起来之后,就会造成冲突。

此时我们通过 kubectl get kubefedclusters.core.kubefed.io -n kube-federation-system 可以看到两个 cluster,分别是当前的 Host cluster 和 Member cluster,当前的 Host 集群(可以理解为集群中部署的 Kubfed 管理了自己)和 Member 集群都被托管到了 Host 集群中部署的 Kubfed,并通过 KubeSphere 进行管理。

查看 kubefed 联邦集群的信息
#kubectl get kubefedclusters.core.kubefed.io -n kube-federation-system

通过 api 地址来判断当前是否异常的 host cluster
#kubefedclusters.core.kubefed.io -n kube-federation-system -o yaml

最妥当的办法就是将原始的 Kubefed cluster 删除:

#kubectl delete kubefedclusters.core.kubefed.io produce-trt -n kube-federation-system

此时你会发现,问题得到解决。

总结

通过本次事故,我学习了很多,认识到了自己的不足。我仍然需要在云原生这个领域去深耕沉淀。

对于运维来讲,我觉得遇到问题是一件幸运的事情。尽管这些问题会让你崩溃甚至自我怀疑,但却是一个个成长的契机。运维的核心竞争力就是解决问题的能力。

遇到问题,你需要搞清楚里面的逻辑原理,这样才能更好的处理。所以,解决问题的过程也是一个学习的过程。

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs-处理http请求

文章目录 前言node 处理 get 请求node 处理 post 请求总结 前言 使用nodejs搭建后端代理服务&#xff0c;处理http请求&#xff0c;理解nodejs是如何处理get、post请求的 node 处理 get 请求 使用 http 模块创建代理服务器使用 querystring 模块解析请求参数req.end 方法发送…

UOS系统下fastdeploy推理

Cmake安装 apt install build-essential zlib1g-dev libssl-dev wget https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2.tar.gz tar -zxvf cmake-3.23.2.tar.gz cd cmake-3.23.2 ./bootstrap make make install cmake --version在Github或者gitee 查…

IDEA中启动类是灰色,重启idea启动类自动消失解决方法

问题描述&#xff1a; idea中启动多个服务会在services中展示服务的信息和控制台&#xff0c;但是经常有一些启动类会变成灰色的&#xff0c;而且重启idea后经常会自动消失&#xff0c;下次启动时需要手动再去启动&#xff0c;很麻烦。如下图所示&#xff1a; 解决方法&…

智能配电管理系统

智能配电管理系统是按用户的需求&#xff0c;遵循配电系统的标准规范而二次开发的一套具有专业性强、自动化程度高、易使用、高性能、高可靠等特点的适用于低压配电系统的电能管理系统。 智能配电管理系统包括监控管理层、网络通信层、现场采集层、用电保护层和受控设备层&…

基于javaweb的网上图书销售系统(servlet+jsp)

系统简介 本项目采用eclipse工具开发&#xff0c;jspservletjquery技术编写&#xff0c;数据库采用的是mysql&#xff0c;navicat开发工具。 角色&#xff1a; 管理员普通用户 模块简介 管理员&#xff1a; 登录用户管理图书分类管理图书管理图书订单管理图书评论管理数据统…

视频云存储/安防监控/AI分析/视频AI智能分析网关:垃圾满溢算法

随着我国科技的发展和城市化进程加快&#xff0c;大家对于生活环境以及空气质量更加重视&#xff0c;要求越来越严格。城市街道垃圾以及生活区垃圾满溢已经成为城市之痛。乱扔垃圾&#xff0c;垃圾不入桶这些行为已经严重影响到了城市的美化问题。特别是炎热的夏日和雨水季节&a…

应用在汽车新风系统中消毒杀菌的UVC灯珠

在病毒、细菌的传播可以说是一个让人敏感而恐惧的事情。而对于车内较小的空间&#xff0c;乘坐人员流动性大&#xff0c;更容易残留细菌病毒。车内缺少通风&#xff0c;残留的污垢垃圾也会滋生细菌&#xff0c;加快细菌的繁殖。所以对于车内消毒就自然不容忽视。 那么问题又来…

软件提示vcruntime140_1.dll丢失的解决方法,以及丢失的原因总结

在运行某些程序时&#xff0c;可能会出现“vcruntime140_1.dll 丢失”的错误提示。这是因为 vcruntime140_1.dll 是 Visual C Redistributable 的一部分&#xff0c;它通常被安装在 Windows 操作系统上。如果该文件丢失或无法找到&#xff0c;可能会导致程序无法正常运行。在我…

华为云使用脚本初始化Linux数据盘

初始化新挂载的磁盘 登录云服务器&#xff0c;执行以下命令获取自动初始化磁盘脚本。 wget https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/datadisk/LinuxVMDataDiskAutoInitialize.sh 说明&#xff1a; 若回显异常&#xff0c;请检查云服务器是否绑定弹性公…

vue-cli搭建一个新项目及基础配置

vue-cli搭建一个新项目及基础配置 一、安装步骤二、main.js配置三、router下的index.js 一、安装步骤 1.安装node环境&#xff1a;下载地址&#xff1a;Node.js 2.安装脚手架&#xff1a;npm install -g vue/cli 3.创建vue项目&#xff1a;vue create 项目名 4.进入项目&…

什么耳机音质最好又不伤耳朵,什么耳机好用耳朵不疼

如果你还在疑问什么耳机好用并且用了耳朵不痛的话&#xff0c;那你就应该看完本片文章了&#xff01; 近年来&#xff0c;骨传导耳机在市场上的热度可谓是飙升不止&#xff0c;走在街头&#xff0c;你会发现无数人戴着这种科技神器。相较于传统的真无线蓝牙耳机&#xff0c;骨传…

奇葩招聘:招程序员,限45岁以上,不加班,薪资还不低……

咱就是说&#xff0c;这年头&#xff0c;谁还不想找一份“越老越吃香”的工作呀&#xff1f; 但是在多金的互联网&#xff0c;却一直充斥着“35岁焦虑”的话题&#xff0c;弄得人心惶惶。焦虑归焦虑&#xff0c;越老越吃香的工作还是有滴~这不&#xff0c;日前&#xff0c;便有…

关于火绒邮件监控引起的扫描任意IP会有25和110端口反馈

之前测试过公司的外网IP&#xff0c;因为之前一直很注意对外映射的端口&#xff0c;都限制了可以访问的IP地址和端口&#xff0c;所以之前扫描的时候是一个端口都扫描不出来的。最近闲的无事&#xff0c;想着再扫描试试&#xff0c;结果发现居然开放了25和110端口&#xff0c;我…

idea中删除断点与删除所有断点

如下如所示&#xff0c;debug执行后&#xff0c;选中第一步 然后在弹出的弹窗中&#xff0c;勾选全部断点&#xff08;默认已勾选&#xff09; &#xff0c;点击减号即可&#xff0c;最后Done关闭弹窗

【运维日常】infiniband网络架构,容器间跨机器不同网段通信

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

AutoDock Vina多配体对接 (Simultaneous Multiple Ligand Docking)

1. 多配体分子对接简介 多配体分子对接&#xff08;Simultaneous Multiple Ligand Docking, SMLD&#xff09;或&#xff08;Multiple Ligand Simultaneous Docking, MLSD&#xff09;是一种分子对接技术&#xff0c;用于将多个配体&#xff08;小分子药物候选物&#xff09;同…

问道管理:底部渐渐抬高 今年反弹时刻或已来临

快速探底后&#xff0c;两市呈现分解走势。 沪指周三低开震动&#xff0c;指数在20日均线取得支撑后小幅上升&#xff0c;最终以红盘报收。深成指走势弱于沪指&#xff0c;尽管午后指数有所上升&#xff0c;但最终未能翻红。到收盘&#xff0c;沪指报收3158.08点&#xff0c;上…

睿趣科技:现在开一家抖音小店到底能不能做起来

抖音&#xff0c;这个年轻人熟悉的短视频平台&#xff0c;如今已成为许多创业者的新天地。在这个平台上&#xff0c;各种各样的小店如雨后春笋般涌现&#xff0c;它们以创意的产品和精彩的内容吸引了大批年轻用户。然而&#xff0c;要在抖音上开一家小店并不是一帆风顺的事情&a…

《C++设计模式》——创建型

前言 创建型为了创建东西才是有用的&#xff0c;创建型设计模式使用的场景&#xff1a; 1、创建一个东西&#xff1b; 2、可重复利用&#xff1b; 3、灵活性高&#xff0c;代码可因地制宜。 Factory Method(工厂模式) 简单工厂模式 主要用于创建对象。新添加类时&#xff0…

性能测试包含哪些内容?

性能测试是对软件产品在特定条件下的性能进行测试和评估的过程。性能测试的内容可以包括以下几个方面&#xff1a; 1、负载测试&#xff1a;负载测试是指在特定条件下&#xff0c;对软件产品的性能进行测试和评估。测试人员可以通过模拟不同的用户数量、并发请求、访问频率等条…