第3节 学习 sealos 的项目结构



❤️💕💕记录sealosopen in new window开源项目的学习过程。k8s,docker和云原生的学习open in new window。Myblog:http://nsddd.topopen in new window


[TOC]

目录结构

controllersopen in new window

目录折叠
PS C:\Users\smile\Desktop\my\sealos\controllers> tree      
卷 系统 的文件夹 PATH 列表
卷序列号为 DE95-1D97
C:.
├─app  # 我们整个应用生命周期
│  ├─api
│  │  └─v1
│  ├─config  
│  │  ├─crd
│  │  │  ├─bases
│  │  │  └─patches
│  │  ├─default
│  │  ├─manager
│  │  ├─prometheus
│  │  ├─rbac
│  │  └─samples
│  ├─controllers
│  ├─deploy
│  │  └─manifests
│  └─hack
├─cluster # 专门管理aws上k8s生命周期
│  ├─api
│  │  └─v1
│  ├─applier
│  ├─config
│  │  ├─crd
│  │  │  ├─bases
│  │  │  └─patches
│  │  ├─default
│  │  ├─manager
│  │  ├─prometheus
│  │  ├─rbac
│  │  └─samples
│  ├─controllers
│  ├─deploy
│  │  └─manifests
│  └─hack
├─infra  # 管理基础设施,管理虚拟机、容器或者网络、磁盘
│  ├─api
│  │  └─v1
│  ├─common
│  ├─config
│  │  ├─crd
│  │  │  ├─bases
│  │  │  └─patches
│  │  ├─default
│  │  ├─manager
│  │  ├─prometheus
│  │  ├─rbac
│  │  └─samples
│  ├─controllers
│  ├─deploy
│  │  └─manifests
│  ├─drivers
│  │  └─aws
│  └─hack
├─metering  # 自定义计量,计费资源
│  ├─api
│  │  └─v1
│  ├─config
│  │  ├─crd
│  │  │  ├─bases
│  │  │  └─patches
│  │  ├─default
│  │  ├─manager
│  │  ├─prometheus
│  │  ├─rbac
│  │  └─samples
│  ├─controllers
│  ├─deploy
│  │  └─manifests
│  └─hack
├─terminal  # cmd
│  ├─api
│  │  └─v1
│  ├─config
│  │  ├─crd
│  │  │  ├─bases
│  │  │  └─patches
│  │  ├─default
│  │  ├─manager
│  │  ├─prometheus
│  │  ├─rbac
│  │  └─samples
│  ├─controllers
│  ├─deploy
│  │  └─manifests
│  ├─hack
│  └─scripts
└─user  
    ├─api
    │  └─v1
    ├─config
    │  ├─certmanager
    │  ├─crd
    │  │  ├─bases
    │  │  └─patches
    │  ├─default
    │  ├─manager
    │  ├─prometheus
    │  ├─rbac
    │  ├─samples
    │  └─webhook
    ├─controllers
    │  ├─cache
    │  └─helper
    ├─deploy
    │  └─manifests
    └─hack

controllersopen in new window 控制器用来管理集群(k8s 有一些内置的功能 pod,deloyment这些,同样可以controllers扩展):

这些功能都是 k8s 没有的功能~

我们跑了很多服务器都是通过infra管理他们

metering是用作计量,我们用过多少资源

terminal就是桌面上的终端应用

user就是用户的管理,因为cloud.sealos是一个多租户的集群

cmd

代码的入口就是在cmd中

[root@VM-4-6-centos cmd]# tree -d
.
├── image-cri-shim  # 镜像代理 
│   └── cmd  
├── lvscare  # 负载均衡
│   └── cmd
├── sealctl  # 封装了一些shell,在服务器上没有shell工具,封装内核打交道命令
│   └── cmd
└── sealos  # 核心入口⬇️
    └── cmd

详细介绍:

  • image-cri-shim:拦截通信,检测已经有的镜像,替换
  • lvscare:负载均衡器,每个结点都会跑lvscare,都去跑三个master,做负载均衡,master 挂掉就会清掉结点。
  • sealctl:封装了一些 shell ,在服务器上没有 shell 工具,封装内核打交道命令,sealos依赖的命令行。
  • sealossealos run 类似于 k8s 实现
