第16节 sealer code
❤️💕💕记录sealos开源项目的学习过程。k8s,docker和云原生的学习。Myblog:http://nsddd.top
[TOC]
filepath.Join
Go语言中的路径包,用于通过正斜杠分隔的路径,例如URL中的路径。 Go语言中的 filepath.Join()
函数用于将 任意数量的指定路径元素连接到单个路径中,并在必要时添加分隔符 。此函数对结果调用 Clean
,所有空字符串都将被忽略。此外,此函数在路径包下定义。在这里,您需要导入“path/filepath”
包才能使用这些函数。
用法:
func Join(elem ...string) string
在此,elem 是指定的路径元素。
**返回值:**它返回加入的单路径。
💡简单的一个案例如下:
// Golang program to illustrate the usage of
// filepath.Join() function
// Including the main package
package main
// Importing fmt and path/filepath
import (
"fmt"
"path/filepath"
)
// Calling main
func main() {
// Calling the Join() function
fmt.Println(filepath.Join("G", "F", "G"))
fmt.Println(filepath.Join("G/F", "G"))
fmt.Println(filepath.Join("gfg", "GFG"))
fmt.Println(filepath.Join("Geeks", "for", "Geeks"))
}
**🚀 编译结果如下: **
G/F/G
G/F/G
gfg/GFG
Geeks/for/Geeks
join master and join node
分别对应的是加入
master
节点和node
节点
加入node节点:
这段 Go 代码主要用来执行 Kubernetes
节点加入集群操作。它定义了一个名为 joinNodes
的函数,该函数接收两个参数:一个字符串数组 newNodes
和一个 kubeadmConfig
结构体,并返回一个错误值。在函数体中,它会判断 newNodes
数组的长度是否为 0,如果是,就返回 nil
。否则,它会执行 initKube
函数并传入 newNodes
数组,然后为每个主节点创建一个 --rs
字符串,并使用 JoinHostPort
函数将主节点的 IP
地址和端口 6433 结合在一起。然后它会创建一个 ipvs
命令并调用 joinNode
函数,最后返回这个函数的结果。
加入master节点:
该代码是实现了一个对 Kubernetes 的安装和管理的接口。它包含了一个配置结构体 Config
和一个实现了 runtime.Installer
接口的结构体 Runtime
。 Runtime
结构体定义了安装 Kubernetes 的函数 Install
,以及其他管理 Kubernetes 集群的函数。
这个 joinMasters
函数似乎是一个定制的 kubernetes
运行时的一部分。它似乎是一种用于将一个或多个新的主节点添加到现有的 Kubernetes 集群中的方法。它通过首先使用 initKube
方法初始化新的主节点,然后使用 copyStaticFiles
方法将一些静态文件复制到新节点,来实现这一点。然后,它使用 sendKubeConfigFilesToMaster
方法将 kube 配置文件发送到新的主节点。它还使用 sendClusterCert
方法将集群证书发送到新的主节点。最后,它使用 Command
方法生成新的主节点的加入命令,然后在新节点上执行该命令。
init初始化:
思路:
- 当sealer先引导cluster install时,init阶段将rootfs/bin复制到init.sh脚本中的/usr/bin
- 创建引导程序配置 /etc/k0s/k0s.yaml 以引导控制器初始化
- 生成 k0s 连接令牌 /etc/k0s/worker-token 和 /etc/k0s/controller-token,也是私有注册表证书
- 初始化控制器节点
- 获取 ~/.kube/config 的配置以管理集群。
该代码是在初始化 Kubernetes
集群,并完成相关配置和初始化工作。具体来说,它会完成以下工作:
- 配置主机环境
- 初始化
kubeadm
服务 - 生成证书
- 初始化集群
- 拷贝静态文件到远程主机
- 获取集群信息
- 获取
kubeadm
配置文件 - 序列化
kubeadm
配置文件 - 将序列化后的
kubeadm
配置文件拷贝到远程主机 - 清理临时文件
此外,这段代码中还用到了一些第三方库,例如:
k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
github.com/sealerio/sealer/pkg/runtime/kubernetes/kubeadm
github.com/sealerio/sealer/utils/shellcommand
github.com/sealerio/sealer/pkg/clustercert
和github.com/sirupsen/logrus
。
utils:
这段代码实现了一个自定义的 Kubernetes 运行时。它定义了一些常量,然后定义了一个 Runtime
类型,该类型具有用于管理 Kubernetes 集群的方法。例如,它定义了 cleanK8s
方法,用于在节点上清除所有 Kubernetes 相关的配置和数据,以及 joinMasters
方法,用于将新的主节点添加到现有的 Kubernetes 集群中。它还定义了一些其他方法,如 initKube
,用于初始化新的节点,以及 sendClusterCert
,用于将集群证书发送到新节点。此外,该代码还定义了一些变量,用于存储有关 Kubernetes 集群和节点的信息。
k0s types
定义了一个名为 ClusterConfig
的类型,它包含了一个 ClusterSpec
类型的字段 Spec
,和一个 ClusterConfigStatus
类型的字段 Status
。 ClusterSpec
包含了一些用来配置集群的参数,例如 API 服务器的地址,存储配置,网络配置,安全策略等。 ClusterConfigStatus
则用来记录集群的当前状态。
Spec
字段用于存储该集群的配置信息,包括 API 服务器的地址、控制器管理器、调度器、存储、网络、Pod 安全策略、工作节点配置、监控和安装等。
Status
字段用于存储集群的状态信息,例如运行中的节点数量、集群资源使用情况等。
这段代码 声明了一个名为 ClusterConfig
的结构体,它用于描述 Kubernetes 集群配置。该结构体包含了 metav1.ObjectMeta
和 metav1.TypeMeta
两个字段,用于描述元数据信息。它还包含了 Spec
和 Status
两个字段,Spec
用于描述集群的期望状态,Status
用于描述集群的实际状态。 Spec
字段又包含了多个子字段,用于描述集群中不同组件的配置。此外,该结构体还实现了 kubebuilder
生成的一些方法,用于管理和操作 Kubernetes 集群配置。
此外,代码还定义了一些接口和方法,用于处理该类型的对象,例如 创建、删除、查询、更新 等。
字段:
// ClusterSpec defines the desired state of ClusterConfig
type ClusterSpec struct {
API *APISpec `json:"api"`
ControllerManager *ControllerManagerSpec `json:"controllerManager,omitempty"`
Scheduler *SchedulerSpec `json:"scheduler,omitempty"`
Storage *StorageSpec `json:"storage"`
Network *Network `json:"network"`
PodSecurityPolicy *PodSecurityPolicy `json:"podSecurityPolicy"`
WorkerProfiles WorkerProfiles `json:"workerProfiles,omitempty"`
Telemetry *ClusterTelemetry `json:"telemetry"`
Install *InstallSpec `json:"installConfig,omitempty"`
Images *ClusterImages `json:"images"`
Extensions *ClusterExtensions `json:"extensions,omitempty"`
Konnectivity *KonnectivitySpec `json:"konnectivity,omitempty"`
}
ClusterSpec
是一个结构体类型,定义了集群配置信息所包含的字段。它包含了以下字段:
API
:存储 API 服务器的相关配置信息。ControllerManager
:存储控制器管理器的相关配置信息。Scheduler
:存储调度器的相关配置信息。Storage
:存储存储相关的配置信息。Network
:存储网络相关的配置信息。PodSecurityPolicy
:存储 Pod 安全策略相关的配置信息。WorkerProfiles
:存储工作节点配置相关的信息。Telemetry
:存储监控相关的配置信息。Install
:存储安装相关的配置信息。Images
:存储镜像相关的配置信息。Extensions
:存储扩展相关的配置信息。Konnectivity
:存储连接性相关的配置信息。
ClusterConfig:
// ClusterConfig is the Schema for the clusterconfigs API
type ClusterConfig struct {
metav1.ObjectMeta `json:"metadata,omitempty"`
metav1.TypeMeta `json:",omitempty,inline"`
Spec *ClusterSpec `json:"spec,omitempty"`
Status ClusterConfigStatus `json:"status,omitempty"`
}
ClusterConfig
是一个结构体类型,定义了 Kubernetes 集群的配置信息。它包含了以下字段:
ObjectMeta
:存储元数据信息。TypeMeta
:存储类型元数据信息。Spec
:存储集群配置信息。Status
:存储集群状态信息。
APISpec:
// APISpec defines the settings for the K0s API
type APISpec struct {
// Local address on which to bind an API
Address string `json:"address"`
// The loadbalancer address (for k0s controllers running behind a loadbalancer)
ExternalAddress string `json:"externalAddress,omitempty"`
// TunneledNetworkingMode indicates if we access to KAS through konnectivity tunnel
TunneledNetworkingMode bool `json:"tunneledNetworkingMode"`
// Map of key-values (strings) for any extra arguments to pass down to Kubernetes api-server process
ExtraArgs map[string]string `json:"extraArgs,omitempty"`
// Custom port for k0s-api server to listen on (default: 9443)
K0sAPIPort int `json:"k0sApiPort,omitempty"`
// Custom port for kube-api server to listen on (default: 6443)
Port int `json:"port"`
// List of additional addresses to push to API servers serving the certificate
SANs []string `json:"sans"`
}
APISpec
是一个结构体类型,定义了 API 服务器的配置信息。它包含了以下字段:
Address
:存储 API 服务器绑定的本地地址。ExternalAddress
:存储 API 服务器负载均衡器的地址。TunneledNetworkingMode
:指示是否通过连接性隧道来访问 KAS。ExtraArgs
:存储传递给 Kubernetes API 服务器进程的额外参数的键值映射。K0sAPIPort
:存储 k0s-api 服务器监听的自定义端口。Port
:存储 kube-api 服务器监听的自定义端口。APISpec
还包含一个名为SANs
的字段,用于存储推送到证书服务器的额外地址的列表。
💡简单的一个案例如下:
api := APISpec{
Address: "192.168.1.100",
ExternalAddress: "172.16.1.1",
TunneledNetworkingMode: true,
ExtraArgs: map[string]string{
"max-requests-inflight": "500",
"v": "4",
},
K0sAPIPort: 9443,
Port: 6443,
SANs: []string{"192.168.1.100", "172.16.1.1"},
}
spec := ClusterSpec{
API: &api,
}
config := ClusterConfig{
Spec: &spec,
}
runtime/cluster-runtime
clusterfile
checker
client
docker
Kubernetes
这段代码定义了一个 Client
结构体,它封装了一个 Kubernetes 客户端,并提供了一些方法来操作 Kubernetes 集群中的节点、名称空间、服务和 pod。例如,ListNodes
方法用于获取集群中的所有节点,UpdateNode
方法用于更新指定的节点,ListAllNamespacesPods
方法用于获取所有名称空间的所有 pod 的列表。
Client
结构体由一个*kubernetes.Clientset
字段组成。kubernetes.Clientset
是 Kubernetes API 客户端的主要入口点,包含了用于操作各种 Kubernetes 资源的各种方法。NamespacePod
结构体包含了一个名称空间的信息和该名称空间中的所有 pod 的列表。NamespaceSvc
结构体包含了一个名称空间的信息和该名称空间中的所有服务的列表
END 链接
✴️版权声明 © :本书所有内容遵循CC-BY-SA 3.0协议(署名-相同方式共享)©