下一代 Kubernetes 发行版剖析
架构概述
在 RKE2 中,我们吸取了开发和维护轻量级Kubernetes发行版K3s的经验教训,并将其应用于构建一个具有K3s易用性的企业级发行版。这意味着,RKE2 在最简单的情况下是一个单一的二进制文件,需要在所有参与Kubernetes集群的节点上安装和配置。一旦启动,RKE2 就能够引导和监督每个节点上的角色合适的 agent,同时从网络上获取所需的内容。

RKE2 汇集了一些开源技术来实现这一切:
- K3s
- K8s
- etcd
- runc
- containerd/cri
- CNI]gh-cni: Canal (Calico ; Flannel), Cilium 或 Calico
- CoreDNS
- NGINX Ingress Controller
- Metrics Server
- Helm
除了 NGINX Ingress Controller,所有这些都是用Go+BoringCrypto编译和静态链接的。
进程生命周期
Content Bootstrap
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(shims wraprunc任务,并且在containerd执行时不会停止)containerd-shim-runc-v1containerd-shim-runc-v2kubelet(Kubernetes 节点 agent)runc(OCI runtime)
运行时镜像还提供了以下 ops 工具:
ctr(低级别的containerd维护和检查)crictl(低级别的 CRI 维护和检查)kubectl(kubernetes 集群维护和检查)socat(由containerd需要,用于端口转发)
在二进制文件被提取后,RKE2 将从镜像中提取 charts 到/var/lib/rancher/rke2/server/manifests目录。
初始化 Server
在嵌入式 K3s 引擎中,server 是专门的 agent 进程,这意味着后续启动将推迟到节点容器运行时启动。
组件准备
kube-apiserver
拉取 kube-apiserver 镜像(如果不存在),并启动一个 goroutine 来等待 etcd,然后在/var/lib/rancher/rke2/agent/pod-manifests/中写入静态 pod 定义。
kube-controller-manager
拉取 kube-controller-manager 镜像(如果不存在),并启动一个 goroutine 来等待kube-apiserver,然后在/var/lib/rancher/rke2/agent/pod-manifests/中写入静态 pod 定义。
kube-scheduler
拉取 kube-scheduler 镜像(如果不存在),并启动一个 goroutine 来等待 kube-apiserver,然后在/var/lib/rancher/rke2/agent/pod-manifests/中写入静态 pod 定义。
启动群集
在一个 goroutine 中启动一个 HTTP 服务器,以监听其他集群 server/agent,然后初始化/加入集群。
etcd
拉取 etcd 镜像(如果不存在),启动一个 goroutine 来等待 kubelet,然后在/var/lib/rancher/rke2/agent/pod-manifests/中写入静态 pod 定义。
helm-controller。
在等待kube-apiserver准备就绪后,启动 goroutine 来启动嵌入式 helm-controller。
初始化 Agent
Agent 进程的入口点。对于 server 进程,嵌入式 K3s 引擎直接调用它。
容器运行时间
containerd
生成containerd进程并监听终止。如果containerd退出,那么rke2进程也将退出。
节点 Agent
kubelet
生成并监督kubelet进程。如果kubelet退出,那么rke2将尝试重新启动它。一旦 kubelet 运行,它将启动任何可用的静态 pod。对于 server 来说,这意味着etcd和kube-apiserver将依次启动,允许其余通过静态 pod 启动的组件连接到kube-apiserver并开始处理。
Server Charts
在 server 节点上,helm-controller可以将在/var/lib/rancher/rke2/server/manifests中找到的任何 charts 应用到集群中。
- 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)
Daemon Process
RKE2 进程现在将无限期地运行,直到它收到 SIGTERM 或 SIGKILL 或者containerd进程退出。