首页 > 其他分享 >记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故

时间:2023-09-06 13:03:35浏览次数:52  
标签:k8s Workspace Kubesphere host 集群 workspace 联邦 NS kubefed

一、前言

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

二、问题简述

2.1 事故来龙去脉

我们项目环境有两套k8s集群即生产/测试,两套K8S环境准备完毕之后,分别在两套K8S引入KubeSphere云原生平台技术,计划通过Kubesphere启用多集群模式去管理两套K8S,  生产K8S集群将设置为Host主集群,测试环境k8s设置为Member;在此期间一切准备就绪,就等这第二天正式切换域名直接对外上线。就在2023年7月22号晚上19:10分,接收到研发人员反馈测试环境Kubesphere平台无法正常使用,数据库都无法打开,随后我展开排查,发现整个Kubesphere平台都瘫痪,最后进行确认,是因第三方客户那边人员干涉致使生产集群异常,排查未果情急之下从从Kubernetes上卸载 了KubeSphere进行重装,重装了之后,暂时恢复了正常,随后将两个集群均加入到kubesphere,随后就把生产NS加入到workspace(企业空间)进行管理,万万没想到NS就被自动删除了,因此导致我Namespace下的所有生产数据全部丢失,随后创建一个测试的workspace和NS,把测试的NS加入到测试workspace同样会被自动删除,瞬间懵逼了....我就知道出大事了....

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubernetes

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_ns_02

2.3 集群环境

Kubesphere 3.3.1版本、Kubesphere 1.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

三、分析排查

3.1 故障演示

创建一个名为testv1namespace ,然后将其加入到ws1workspace中

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_ns_03

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

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

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

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubernetes_04

加入之后你会发现,ns已处于自动删除中......

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubenernetes_05