k8s指令式和声明式:

K8S的架构,其中有一点很重要的是整体架构采用的是 声明式编程,主要的编程范式有三种:命令式编程声明式编程函数式编程

命令式编程:

命令式编程的主要思想是关注 计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。 比如:如果你想在一个数字集合 collection(变量名) 中筛选大于 5 的数字,你需要这样告诉计算机: 第一步,创建一个存储结果的集合变量 results; 第二步,遍历这个数字集合 collection; 第三步:一个一个地判断每个数字是不是大于 5,如果是就将这个数字添加到结果集合变量 results中。

代码实现如下:

//创建一个存储结果的集合变量,用于存储所有的节点的结果
var results = make(map[string]string)
//遍历这个集合,打印出所有节点的结果
for k, v := range results {
	//判断每个数字时候大于5
	if v > 5 {
		//添加到集合results中
		results[k] = v
	}
}

很明显,这个样子的代码是很常见的一种,不管你用的是C,C++还是C#,Java,Javascript,BASIC,Python,Ruby等等,你都可以以这个方式写。

声明式编程:

声明式编程是以数据结构的形式来表达程序执行的逻辑。它的主要思想是告诉计算机应该做什么,但不指定具体要怎么做。 SQL 语句就是最明显的一种声明式编程的例子,例如:

 SELECT * FROM collection WHERE num > 5

除了SQL,网页编程中用到的HTMLCSS也都属于声明式编程。

通过观察声明式编程的代码我们可以发现它有一个特点是它不需要创建变量用来存储数据。 另一个特点是它不包含循环控制的代码如forwhile

函数式编程:

函数式编程和声明式编程是有所关联的,因为他们思想是一致的:即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程。 函数式编程最重要的特点是**“函数第一位”**,即函数可以出现在任何地方,比如你可以把函数作为参数传递给另一个函数,不仅如此你还可以将函数作为返回值。大部分常见的编程语言一半都已经提供了对这种编程方式的支持,比如 JavaScript,再有 C# 中的 LINQ 和 Java 中的 Lambda 和闭包的概念。Java 8最大的一个对函数式编程支持的更新就是Stream API,感兴趣的可以了解下,官方文档地址:https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.htmlopen in new window

相比于以前的命令式编程,在 Java 中我个人现在更倾向于函数式编程的方法,它可以让代码的逻辑更清晰更优雅,比如同样的逻辑用Java 8Stream方式写就是:

List<Number> results = collection.stream()
                                 .filter(n -> n > 5)
                                 .collect(Collectors.toList());

sealos:核心入口:

[root@VM-4-6-centos cmd]# cd sealos/cmd/ && tree 
.
├── add.go
├── apply.go
├── delete.go
├── docs.go
├── exec.go
├── gen.go
├── images.go
├── reset.go
├── root.go
├── run.go  # 整个sealos入口
├── scp.go
└── version.go

desktopopen in new window 前端部分

cloud是以前写的一些东西 – 不重要

scriptsopen in new window 一些脚本

serviceopen in new window

有一些 http 服务,test 就是集群测试。

GitHub 第三方登陆回调~

pkgopen in new window 大量的实现部分

在这里,我们需要和cluster.go结合起来了,这个贯穿始终的,cluster.go描述整个集群期望状态 -- 几个master,几个nodessh密码、端口号、集群镜像、贯穿始终,特别特别重要 -- sealos run 也是渲染成结构体传递给其他模块~

也是我需要做的主要部分:

  • apply:期望状态和实际状态一致 创建的时候:
  • ssh:远程访问
  • types:很重要,整个pkg结构体的定义(贯穿始终)
  • rountime:结点的实现 — 实现如何去装 k8s
buildimage   #镜像构建
cert k8s  #证书管理
checker   #预处理--检查集群能否装上
client-go   #调用k8s接口
cloud   #是用rust写的前端模块,写了一半
config   #配置文件
filesystem   #分发到每个结点
guest   #执行镜像的cmd

