第16节 sealer code


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


[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 接口的结构体 RuntimeRuntime 结构体定义了安装 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/clustercertgithub.com/sirupsen/logrus

utils:

这段代码实现了一个自定义的 Kubernetes 运行时。它定义了一些常量,然后定义了一个 Runtime 类型,该类型具有用于管理 Kubernetes 集群的方法。例如,它定义了 cleanK8s 方法,用于在节点上清除所有 Kubernetes 相关的配置和数据,以及 joinMasters 方法,用于将新的主节点添加到现有的 Kubernetes 集群中。它还定义了一些其他方法,如 initKube,用于初始化新的节点,以及 sendClusterCert,用于将集群证书发送到新节点。此外,该代码还定义了一些变量,用于存储有关 Kubernetes 集群和节点的信息。

k0s types

定义了一个名为 ClusterConfig 的类型,它包含了一个 ClusterSpec 类型的字段 Spec,和一个 ClusterConfigStatus 类型的字段 StatusClusterSpec 包含了一些用来配置集群的参数,例如 API 服务器的地址,存储配置,网络配置,安全策略等。 ClusterConfigStatus 则用来记录集群的当前状态。

Spec 字段用于存储该集群的配置信息,包括 API 服务器的地址、控制器管理器、调度器、存储、网络、Pod 安全策略、工作节点配置、监控和安装等。

Status 字段用于存储集群的状态信息,例如运行中的节点数量、集群资源使用情况等。

这段代码 声明了一个名为 ClusterConfig 的结构体,它用于描述 Kubernetes 集群配置。该结构体包含了 metav1.ObjectMetametav1.TypeMeta 两个字段,用于描述元数据信息。它还包含了 SpecStatus 两个字段,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 链接