RKE2 - 下一代Kubernetes

916 阅读4分钟

架构概述

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

架构概述

RKE2 汇集了许多开源技术来实现这一切:

所有这些,除了 NGINX Ingress Controller 之外,都是用Go+BoringCrypto编译和静态链接的。

流程生命周期

内容引导

RKE2从RKE2运行时镜像中获取二进制文件和清单,以运行服务器和代理节点。这意味着RKE2默认会扫描 /var/lib/rancher/rke2/agent/images/*.tar 中的 rancher/rke2-runtime 镜像(其标签与 rke2 --version 的输出相关),如果找不到,它会尝试从网络(即 Docker Hub)中拉取。然后,RKE2从镜像中提取 /bin/,将其展平到 /var/lib/rancher/rke2/data/RKE2DATAKEY/bin,其中{RKE2_DATA_KEY}/bin,其中 {RKE2_DATA_KEY} 代表标识镜像的唯一字符串。

为了使 RKE2 按预期工作,运行时映像必须至少提供:

  • containerd
  • containerd-shim
  • containerd-shim-runc-v1
  • containerd-shim-runc-v2
  • kubelet(Kubernetes 节点代理)
  • runc(OCI 运行时)

运行时映像还提供以下操作工具:

  • ctrcontainerd维护和检查)
  • crictl(CRI 维护和检查)
  • kubectl(kubernetes集群维护与检查)
  • socat

提取二进制文件后,RKE2 会将映像中的Charts提取到/var/lib/rancher/rke2/server/manifests目录中。

初始化服务器

在嵌入式 K3s 引擎服务器中,有专门的代理进程,这意味着后续启动将推迟到节点容器运行时启动。

准备组件
kube-apiserver

拉取kube-apiserver镜像(如果尚未存在),并启动一个 goroutine 等待etcd ,然后将静态 pod 定义写入/var/lib/rancher/rke2/agent/pod-manifests/.

kube-controller-manager

拉取kube-controller-manager镜像(如果尚未存在),并启动一个 goroutine 等待kube-apiserver ,然后将静态 pod 定义写入/var/lib/rancher/rke2/agent/pod-manifests/.

kube-scheduler

拉取kube-scheduler镜像(如果尚未存在),并启动一个 goroutine 等待kube-apiserver ,然后将静态 pod 定义写入/var/lib/rancher/rke2/agent/pod-manifests/.

启动集群

在 goroutine 中启动 HTTP 服务器来侦听其他集群服务器/代理,然后初始化/加入集群。

etcd

拉取etcd镜像(如果尚不存在),然后启动一个 goroutine 等待kubelet ,然后将静态 pod 定义写入/var/lib/rancher/rke2/agent/pod-manifests/.

helm-controller

helm-controller等待kube-apiserver准备就绪后,启动 goroutine 以启动嵌入。

Initialize Agent

代理进程入口点。对于服务器进程,嵌入式 K3s 引擎直接调用它。

容器运行时
containerd

生成containerd进程并监听终止情况。如果containerd退出则rke2进程也将退出。

Node Agent
kubelet

生成并监督该kubelet过程。如果kubelet退出,rke2则将尝试重新启动它。一旦kubelet运行,它将启动任何可用的静态 Pod。对于服务器来说,这意味着etcd 并将kube-apiserver连续启动,允许通过静态 pod 启动的其余组件连接到并kube-apiserver开始处理。

Server Charts

在服务器节点上,helm-controller现在可以将 中找到的任何图表应用于集群/var/lib/rancher/rke2/server/manifests

  • rke2-canal.yaml 或 rke2-cilium.yaml(守护程序集、引导程序)
  • rke2-coredns.yaml(部署、引导)
  • rke2-ingress-nginx.yaml(部署)
  • rke2-kube-proxy.yaml(守护程序集、引导程序)
  • rke2-metrics-server.yaml(部署)

守护进程

RKE2 进程现在将无限期地运行,直到收到 SIGTERM 或 SIGKILL 或进程containerd退出。