前言
这个项目蛮有意思的,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了。
那么这里就是问题所在了。
解决方案
- 要么就规定好第一个就写master的ip
- 修改判断master的逻辑
现在,本来依赖于Clusterfile中host下标的 逻辑,就完美解决了。
总结
其实看到这个issue,到解决,三十分钟不到。难道是之前看过kubectl apply
源码的原因嘛,感觉这个issue还挺简单的。
三台虚拟机,装 go 1.19.3 和 修改后编译好的sealos 。执行apply即可,apply的时候,会去拉k8s的镜像,巨慢。去改了镜像源还没用,干脆就放一晚上了慢慢拉了,go mod tidy
有时候还会失败,心累。
在Clusterfile中把node放在master之上。看看apply是否出错,没错,ok了。