本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

资源剖析

本节记录了确定 K3s 最低资源需求的测试结果。

K3s 的最低资源需求

结果总结如下:

组件 处理器 最小 CPU 使用 Kine/SQLite 的最小 RAM 使用嵌入式 etcd 的最小 RAM

带有工作负载的 K3s 服务器

Intel 8375C CPU, 2.90 GHz

6% 的内核

1596 M

1606 M

带有单个代理的 K3s 集群

Intel 8375C CPU, 2.90 GHz

5% 的内核

1428 M

1450 M

K3s 代理

Intel 8375C CPU, 2.90 GHz

3% 的内核

275 M

275 M

带有工作负载的 K3s 服务器

Pi4B BCM2711,1.50 GHz

30% 的内核

1588 M

1613 M

带有单个代理的 K3s 集群

Pi4B BCM2711,1.50 GHz

25% 的内核

1215 M

1413 M

K3s 代理

Pi4B BCM2711,1.50 GHz

10% 的内核

268 M

268 M

资源测试范围

资源测试旨在解决以下问题:

  • 在单节点集群上,确定应预留的合法最小 CPU、内存和 IOPs 以运行整个 K3s 堆栈服务器堆栈,假设集群上将部署真实工作负载。

  • 在代理(工作)节点上,确定应预留的合法最小 CPU、内存和 IOPs 以支持 Kubernetes 和 K3s 控制平面组件(kubelet 和 k3s 代理)。

基准测量中包含的组件

测试的组件包括:

这些是仅使用 K3s 打包组件(Traefik Ingress、Klipper lb、local-path 存储)运行标准监控堆栈(Prometheus 和 Grafana)以及 Guestbook 示例 APP 的稳定系统的基准数据。

包括 IOPS 的资源数据仅适用于 Kubernetes 数据存储和控制平面,不包括系统级管理代理或日志记录、容器镜像管理或任何特定工作负载要求的开销。

方法

使用 prometheus-node-exporter 通过 apt 安装的 收集主机 CPU、内存和磁盘 IO 统计信息的独立 Prometheus v2.43.0 实例。

使用 systemd-cgtop 检查 systemd cgroup 级别的 CPU 和内存利用率。system.slice/k3s.service 跟踪 K3s 和 containerd 的资源利用率,而单个 pod 则位于 kubepods 层级下。

利用集成的 metrics-server,从 kubectl top node 收集了针对服务器和代理进程的额外详细 K3s 内存利用率数据。

利用率数据基于在运行所述工作负载的节点上进行的稳态操作的第95百分位数读数。

环境

架构 OS 系统 CPU RAM 磁盘

x86_64

Ubuntu 22.04

AWS c6id.xlarge

英特尔至强铂金8375C CPU,4核 2.90 GHz

8 GB

NVME SSD

aarch64

Raspberry Pi OS 11

Raspberry Pi 4 Model B

BCM2711,4核 1.50 GHz

8 GB

UHS-III SDXC

基线资源要求

本节记录了确定基本K3s操作的最低资源要求的测试结果。

带有工作负载的 K3s 服务器

这些是单节点集群的要求,其中 K3s 服务器与 简单工作负载 共享资源。

CPU要求为:

系统 CPU核心使用情况

英特尔8375C

6% 的内核

Pi4B

30% 的内核

内存要求为:

测试的数据存储 系统 内存

Kine/SQLite

英特尔8375C

1596 M

Pi4B

1588 M

嵌入式etcd

英特尔8375C

1606 M

Pi4B

1613 M

磁盘要求为:

测试的数据存储 IOPS KiB/sec 延迟

Kine/SQLite

10

500

< 10 ms

嵌入式etcd

50

250

< 5 ms

单代理的 K3s 集群

这些是 K3s 集群的基本要求,包含一个 K3s 服务器节点和一个 K3s 代理,但没有工作负载。

K3s 服务器

CPU要求为:

系统 CPU核心使用情况

英特尔8375C

5% 的内核

Pi4B

25% 的内核

内存要求为:

