架构概述
在RKE2中,我们吸取了开发和维护我们的轻量级Kubernetes发行版K3s的经验教训,并将其应用于构建具有K3s易用性的企业级发行版。这意味着,最简单的说,RKE2是一个需要在预期参与Kubernetes集群的所有节点上安装和配置的单个二进制文件。一旦启动,RKE2就能够引导和监督每个节点的适当角色的代理,同时从网络中获取所需的内容。
RKE2 汇集了许多开源技术来实现这一切:
所有这些,除了 NGINX Ingress Controller 之外,都是用Go+BoringCrypto编译和静态链接的。
流程生命周期
内容引导
RKE2从RKE2运行时镜像中获取二进制文件和清单,以运行服务器和代理节点。这意味着RKE2默认会扫描 /var/lib/rancher/rke2/agent/images/*.tar 中的 rancher/rke2-runtime 镜像(其标签与 rke2 --version 的输出相关),如果找不到,它会尝试从网络(即 Docker Hub)中拉取。然后,RKE2从镜像中提取 /bin/,将其展平到 /var/lib/rancher/rke2/data/{RKE2_DATA_KEY} 代表标识镜像的唯一字符串。
为了使 RKE2 按预期工作,运行时映像必须至少提供:
containerd
containerd-shim
containerd-shim-runc-v1
containerd-shim-runc-v2
kubelet
(Kubernetes 节点代理)runc
(OCI 运行时)
运行时映像还提供以下操作工具:
ctr
(containerd
维护和检查)crictl
(CRI 维护和检查)kubectl
(kubernetes集群维护与检查)socat
提取二进制文件后,RKE2 会将映像中的Charts提取到/var/lib/rancher/rke2/server/manifests
目录中。
初始化服务器
在嵌入式 K3s 引擎服务器中,有专门的代理进程,这意味着后续启动将推迟到节点容器运行时启动。
准备组件
kube-apiserver
拉取kube-apiserver
镜像(如果尚未存在),并启动一个 goroutine 等待etcd
,然后将静态 pod 定义写入/var/lib/rancher/rke2/agent/pod-manifests/
.
kube-controller-manager
拉取kube-controller-manager
镜像(如果尚未存在),并启动一个 goroutine 等待kube-apiserver
,然后将静态 pod 定义写入/var/lib/rancher/rke2/agent/pod-manifests/
.
kube-scheduler
拉取kube-scheduler
镜像(如果尚未存在),并启动一个 goroutine 等待kube-apiserver
,然后将静态 pod 定义写入/var/lib/rancher/rke2/agent/pod-manifests/
.
启动集群
在 goroutine 中启动 HTTP 服务器来侦听其他集群服务器/代理,然后初始化/加入集群。
etcd
拉取etcd
镜像(如果尚不存在),然后启动一个 goroutine 等待kubelet
,然后将静态 pod 定义写入/var/lib/rancher/rke2/agent/pod-manifests/
.
helm-controller
helm-controller
等待kube-apiserver
准备就绪后,启动 goroutine 以启动嵌入。
Initialize Agent
代理进程入口点。对于服务器进程,嵌入式 K3s 引擎直接调用它。
容器运行时
containerd
生成containerd
进程并监听终止情况。如果containerd
退出则rke2
进程也将退出。
Node Agent
kubelet
生成并监督该kubelet
过程。如果kubelet
退出,rke2
则将尝试重新启动它。一旦kubelet
运行,它将启动任何可用的静态 Pod。对于服务器来说,这意味着etcd
并将kube-apiserver
连续启动,允许通过静态 pod 启动的其余组件连接到并kube-apiserver
开始处理。
Server Charts
在服务器节点上,helm-controller
现在可以将 中找到的任何图表应用于集群/var/lib/rancher/rke2/server/manifests
。
- rke2-canal.yaml 或 rke2-cilium.yaml(守护程序集、引导程序)
- rke2-coredns.yaml(部署、引导)
- rke2-ingress-nginx.yaml(部署)
- rke2-kube-proxy.yaml(守护程序集、引导程序)
- rke2-metrics-server.yaml(部署)
守护进程
RKE2 进程现在将无限期地运行,直到收到 SIGTERM 或 SIGKILL 或进程containerd
退出。