此时发现刚才我们创建的Namespace testv1这个命名空间删除了....(崩溃往往只一瞬间

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubenernetes_06

Ps: 而且这个删除是彻底的,让你直接在etcd中都找不到丝毫痕迹的那种......

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubenernetes_07

随后我进一步展开排查 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

Ps:此时你可以手动模拟将NS加入到wokspace的同时,实时输出kubefed-controller-manager日志信息

可以看到在命名空间加入workspace之后, testv1就被干掉了....不得不说太狠了

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubernetes_08

最后我检查了kubesphere workspace企业空间状态,发现workspace不稳定,从现象上看 host 集群中 workspace 被不停的创建和删除

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubenernetes_09

3.2 分析判断

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

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

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

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

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

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

3.2 验证问题猜想

因此我大概有一点点头绪了,很有可能当前的主集群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'标签,验证一下是否仍然被删除

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_ns_10

#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

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubenernetes_11

Deployment 副本控制器设置为0之后,在手动将NS加入workspace之后...此时发现NS没有删除了,workspace也没有出现不断创建删除等现象

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubenernetes_12

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_ns_13

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

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubernetes_14

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubernetes_15

此时加入到workspace的NS也已经被干掉了......

四、问题解决

经过上述验证将当前的kubefed controller-manager停掉。然后再创建的workspace在加入了ns之后,得出的结论就是没有继续被删除,等再将kubefed controller 还原之后,workspace 又出现之前的现象....

此时就可以断定,除了当前host集群中的kubfed之外,还有另外一个kubfed 对当前这个 host 集群产生了影响,,当前这个集群之被当作 member 集群被其他集群托管,没有正确的从其他的 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

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_kubenernetes_16

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

记一次生产项目Kubesphere中NS加入Workspace,致使NS数据删除事故_ns_17

最好最妥当的办法就是将原始的kubefed cluster删除即可, 其实就是一条命令的事情...很简单

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

此时你会发现,之前将自己的NS加入到workspace就不会报错了,由此问题得到解决

五、总结

先简单的谈谈心得吧,本人接触Kubesphere 云原生这个技术,算算时间已有将近两年多了,对于ks多集群管理方面积累并没有那么深,通过本次事故,学习了很多,也同样认识到了很多不足,仍然需要在该领域去深耕沉淀,我觉得对于运维来讲,遇到问题是一件幸运的事情,我知道. 虽然问题有时候让你抓狂,让你崩溃, 让你自我怀疑......可对于运维来说,也不失为一个成长的契机,运维的核心竞争力就是解决问题的能力,遇到问题不断的去积累,有时候你发现解决问题只需要一条命令,但是它里面涉及的到技术点很多,你去处理问题的时候,你需要搞清楚它的逻辑原理才能去很好的去处理,否则就是抓瞎,心态、积累、检索问题的能力、处理问题的能力都是运维不可或缺的能力

先就聊这么多,后面会继续分享更多有价值有营养的文章,大家喜欢的话,还请点点关注,不迷路哦~

END!

标签:k8s,Workspace,Kubesphere,host,集群,workspace,联邦,NS,kubefed
From: https://blog.51cto.com/u_11880730/7385209

相关文章

  • 解决vue项目build的时候报错Warning: Accessing non-existent property ‘cat‘ of mo
    *正在执行任务:npmrunbuild>selection-tool@1.0.0build>nodebuild/build.js-buildingforproduction...(node:8992)Warning:Accessingnon-existentproperty'cat'ofmoduleexportsinsidecirculardependency(Use`node--trace-warnings...`t......
  • ICML 2023 | 神经网络大还是小?Transformer模型规模对训练目标的影响
    前言 本文研究了Transformer类模型结构(configration)设计(即模型深度和宽度)与训练目标之间的关系。结论是:token级的训练目标(如maskedtokenprediction)相对更适合扩展更深层的模型,而sequence级的训练目标(如语句分类)则相对不适合训练深层神经网络,在训练时会遇到over-smoothin......
  • 【ICML2022】Understanding The Robustness in Vision Transformers
    来自NUS&NVIDIA文章地址:[2204.12451]UnderstandingTheRobustnessinVisionTransformers(arxiv.org)项目地址:https://github.com/NVlabs/FAN一、MotivationCNN使用滑动窗的策略来处理输入,ViT将输入划分成一系列的补丁,随后使用自注意力层来聚合补丁并产生他们的表示,ViT的......
  • Linux htons()和htonl()简介
    htons()#include<arpa/inet.h>uint16_thtons(uint16_thostshort); htons的功能:            将一个无符号短整型数值转换为网络字节序,即大端模式(big-endian)参数u_shorthostshort:16位无符号整数返回值:TCP/IP网络字节顺序.TCP/......
  • python3.10及以上版本编译安装ssl模块(openssl)
    由于python3.10之后版本不在支持libressl使用ssl,需要使用openssl安装来解决编译安装python时候遇到的ssl模块导入失败的问题,这里需要用的openssl1.1.1版本或者更高版本在别人的博客查阅到资料,特此记录:https://blog.csdn.net/ye__mo/article/details/129436629?spm=1001.2101.30......
  • tensorflow 数据及操作整理
     目录:#1.类型#2.基础操作#3.运算相关#4.求导相关数据类型:###############################标量(0维数组)、#向量(1维数组)、#矩阵(2维数组)#张量(Tensor),概念上等同于多维数组 #1.类型#定义一个随机数(标量)random_float=tf.random.uniform(s......
  • Proj CDeepFuzz Paper Reading: Invariance-inducing regularization using worst-cas
    Abstract本文:Task:1.proveinvariance-inducingregularizerscanincreasepredictiveaccuracyforworst-casespatialtransformations2.provethatonadversarialexamplesfromtransformationgroupsintheinfinitedatalimitrobusttrainingcanalsoimpro......
  • ES6前端技术之第二讲 let和const命令
    第二讲let和const命令前人栽树后人乘凉,前人挖坑后人遭殃!!!JS是弱类型语言,当初设计者为了使用的便捷,开发人员开心,留下了不少坑。请看JS系列坑之技术细节:var关键字挖的坑1.可以重复声明变量vara=88;vara="张老师";console.log(a);填坑:ES,let关键字......
  • Java反序列化:CommonsCollections5调试分析
    基础知识1.BadAttributeValueExpException相关源码可以看到这个异常类的支持序列化和反序列化,同时在反序列化readObject函数中会涉及到toString函数publicclassBadAttributeValueExpExceptionextendsException{/*Serialversion*/privatestaticfinal......
  • Proj CDeepFuzz Paper Reading: Framework for Evaluating Faithfulness of Local Exp
    Abstract本文:Task:1.studythefaithfulnessofanexplanationsystemtotheunderlyingpredictionmodelonconsistencyandsufficiency2.introducequantitativemeasuresofconsistencyandsufficiency3.provideestimatorsandsamplecomplexityboundsfo......