Skip to main content

下一代 Kubernetes 发行版剖析

架构概述#

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

Architecture Overview

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

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

进程生命周期#

Content Bootstrap#

RKE2 从 RKE2 Runtime 镜像中提取二进制文件和清单来运行serveragent节点。这意味着 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 wrap runc 任务,并且在 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

初始化 Agent#

Agent 进程的入口点。对于 server 进程,嵌入式 K3s 引擎直接调用它。

容器运行时间#

containerd#

生成containerd进程并监听终止。如果containerd退出,那么rke2进程也将退出。

节点 Agent#

kubelet#

生成并监督kubelet进程。如果kubelet退出,那么rke2将尝试重新启动它。一旦 kubelet 运行,它将启动任何可用的静态 pod。对于 server 来说,这意味着etcdkube-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进程退出。

Last updated on by ksd