下一代 Kubernetes 发行版剖析

架构概述

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

Architecture Overview

RKE2 汇集了许多开源技术:

除了 NGINX Ingress Controller 之外,它们都使用 Go+BoringCrypto 进行编译和静态链接。

进程生命周期

内容引导

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(如果 containerd 停止,shims wrap runc 任务并且不会随之停止)

  • containerd-shim-runc-v1

  • containerd-shim-runc-v2

  • kubelet (Kubernetes node agent)

  • runc (OCI runtime)

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

  • ctr(底层 containerd 维护检查)

  • crictl(底层 CRI 维护和检查)

  • kubectl(kubernetes 集群维护检查)

  • socatcontainerd 使用它来进行端口转发)

提取二进制文件后,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,这意味着 etcdkube-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 进程退出。