测试的数据存储 系统 内存

Kine/SQLite

英特尔8375C

1428 M

Pi4B

1215 M

嵌入式etcd

英特尔8375C

1450 M

Pi4B

1413 M

K3s 代理

要求为:

系统 CPU核心使用情况 RAM

英特尔8375C

3% 的内核

275 M

Pi4B

5% 的内核

268 M

主要资源利用驱动因素分析

K3s 服务器的利用率主要受 Kubernetes 数据存储(kine 或 etcd)、API 服务器、控制器管理器和调度程序控制循环的支持驱动,以及进行系统状态更改所需的任何管理任务。对 Kubernetes 控制平面施加额外负载的操作,例如创建/修改/删除资源,将导致利用率的暂时峰值。使用广泛利用 Kubernetes 数据存储的操作员或 APP(如 Rancher 或其他操作员类型的 APP)将增加服务器的资源要求。通过添加额外节点或创建许多集群资源来扩展集群将增加服务器的资源要求。

K3s 代理的利用率主要受容器生命周期管理控制循环的支持驱动。涉及管理镜像、配置存储或创建/销毁容器的操作将导致利用率的暂时峰值。特别是镜像拉取通常高度依赖 CPU 和 IO,因为它们涉及将镜像内容解压到磁盘。如果可能,工作负载存储(pod 瞬态存储和卷)应与代理组件(/var/lib/rancher/k3s/agent)隔离,以确保没有资源冲突。

防止代理和工作负载干扰集群数据存储

在服务器同时托管工作负载 Pod 的环境中运行时,应注意确保代理和工作负载的 IOPS 不会干扰数据存储。

这可以通过将服务器组件(/var/lib/rancher/k3s/server)放置在与代理组件(/var/lib/rancher/k3s/agent)不同的存储介质上来最好地实现,后者包括 containerd 容器镜像存储。

工作负载存储(Pod 瞬态存储和卷)也应与数据存储隔离。

未能满足数据存储的吞吐量和延迟要求可能导致控制平面响应延迟和/或控制平面无法维持系统状态。

K3s 的服务器规格要求

环境

  • 所有代理都是 t3.medium 的 AWS EC2 实例。

    • 单个代理是 c5.4xlarge 实例。这托管了 grafana 监控堆栈,并防止其干扰控制平面的资源。

  • 服务器是 c5 的 AWS EC2 实例。随着代理数量的增加,服务器升级为更大的 c5 实例。

方法

这些数据是在特定测试条件下检索的。这将根据环境和工作负载而有所不同。以下步骤概述了为检索此数据而进行的测试。最后一次在 v1.31.0+k3s1 上执行。所有机器均在 AWS 中配置,使用标准的 20 GiB gp3 卷。测试按照以下步骤进行:

  1. 使用 prometheus 数据源在 grafana 上监控资源。

  2. 以模拟持续集群活动的方式部署工作负载:

    • 一个基本的工作负载,持续地扩展和缩减

    • 一个在循环中被删除和重新创建的工作负载

    • 一个包含多个其他资源(包括 CRD)的恒定工作负载。

  3. 以每次 50-100 个的批次加入代理节点。

  4. 当服务器 CPU 在加入代理时的利用率超过 90% 或 RAM 利用率超过 80% 时,停止添加代理。

观察结果

  • 在加入代理时,服务器 CPU 的利用率比基线高出约 20%。

  • 通常,限制因素是 CPU,而不是 RAM。在大多数测试中,当 CPU 达到 90% 的利用率时,RAM 的利用率约为 60%。

关于高可用性 (HA) 的说明

在每次测试结束时,加入了两个额外的服务器(形成一个基本的 3 节点 HA 集群),以观察这对原始服务器资源的影响。影响是:

  • CPU 利用率明显下降,通常下降 30-50%。

  • RAM 利用率保持不变。

虽然没有进行测试,但在单个服务器上 CPU 利用率作为限制因素的情况下,预计可以加入的代理数量将在 3 节点 HA 集群下增加约 50%。