下一代 Kubernetes 发行版剖析
架构概述
在 RKE2 中,我们吸取了开发和维护轻量级 Kubernetes 发行版 K3s 的经验,致力于构建一个同样具备 K3s 易用性的企业级发行版。换言之,在最简单的情况下,RKE2 是一个二进制文件,需要在 Kubernetes 集群的所有节点上进行安装和配置。一旦启动,RKE2 就能够引导和监督每个节点上的角色合适的 Agent,同时从网络上获取所需的内容。
RKE2 汇集了许多开源技术:
除了 NGINX Ingress Controller 之外,它们都使用 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 (daemonset, bootstrap)
-
rke2-coredns.yaml (deployment, bootstrap)
-
rke2-ingress-nginx.yaml (deployment)
-
rke2-kube-proxy.yaml (daemonset, bootstrap)
-
rke2-metrics-server.yaml (deployment)