一、前言
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同样会被自动删除,瞬间懵逼了....我就知道出大事了....
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中
将testv1 分配至ws1 workspace 下,点击确定右上角就出现了错误提示
role.rbac.authorization.k8s.io"admin" not fount
这表示在Kubernetes集群中没有找到名为"admin"的kubesphere role。 这个错误通常发生在试图为Kubesphere添加或配置角色时,使用了一个不存在的角色名称....此时我们继续往下看
加入之后你会发现,ns已处于自动删除中......
此时发现刚才我们创建的Namespace testv1这个命名空间删除了....(崩溃往往只一瞬间
Ps: 而且这个删除是彻底的,让你直接在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
Ps:此时你可以手动模拟将NS加入到wokspace的同时,实时输出kubefed-controller-manager日志信息
可以看到在命名空间加入workspace之后, testv1就被干掉了....不得不说太狠了
最后我检查了kubesphere workspace企业空间状态,发现workspace不稳定,从现象上看 host 集群中 workspace 被不停的创建和删除
3.2 分析判断
首先我们可以将问题范围缩小至kubesphere多集群管理这里,该功能使用了Kubefed这个组件,思考以下几点疑问:
问题1:为什么重装了kubesphere之后 会出现这种情况呢?难道是我卸载之后在重装 该环境没有彻底清除干净?
问题2: 什么情况会导致创建一个ns 加入到workspace之后会被删除掉呢?
问题3: 这里面的逻辑是什么样的呢?
以上,我带着疑问翻阅了kubesphere 多集群管理 kubefed托管的相关官网,得知,kubefed 托管是指在kubesphere平台上通过kubefed 控制器来管理和操作多个kubernetes集群的联邦特性
- Kubefed 控制器:Kubefed 是一个 Kubernetes 控制器,用于提供联邦特性,使得多个 Kubernetes 集群可以联合管理。Kubesphere 通过部署 Kubefed 控制器来实现对多集群的联邦管理。
- 联邦 API 服务器:Kubefed 控制器在每个 Kubernetes 集群上启动一个联邦 API 服务器。这些联邦 API 服务器相互通信,用于管理联邦资源和配置。
- 联邦配置:在 Kubesphere 中配置联邦相关的资源,例如联邦命名空间、联邦服务、联邦副本集等。这些联邦资源将通过联邦 API 服务器进行同步和管理。
- 联邦控制:Kubefed 控制器会周期性地检查联邦资源的状态和配置,并根据配置的策略自动进行同步和调度。例如,当创建一个联邦副本集时,Kubefed 控制器会将该副本集在各个联邦集群中进行创建和调度。
- 跨集群资源访问:通过联邦特性,可以在一个集群中访问和管理其他集群的资源。在 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'标签,验证一下是否仍然被删除
#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之后,在手动将NS加入workspace之后...此时发现NS没有删除了,workspace也没有出现不断创建删除等现象
最后我们再将设置为0的kubefed controller还原回来
此时加入到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
通过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
此时你会发现,之前将自己的NS加入到workspace就不会报错了,由此问题得到解决
五、总结
先简单的谈谈心得吧,本人接触Kubesphere 云原生这个技术,算算时间已有将近两年多了,对于ks多集群管理方面积累并没有那么深,通过本次事故,学习了很多,也同样认识到了很多不足,仍然需要在该领域去深耕沉淀,我觉得对于运维来讲,遇到问题是一件幸运的事情,我知道. 虽然问题有时候让你抓狂,让你崩溃, 让你自我怀疑......可对于运维来说,也不失为一个成长的契机,运维的核心竞争力就是解决问题的能力,遇到问题不断的去积累,有时候你发现解决问题只需要一条命令,但是它里面涉及的到技术点很多,你去处理问题的时候,你需要搞清楚它的逻辑原理才能去很好的去处理,否则就是抓瞎,心态、积累、检索问题的能力、处理问题的能力都是运维不可或缺的能力
先就聊这么多,后面会继续分享更多有价值有营养的文章,大家喜欢的话,还请点点关注,不迷路哦~
END!
标签:k8s,Workspace,Kubesphere,host,集群,workspace,联邦,NS,kubefed From: https://blog.51cto.com/u_11880730/7385209