sealos issue #2157 debug 思路流程记录

简介: sealos issue #2157 debug 思路流程记录


前言

这个项目蛮有意思的,sealos 是以 kubernetes 为内核的云操作系统发行版。

boss上看到 -> 沟通 -> 解决某个issue终面绿通 -> 舒服

本文记录解决 issue 的思路

分析issue

BUG: Clusterfile must has right sort of hosts, host[0] must be master role #2157

Clusterfile 里面的 host 数组字段,第一个元素必须是master node。

这里看到Clusterfile感觉很奇怪,后缀去哪了,啥玩意。后面看文中发现其实就是yaml文件。

并且使用与 kubectl 非常类似,这里我基本就可以断定要从cobra去手代码了。

为什么要从cobra去入手?因为我之前追过kubectl apply -f pod-command.yaml 的流程。

sealos apply -f Clusterfile
kubectl apply -f pod-command.yaml

再回到Clusterfile, 注意这里的hosts。

apiVersion: apps.sealos.io/v1beta1
kind: Cluster
metadata:
  name: default
spec:
  # 服务器 IP 地址列表和角色
  hosts:
    - ips:
        - 192.168.0.2:22
      roles:
        - master
        - amd64
    - ips:
        - 192.168.0.5:22
        - 192.168.0.6:22
      roles:
        - node
        - amd64
  image:
    - labring/kubernetes:v1.25.0
    - labring/helm:v3.8.2
    - labring/calico:v3.24.1
  ssh:
    passwd: xxx
    pk: /root/.ssh/id_rsa
    port: 22
    user: root

在看看clusterfile_test.go单元测试里面是怎么写的,发现master是排在前面的。需要解决的问题:Clusterfile 里面的 host 数组字段,第一个元素必须是master node。

解决思路:不能依靠元素下标判断是否为master,需要通过string对比来确定。

剖析源码

这种写法,直接在源码里面找 cobra 的 apply

sealos apply -f Clusterfile

NewApplierFromFile 如其名,解析yaml文件到结构体中。

下面进入Apply 看,initCluster 初始化集群

进入Execute

先进入第一个类看看,发现对7个函数进行了包装然后顺序执行,这里关注RunGuest ,看看到底干了什么

Apply中,终于发现与master相关的函数了。进去看看!

WDF?这里代码逻辑:认为host[0]就是master

再来看看CmdAsync做了什么:与host建立连接,发送命令。

如果在Clusterfile文件中,把node写在master之上了,那么本来要发送给master的命令,现在发给node了。那么这里就是问题所在了。

解决方案

  1. 要么就规定好第一个就写master的ip
  2. 修改判断master的逻辑

现在,本来依赖于Clusterfile中host下标的 逻辑,就完美解决了。

总结

其实看到这个issue,到解决,三十分钟不到。难道是之前看过kubectl apply源码的原因嘛,感觉这个issue还挺简单的。

三台虚拟机,装 go 1.19.3 和 修改后编译好的sealos 。执行apply即可,apply的时候,会去拉k8s的镜像,巨慢。去改了镜像源还没用,干脆就放一晚上了慢慢拉了,go mod tidy有时候还会失败,心累。

在Clusterfile中把node放在master之上。看看apply是否出错,没错,ok了。

目录
相关文章
|
6月前
|
前端开发
flowable流程设计器的几个bug修改记录
flowable流程设计器的几个bug修改记录
162 0
|
4月前
|
存储 数据库
cannot read properties of underfined (reading ‘code‘),别光知道抄,有的时候,细节就是影响全局关键,别人代码到你项目不一定100%正确,判断bug出
cannot read properties of underfined (reading ‘code‘),别光知道抄,有的时候,细节就是影响全局关键,别人代码到你项目不一定100%正确,判断bug出
|
6月前
|
机器学习/深度学习 JSON Linux
NSLog日志输出不全问题分析与解决方案
NSLog日志输出不全问题分析与解决方案
207 0
|
中间件 Go
Go如何优雅的记录操作日志
这篇文章比较硬核,会涉及到这几个知识点:协程、协程池、钩子函数、中间件以及异步方法的使用,文章最后会带大家去阅读Async的源码,了解其底层实现。
1931 0
Go如何优雅的记录操作日志
|
自然语言处理 前端开发 UED
🌈 关于我给dumi2.0提pr的完整记录
博主最近一年时间在工作业余都在写开源组件库 concis ,其中文档站点生成框架采取了 dumi,前几天不久dumi2.0正式发布,博主也是顺势而为直接把项目升级(dumi1 -> dumi2)
179 1
🌈 关于我给dumi2.0提pr的完整记录
uniapp bug记录(后续更新)
uniapp bug记录(后续更新)
125 0
|
存储 SQL
机房重构Debug记录
机房重构Debug记录
|
移动开发 测试技术
pytest学习和使用24-如何清空allure报告历史记录?我每次都手动删除,有点Low了~
pytest学习和使用24-如何清空allure报告历史记录?我每次都手动删除,有点Low了~
122 0
pytest学习和使用24-如何清空allure报告历史记录?我每次都手动删除,有点Low了~
|
Java
Github参与jdk8u,提交的PR提示:Testing is not configured
Github参与jdk8u,提交的PR提示:Testing is not configured
113 0
Github参与jdk8u,提交的PR提示:Testing is not configured
如何给Airtest脚本/报告增加log记录
如何给Airtest脚本/报告增加log记录
702 0