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了。

目录
相关文章
|
2月前
|
API
debug常见错误,出现debug时出现跑进为条件为false的if语句
debug常见错误,出现debug时出现跑进为条件为false的if语句
15 0
|
4月前
|
数据库
SAP ABAP 更新函数(Update Function Module)执行出错的原因分析试读版
SAP ABAP 更新函数(Update Function Module)执行出错的原因分析试读版
35 0
|
10月前
|
存储 SQL
机房重构Debug记录
机房重构Debug记录
|
中间件 Go
Go如何优雅的记录操作日志
这篇文章比较硬核,会涉及到这几个知识点:协程、协程池、钩子函数、中间件以及异步方法的使用,文章最后会带大家去阅读Async的源码,了解其底层实现。
1601 0
Go如何优雅的记录操作日志
|
12月前
|
自然语言处理 前端开发 UED
🌈 关于我给dumi2.0提pr的完整记录
博主最近一年时间在工作业余都在写开源组件库 concis ,其中文档站点生成框架采取了 dumi,前几天不久dumi2.0正式发布,博主也是顺势而为直接把项目升级(dumi1 -> dumi2)
107 1
🌈 关于我给dumi2.0提pr的完整记录
|
开发工具 git
git fatal: 拒绝合并无关的历史
记录一个git的错误, 以备以后查看
370 0
|
网络协议 Java API
由OpenHarmony 文档上的PR三天未处理引发的思考
前段时间我不是教大家完成一个 OpenHarmony 代码的贡献流程,结果我自个的PR已经三天了还没处理到,这不得不引发我的思考,到底是啥原因导致的呢(事实上确实就是一个很随便的PR),所以这次带大家重新学习一下,文档需要的真正规范
101 0
由OpenHarmony 文档上的PR三天未处理引发的思考
|
Java
Github参与jdk8u,提交的PR提示:Testing is not configured
Github参与jdk8u,提交的PR提示:Testing is not configured
95 0
Github参与jdk8u,提交的PR提示:Testing is not configured
|
数据挖掘
SAP MM 明明已经配置好了审批策略,为啥创建的PR单据里不出现release strategy选项卡?
SAP MM 明明已经配置好了审批策略,为啥创建的PR单据里不出现release strategy选项卡?
SAP MM 明明已经配置好了审批策略,为啥创建的PR单据里不出现release strategy选项卡?