第3节 学习 sealos 的项目结构
❤️💕💕记录sealos开源项目的学习过程。k8s,docker和云原生的学习。Myblog:http://nsddd.top
[TOC]
目录结构
controllers
目录折叠
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
controllers 控制器用来管理集群(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依赖的命令行。sealos
:sealos 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
,网页编程中用到的HTML
和CSS
也都属于声明式编程。
通过观察声明式编程的代码我们可以发现它有一个特点是它不需要创建变量用来存储数据。 另一个特点是它不包含循环控制的代码如for
,while
。
函数式编程:
函数式编程和声明式编程是有所关联的,因为他们思想是一致的:即只关注做什么而不是怎么做。但函数式编程不仅仅局限于声明式编程。 函数式编程最重要的特点是**“函数第一位”**,即函数可以出现在任何地方,比如你可以把函数作为参数传递给另一个函数,不仅如此你还可以将函数作为返回值。大部分常见的编程语言一半都已经提供了对这种编程方式的支持,比如 JavaScript,再有 C# 中的 LINQ 和 Java 中的 Lambda
和闭包的概念。Java 8
最大的一个对函数式编程支持的更新就是Stream API
,感兴趣的可以了解下,官方文档地址:https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
相比于以前的命令式编程,在 Java 中我个人现在更倾向于函数式编程的方法,它可以让代码的逻辑更清晰更优雅,比如同样的逻辑用Java 8
的Stream
方式写就是:
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
desktop 前端部分
cloud是以前写的一些东西 – 不重要
scripts 一些脚本
service
有一些 http
服务,test
就是集群测试。
GitHub
第三方登陆回调~
pkg 大量的实现部分
在这里,我们需要和cluster.go
结合起来了,这个贯穿始终的,cluster.go
描述整个集群期望状态 -- 几个master
,几个node
,ssh
密码、端口号、集群镜像、贯穿始终,特别特别重要 -- 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
,几个node
,ssh
密码、端口号、集群镜像、贯穿始终,特别特别重要 --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
就比如说下面的拉取命令:
# 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 链接
✴️版权声明 © :本书所有内容遵循CC-BY-SA 3.0协议(署名-相同方式共享)©