需求
K3s 非常轻量级,但有一些最低需求,如下所述。
无论您是配置 K3s 在容器中运行还是作为原生 Linux 服务运行,每个运行 K3s 的节点都应满足以下最低要求。这些要求是 K3s 及其打包组件的基线,不包括工作负载本身消耗的资源。
先决条件
两个节点不能具有相同的主机名。
如果多个节点将具有相同的主机名,或者如果主机名可能被自动配置系统重用,请使用--with-node-id
选项为每个节点附加随机后缀,或设计一个唯一名称,使用--node-name
或$K3S_NODE_NAME
传递给您添加到集群的每个节点。
架构
K3s 可用于以下架构
- x86_64
- armhf
- arm64/aarch64
- s390x
在 2023 年 5 月之前的版本(v1.24.14+k3s1、v1.25.10+k3s1、v1.26.5+k3s1、v1.27.2+k3s1)中,在aarch64/arm64
系统上,内核必须使用 4k 页面。RHEL9、Ubuntu、Raspberry PI OS和SLES都满足此要求。
操作系统
K3s 预计可以在大多数现代 Linux 系统上运行。
某些操作系统有其他设置要求
- SUSE Linux Enterprise / openSUSE
- Red Hat Enterprise Linux / CentOS / Fedora
- Ubuntu / Debian
- 树莓派
建议关闭 firewalld
systemctl disable firewalld --now
如果您希望保持 firewalld 启用,则默认情况下需要以下规则
firewall-cmd --permanent --add-port=6443/tcp #apiserver
firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16 #pods
firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16 #services
firewall-cmd --reload
根据您的设置,可能需要打开其他端口。有关更多信息,请参阅入站规则。如果您更改了 Pod 或服务的默认 CIDR,则需要相应地更新防火墙规则。
建议关闭 firewalld
systemctl disable firewalld --now
如果您希望保持 firewalld 启用,则默认情况下需要以下规则
firewall-cmd --permanent --add-port=6443/tcp #apiserver
firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16 #pods
firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16 #services
firewall-cmd --reload
根据您的设置,可能需要打开其他端口。有关更多信息,请参阅入站规则。如果您更改了 Pod 或服务的默认 CIDR,则需要相应地更新防火墙规则。
如果启用,则需要禁用 nm-cloud-setup 并重新启动节点
systemctl disable nm-cloud-setup.service nm-cloud-setup.timer
reboot
较旧的 Debian 版本可能会遇到已知的 iptables 故障。请参阅已知问题。
建议关闭 ufw(简单防火墙)
ufw disable
如果您希望保持 ufw 启用,则默认情况下需要以下规则
ufw allow 6443/tcp #apiserver
ufw allow from 10.42.0.0/16 to any #pods
ufw allow from 10.43.0.0/16 to any #services
根据您的设置,可能需要打开其他端口。有关更多信息,请参阅入站规则。如果您更改了 Pod 或服务的默认 CIDR,则需要相应地更新防火墙规则。
Raspberry Pi OS 基于 Debian,可能会遇到已知的 iptables 故障。请参阅已知问题。
Cgroups
标准的 Raspberry Pi OS 安装不会在启动时启用cgroups
。K3S需要cgroups
才能启动 systemd 服务。可以通过将cgroup_memory=1 cgroup_enable=memory
附加到/boot/firmware/cmdline.txt
来启用cgroups
。
注意:在 Debian 11 和更旧的 Pi OS 版本中,cmdline.txt 位于/boot/cmdline.txt
。
cmdline.txt 示例
console=serial0,115200 console=tty1 root=PARTUUID=58b06195-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_memory=1 cgroup_enable=memory
Ubuntu Vxlan 模块
在 Ubuntu 21.10 到 Ubuntu 23.10 中,树莓派上的 vxlan 支持已移至单独的内核模块。此步骤对于 Ubuntu 24.04 及更高版本不是必需的。
sudo apt install linux-modules-extra-raspi
有关使用 Rancher 管理的 K3s 集群测试了哪些操作系统的更多信息,请参阅Rancher 支持和维护条款。
硬件
硬件需求会根据部署规模进行调整。最低要求是
节点 | CPU | RAM |
---|---|---|
服务器 | 2 核 | 2 GB |
代理 | 1 核 | 512 MB |
资源分析捕获测试和分析的结果,以确定 K3s 代理、带有工作负载的 K3s 服务器以及带有单个代理的 K3s 服务器的最低资源需求。
磁盘
K3s 的性能取决于数据库的性能。为了确保最佳速度,建议尽可能使用 SSD。
如果在树莓派或其他 ARM 设备上部署 K3s,建议您使用外部 SSD。etcd 是写密集型的;SD 卡和 eMMC 无法处理 IO 负载。
服务器大小指南
当服务器(控制平面 + etcd)节点上的 CPU 和 RAM 有限时,在标准工作负载条件下可以加入的代理节点数量存在限制。
服务器 CPU | 服务器 RAM | 代理数量 |
---|---|---|
2 | 4 GB | 0-350 |
4 | 8 GB | 351-900 |
8 | 16 GB | 901-1800 |
16+ | 32 GB | 1800+ |
当使用 3 个服务器节点的高可用性设置时,代理的数量可以比上表中的数量增加大约 50%。
例如:3 个服务器,每个服务器有 4 个 vCPU/8 GB,可以扩展到约 1200 个代理。
建议分批加入不超过 50 个代理节点,以允许 CPU 释放空间,因为节点加入时会出现峰值。请记住,如果需要超过 255 个节点,请修改默认的cluster-cidr
!
资源分析包含更多关于如何找到这些建议的信息。
网络
K3s 服务器需要所有节点都能访问端口 6443。
当使用 Flannel VXLAN 后端时,节点需要能够通过 UDP 端口 8472 访问其他节点,或者当使用 Flannel WireGuard 后端时,通过 UDP 端口 51820(如果使用 IPv6 则为 51821)访问其他节点。节点不应该监听任何其他端口。K3s 使用反向隧道,以便节点建立到服务器的出站连接,并且所有 kubelet 流量都通过该隧道运行。但是,如果您不使用 Flannel 并提供您自己的自定义 CNI,那么 Flannel 需要使用的端口就不需要 K3s。
如果您希望使用指标服务器,则所有节点都必须能够通过端口 10250 互相访问。
如果您计划使用嵌入式 etcd 实现高可用性,则服务器节点必须能够通过端口 2379 和 2380 互相访问。
节点上的 VXLAN 端口不应暴露给外部世界,因为它会使您的集群网络能够被任何人访问。在防火墙/安全组后面运行您的节点,以禁用对端口 8472 的访问。
Flannel 依赖于Bridge CNI 插件来创建用于切换流量的 L2 网络。具有NET_RAW
功能的恶意 Pod 可以滥用该 L2 网络发起攻击,例如ARP 欺骗。因此,如Kubernetes 文档中所述,请设置一个受限配置文件,在不可信的 Pod 上禁用NET_RAW
。
K3s 节点的入站规则
协议 | 端口 | 源 | 目标 | 描述 |
---|---|---|---|---|
TCP | 2379-2380 | 服务器 | 服务器 | 仅在使用嵌入式 etcd 的 HA 时需要 |
TCP | 6443 | 代理 | 服务器 | K3s 监督程序和 Kubernetes API 服务器 |
UDP | 8472 | 所有节点 | 所有节点 | 仅在使用 Flannel VXLAN 时需要 |
TCP | 10250 | 所有节点 | 所有节点 | Kubelet 指标 |
UDP | 51820 | 所有节点 | 所有节点 | 仅在使用 Flannel Wireguard 和 IPv4 时需要 |
UDP | 51821 | 所有节点 | 所有节点 | 仅在使用 Flannel Wireguard 和 IPv6 时需要 |
TCP | 5001 | 所有节点 | 所有节点 | 仅在使用嵌入式分布式注册表(Spegel)时需要 |
TCP | 6443 | 所有节点 | 所有节点 | 仅在使用嵌入式分布式注册表(Spegel)时需要 |
通常,允许所有出站流量。
根据使用的操作系统,可能需要对防火墙进行其他更改。
大型集群
硬件需求取决于您的 K3s 集群大小。对于生产环境和大型集群,我们建议使用具有外部数据库的高可用性设置。以下选项建议用于生产环境中的外部数据库。
- MySQL
- PostgreSQL
- etcd
CPU 和内存
以下是高可用性 K3s 服务器中节点的最低 CPU 和内存要求。
部署规模 | 节点数 | vCPU | RAM |
---|---|---|---|
小型 | 最多 10 个 | 2 | 4 GB |
中型 | 最多 100 个 | 4 | 8 GB |
大型 | 最多 250 个 | 8 | 16 GB |
超大型 | 最多 500 个 | 16 | 32 GB |
特大型 | 500+ | 32 | 64 GB |
磁盘
集群性能取决于数据库性能。为了确保最佳速度,我们建议始终使用 SSD 磁盘来支持您的 K3s 集群。在云提供商上,您还需要使用允许最大 IOPS 的最小尺寸。
网络
您应该考虑增加集群 CIDR 的子网大小,以便您不会耗尽 Pod 的 IP 地址。您可以在启动 K3s 服务器时通过传递 --cluster-cidr
选项来执行此操作。
数据库
K3s 支持不同的数据库,包括 MySQL、PostgreSQL、MariaDB 和 etcd。请参阅 集群数据存储 以获取更多信息。
以下是运行大型集群所需的数据库资源的尺寸指南。
部署规模 | 节点数 | vCPU | RAM |
---|---|---|---|
小型 | 最多 10 个 | 1 | 2 GB |
中型 | 最多 100 个 | 2 | 8 GB |
大型 | 最多 250 个 | 4 | 16 GB |
超大型 | 最多 500 个 | 8 | 32 GB |
特大型 | 500+ | 16 | 64 GB |