下一代 Kubernetes 发行版剖析
架构概述
在 RKE2 中,我们吸取了开发和维护轻量级 Kubernetes 发行版 K3s 的经验,致力于构建一个同样具备 K3s 易用性的企业级发行版。 换言之,在最简单的情况下,RKE2 是一个二进制文件,需要在 Kubernetes 集群的所有节点上进行安装和配置。一旦启动,RKE2 就能够引导和监督每个节点上的角色合适的 Agent,同时从网络上获取所需的内容。
RKE2 汇集了许多开源技术:
- K3s
- K8s
- etcd
- runc
- containerd/cri
- CNI: Canal (Calico & Flannel), Cilium 或 Calico
- CoreDNS
- NGINX Ingress Controller
- Metrics Server
- Helm
除了 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 定义。
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
进程也会退出。
Node 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
中找到的任何 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)
守护进程
RKE2 进程现在将无限期运行,直到它收到 SIGTERM 或 SIGKILL,或者 containerd
进程退出。