下一代 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 BootstrapRKE2 从 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-v1
containerd-shim-runc-v2
kubelet
(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
。
#
初始化 AgentAgent 进程的入口点。对于 server 进程,嵌入式 K3s 引擎直接调用它。
#
容器运行时间containerd
#
生成containerd
进程并监听终止。如果containerd
退出,那么rke2
进程也将退出。
#
节点 Agentkubelet
#
生成并监督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 ProcessRKE2 进程现在将无限期地运行,直到它收到 SIGTERM 或 SIGKILL 或者containerd
进程退出。