types 类型

[root@VM-4-6-centos pkg]# cd types/
[root@VM-4-6-centos types]# tree  
├── v1beta1
│   ├── cluster_args.go
│   ├── cluster.go  
# cluster.go描述整个集群期望状态 -- 几个master,几个node,ssh密码、端口号、集群镜像、贯穿始终,特别特别重要  -- sealos run也是渲染成结构体传递给其他模块~
│   ├── config.go  
│   ├── constants.go
│   ├── defaults_cluster.go
│   ├── defaults.go
│   ├── defaults_infra.go
│   ├── doc.go
│   ├── helper.go
│   ├── infra.go															
│   ├── register.go 
│   └── zz_generated.deepcopy.go
└── validation
    └── validation_infra.go

2 directories, 13 files

cluster.go描述整个集群期望状态(使用的是命令式) -- 几个master,几个nodessh密码、端口号、集群镜像、贯穿始终,特别特别重要 -- sealos run也是渲染成结构体传递给其他模块~

  • 集群没有,创建。
  • 集群有,字段挨着比对。

现在的写法不是很满意~,对于升级等其他操作需要优化。

rountime

我们看下 interface:

各个结点做了什么,我们写了 *KubeadmRuntime 实现,我们也可以写一个二进制的实现,也可以写一个 k3s 或者 k0s 实现。

type Interface interface {
	Init() error
	Reset() error
	JoinNodes(newNodesIPList []string) error
	DeleteNodes(nodeIPList []string) error
	JoinMasters(newMastersIPList []string) error
	DeleteMasters(mastersIPList []string) error
	SyncNodeIPVS(mastersIPList, nodeIPList []string) error
}

ssh库

copy 模块到某一个结点,做一些远程执行命令

目的

sealos run k0s:latest --masters xxx --nodes xxxx --passwd xxxx
再创建一个k0s或者k3s,现有一个k8s

image-20221023230147303

就比如说下面的拉取命令:

# Download and install sealos. sealos is a golang binary so you can just download and copy to bin. You may also download it from release page.
$ wget  https://github.com/labring/sealos/releases/download/v4.1.3/sealos_4.1.3_linux_amd64.tar.gz  && \
    tar -zxvf sealos_4.1.3_linux_amd64.tar.gz sealos &&  chmod +x sealos && mv sealos /usr/bin 
# Create a cluster	
$ sealos run labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 \
     --masters 192.168.64.2,192.168.64.22,192.168.64.20 \
     --nodes 192.168.64.21,192.168.64.19 -p [your-ssh-passwd]

注意:我们还需要判断输入的是k0s还是k8s,然后根据这个来选择合适的接口接入~

test

测试,关于 makefile

root@cubmaster01:/workspces/sealos# make help

Usage: make <TARGETS> <OPTIONS> ...

Targets:
  build                Build source code for host platform.
  build.multiarch      Build source code for multiple platforms. See option PLATFORMS.
  lint                 Check syntax and styling of go sources.
  format               Gofmt (reformat) package sources.
  coverage             Run unit tests and output test coverage.
  compress             Compress the binaries using upx for host platform.
  compress.multiarch   Compress the binaries using upx for multiple platforms. See option PLATFORMS.
  verify-license       Verify the license headers for all files.
  add-license          Ensure source code files have license headers.
  gen                  Generate all necessary files.
  tools                Install dependent tools.
  clean                Remove all files that are created by building.
  update-contrib       Update list of contributors.
  help                 Show this help info.

Options:
  DEBUG            Whether or not to generate debug symbols. Default is 0.

  BINS             Binaries to build. Default is all binaries under cmd.
                   This option is available when using: make {build/compress}(.multiarch)
                   Example: make build BINS="sealos sealctl"

  PLATFORMS        Platform to build for. Default is linux_arm64 and linux_amd64.
                   This option is available when using: make {build/compress}.multiarch
                   Example: make build.multiarch PLATFORMS="linux_arm64 linux_amd64"

  V                Set to 1 enable verbose build. Default is 0.

END 链接