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月前
|
编解码 Ubuntu
记录一次Gstreamer运行报错排查
记录一次Gstreamer运行报错排查
|
6月前
|
前端开发
flowable流程设计器的几个bug修改记录
flowable流程设计器的几个bug修改记录
143 0
|
3月前
|
运维 数据可视化 NoSQL
系统日志规范问题之在循环中打印INFO级别日志的反例如何解决
系统日志规范问题之在循环中打印INFO级别日志的反例如何解决
|
4月前
|
SQL
关于ThinkPHP5.1+的Log无法记录SQL调试记录的小经历
项目开发阶段,除了基本编码外,性能也需要实时关注与优化。之前我的大部分项目都是使用ThinkPHP5.0以及ThinkPHP3.2,对于框架提供的日志记录和日志配置都差不多,然后使用ThinkPHP5.1的时候就吃瘪,花了十几分钟才好,所以写一下防止后面忘记了再踩坑。
129 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日志输出不全问题分析与解决方案
186 0
常见的bug---4、在DataGrip上跑本地模式报return 2异常
常见的bug---4、在DataGrip上跑本地模式报return 2异常
|
存储 SQL
机房重构Debug记录
机房重构Debug记录
如何给Airtest脚本/报告增加log记录
如何给Airtest脚本/报告增加log记录
698 0
|
Java 索引
记录一次执行ArrayList的add方法异常细节复盘| Java Debug 笔记
记录一次执行ArrayList的add方法异常细节复盘| Java Debug 笔记
188 0