下一代 Kubernetes 发行版剖析
架构概述
在 RKE2 中,我们吸取了开发和维护轻量级 Kubernetes 发行版 K3s 的经验,致力于构建一个同样具备 K3s 易用性的企业级发行版。换言之,在最简单的情况下,RKE2 是一个二进制文件,需要在 Kubernetes 集群的所有节点上进行安装和配置。一旦启动,RKE2 就能够引导和监督每个节点上的角色合适的 Agent,同时从网络上获取所需的内容。
RKE2 汇集了许多开源技术:
All of these, except Traefik, are compiled and statically linked with Go+BoringCrypto
进程生命周期
内容引导
RKE2 从 RKE2 Runtime 镜像中提取二进制文件和清单来运行 server 和 agent 节点。换言之,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}/bin,其中 ${RKE2_DATA_KEY} 表示镜像的唯一字符串标识。
为了使 RKE2 按预期工作,运行时镜像必须至少提供:
- 
containerd(CRI) - 
containerd-shim(如果containerd停止,shims wraprunc任务并且不会随之停止) - 
containerd-shim-runc-v1 - 
containerd-shim-runc-v2 - 
kubelet(Kubernetes node agent) - 
runc(OCI runtime) 
运行时镜像还提供了以下操作工具:
- 
ctr(底层containerd维护检查) - 
crictl(底层 CRI 维护和检查) - 
kubectl(kubernetes 集群维护检查) - 
socat(containerd使用它来进行端口转发) 
提取二进制文件后,RKE2 将从镜像中将 Chart 提取到 /var/lib/rancher/rke2/server/manifests 目录。
初始化 Server
在嵌入式 K3s 引擎中,server 是专门的 agent 进程,换言之,它会在节点容器运行时启动后再启动。
kube-apiserver
拉取 kube-apiserver 镜像,如果没有显示,则启动一个 goroutine 来等待 etcd,然后在 /var/lib/rancher/rke2/agent/pod-manifests/ 中写入静态 pod 定义。
启动集群
在 goroutine 中启动 HTTP 服务器来侦听其他集群 server/agent,然后初始化/加入集群。
初始化 Agent
Agent 进程入口点。对于 server 进程,嵌入式 K3s 引擎会直接调用它。
kubelet
生成并监督 kubelet 进程。如果 kubelet 退出,那么 rke2 将尝试重启它。
kubelet 运行后,它将启动任何可用的静态 pod。对于 server,这意味着 etcd 和 kube-apiserver 将依次启动,允许其余组件通过静态 pod 启动,从而连接到 kube-apiserver 并开始处理。
Server Charts
在 Server 节点上,helm-controller 可以将在 /var/lib/rancher/rke2/server/manifests 中找到的任何 Chart 应用于集群。
- 
rke2-canal.yaml or rke2-cilium.yaml or rke2-calico.yaml or rke2-flannel.yaml or rke2-multus.yaml (daemonset, bootstrap)
 - 
rke2-coredns.yaml (deployment, bootstrap)
 - 
rke2-ingress-nginx.yaml and/or rke2-traefik.yaml and rke2-traefik-crd.yaml (deployment)
 - 
rke2-metrics-server.yaml (deployment)
 - 
rke2-runtimeclasses.yaml (deployment)
 - 
rke2-snapshot-controller-crd.yaml, rke2-snapshot-controller.yaml and rke2-snapshot-validation-webhook.yaml (deployment)