K3s 最容易被误读的地方,在于很多人把它压成一句“更小的 Kubernetes”,说到这里就停下了。这个说法只覆盖了体积信息,操作形态仍留在阴影里。放进实践语境看,K3s 更像一项打包决策:它把安装、控制平面起步、数据存储选择,以及几项 day-one 网络组件,一起收进同一个分发版里,然后把问题交还给操作者,追问你在集群开始承载真正可用性要求之后,准备继续保留其中多少前提。[1][2][4]
这也是 2026 年最值得抓住的一条线。很多团队通过边缘场景、home lab 或 ARM 硬件认识 K3s,随后才发现,真正的迁移工作并不落在那条 curl | sh 命令上。工作真正聚焦的位置,再往下一层:单机 embedded SQLite 是否已经够用,什么时候 embedded etcd 会成为更合适的控制平面取舍,什么时候 external datastore 更干净,以及你对 Traefik、ServiceLB、内嵌 network-policy controller 这些默认组件究竟有多大接受度。[1][2][3][4]
截至 2026-04-06T08:07:30Z UTC,GitHub API 显示 k3s-io/k3s 仓库有 32,665 stars、2,636 forks、118 个 open issues,最近一次 push 时间是 2026-04-03T03:59:55Z。[5] 发布节奏也保持着多条 Kubernetes 次版本支线并行推进:v1.35.3+k3s1、v1.34.6+k3s1 与 v1.33.10+k3s1 都发布在 2026-03-28。[6] 这种多分支节奏之所以重要,是因为 K3s 常常被放进小型集群、远程站点与边缘机房里,操作者希望它尽量贴近上游 Kubernetes,同时又不想额外背上一支很重的平台团队。
配图说明:题图使用 Wikimedia Commons 上的 Raspberry Pi 4 实物照片。这个选择很合适,因为 K3s 最有说服力的地方,始终落在那些带着明确物理边界的小型机器上。本文讨论的是小硬件上的运维边界,并非某种抽象的云控制台体验。[8]
1. K3s 首先压缩的是角色布局,不只是安装体积
K3s 的架构文档把它最核心的角色分工写得很清楚。server 节点运行 k3s server,同时承担 control plane 与 datastore 的职责;agent 节点运行 k3s agent,不承载 datastore 与 control-plane 组件。可无论是 server 还是 agent,kubelet、container runtime 与 CNI 都照常存在。[1] 这一层看似基础,实际会改变采用判断。K3s 的采用问题,并不主要落在“YAML 有没有更轻”,它真正重新组织的,是一部分集群机械结构被压进了同一个分发边界里。
也正因为如此,单 server 路线才会显得很有吸引力。K3s 把 embedded SQLite 的 single-server setup 当成一条正常集群形态来写,而没有把它写成某种尴尬过渡态。[1] 对实验室环境、远程站点、小型内部平台,或者现场设备这类场景来说,这件事很有分量。你可以用一个 control-plane 节点起步,再把 agent 加进来,同时又始终待在一套很标准的 Kubernetes 语义里。[1]
真正的问题出现在第一次成功之后。K3s 之所以显得轻,是因为它先帮你把一批决定打包好了。安装之后真正需要回答的问题,是当集群开始面对维护窗口、端口冲突、节点反复加入退出,以及存储磨损时,这些默认项还有哪些继续站得住。
2. 真正的迁移边界先落在 datastore,再落在它下面的磁盘
datastore 的选择,是 K3s 从“有趣”进入“可运营”的第一道分界。文档把三条路线写得很清楚。single-server setup 默认使用 embedded SQLite。[1] 使用 embedded etcd 的 HA 集群,需要 3 台或以上 server 节点。[1][3] 使用 external datastore 的 HA 集群,则可以由 2 台或以上 server 节点 加上一套外部数据库组成,支持的后端包括 MySQL、PostgreSQL 与 etcd。[1][2]
这三条路线之所以重要,在于每往前一步,“轻量”这个词的含义都会发生变化。单 server 的 SQLite 集群,在软件表面与运维义务上都很轻。进入 HA embedded etcd 之后,分发版仍旧紧凑,quorum、磁盘延迟,以及 server 之间配置一致性已经成了日常工作的一部分。[3] HA 文档对这一点写得很直,几类参数必须在所有 server 上保持一致,包括 --cluster-cidr 与 --service-cidr 这类网络参数,--disable-helm-controller、--disable-kube-proxy 这类控制组件部署的参数,以及 --secrets-encryption 这类功能相关参数。[3] 也就是说,K3s 依旧帮你省掉了不少东西,同时又没有替你抹掉 control plane 纪律本身。
真正更尖锐的一层,还是存储。requirements 文档直接写明,集群性能会被数据库性能牵着走,因此推荐使用 SSD。[2] embedded etcd 的 HA 文档又把 ARM 与 Raspberry Pi 场景说得更具体:在 Raspberry Pi 这类设备上,若底层还是 SD 卡,embedded etcd 会遇到明显的性能问题。[3] 一篇来自 CNCF 的独立实践文章也沿着同一条线展开:作者在 Raspberry Pi 集群里转向 external MariaDB 与外接存储,原因正是 SD 卡面对持续写入时显得吃力。[7] 这句话放进 K3s 的采用判断里很关键。K3s 对小硬件十分友好,存储物理约束依旧完整地留在现场。
这里还有一条很有价值的缓冲带。对已经跑在 embedded SQLite 上的 single-node cluster,文档说明可以通过带着 --cluster-init 重启 server,把它转换成 etcd,再继续把额外 server 加进来。[3] 这使得 K3s 对“先小后大”的路径格外宽容。宽容当然也有边界。若你一开始就知道 control-plane uptime 很重要,那么文档本身已经在把你往 HA 路线推过去。[1][2]
3. 第二道边界,落在你准备继承哪些网络默认组件
K3s 节省时间,很大一部分原因来自它内置了一组能直接工作的网络服务。文档列出的默认项包括 CoreDNS、Traefik ingress、基于 kube-router netpol library 的 network-policy controller,以及作为默认 load balancer controller 的 ServiceLB。[4] 正是这组打包组件,让 K3s 在几分钟之内就能显得完整;也正是这组组件,让迁移判断迅速变成架构判断。
ServiceLB 是最能说明问题的一项。上游 Kubernetes 允许创建 LoadBalancer Service,却不会默认替你完成它,于是这些 Service 往往会长期停在 pending。K3s 直接把这件事补上了。[4] ServiceLB 会观察 LoadBalancer Service,再创建一个 DaemonSet,让对应 pod 在各节点上占用相关 hostPort。[4] 这套机制放进裸金属、小型机房、实验室或边缘环境里,非常顺手,因为你能在不额外安装别的控制器的情况下,拿到接近云环境的服务暴露能力。
同一套机制也同时给出了它的边界。ServiceLB 依赖 host ports,因此它只会落到仍有空闲端口的节点上;如果没有任何节点能提供这个端口,对应 Service 就会继续 pending。[4] 对已经明确准备使用 MetalLB 或某种云厂商负载均衡实现的团队来说,这一点应该被当作迁移说明提前读进去。K3s 支持这条路,只是文档也说得很清楚:若要换用别的 LB,所有 server 都要带上 --disable=servicelb。[4]
内嵌 network-policy controller 也有相同的气质。它的好处,在于你不用额外拼装就能拿到基本的策略控制。它的另一面,在于你若之后决定关闭它,文档还得专门提醒你去清理 kube-router 相关 iptables 规则,因为这些规则不会自己消失。[4] 这一点其实把 K3s 的总体性格写得很明白:它极擅长给出一套连贯的起步组合,到了你开始换件的时候,它同样期待操作者亲自照看每一条接缝。
顺着这些文档往下读,我更愿意把 K3s 的采用方法理解成一条先决定 bundle 的路,而并非一条让 bundle 在默认值里慢慢浮现的路。[2][4] 若你本来就想保留 Traefik、ServiceLB 与这套内嵌策略故事,K3s 会把启动速度拉得很高。若你早就知道 ingress、load balancer 与 cloud-controller 都会换成别的实现,K3s 依旧适合,只是它的价值会从“现成的完整包”转向“一份需要尽早按计划裁剪的紧凑分发版”。
4. 节点加入机制,也是轻量集群走向真正运维的一条分界
K3s 在节点加入与身份管理上,写得比许多“轻量集群”宣传材料扎实得多。agent 节点通过 k3s agent 进程内部的 client-side load balancer 发起 websocket 连接,初始会连到 6443 端口上的 supervisor 与 kube-apiserver,随后再维护一份动态 server endpoint 列表,以便在个别 server 故障时继续存活。[1] 这已经是一套相当认真的 HA 行为,而并非某种玩具级便利。
身份处理同样具体。agent 依靠 cluster token 加上一份随机生成的 node password 加入集群,这份密码会存到本地,同时在 kube-system 里以节点名相关的 secret 形式保存哈希。[1] 若你擦掉了 /etc/rancher/node,频繁复用 hostname,或者想让同一名字的机器再次加入,文档要求你删除旧 node,让旧 password secret 一并清掉;若 hostname 复用很频繁,也可以用 --with-node-id。[1] 这些细节的价值很直接,它们让 K3s 在小型集群环境里保持更有序的运行状态,同时避免节点反复重建后逐步走向混乱。
requirements 文档又把这层控制感继续往前推进。一个 small 级别的 HA server 部署,规模写到 10 个节点以内,每台 server 需要 2 vCPUs 与 4 GB RAM;embedded etcd 场景里 server 与 server 之间需要开放 2379-2380,agent 到 server 需要 6443,特定 Flannel 后端还会牵涉 8472、51820、51821,节点之间的 kubelet metrics 与 API 则使用 10250。[2] 放到 Kubernetes 世界里看,这依旧克制;放到生产运维语境里看,它又已经足够具体,很难再把 K3s 只称作“一套小巧发行版”。
5. 最适合它的边界,与最容易错位的边界
K3s 最适合的场景,是那些需要 Kubernetes 语义,却又没有条件为一套更沉的分发版投入更大人员与基础设施的环境。边缘集群、分支站点、实验室平台、CI 控制面、ARM 与单板计算机实验、小型本地机群,这些场景都很贴它的形状。[2][7] 它最大的好处,在于从机器走到可用集群之间的距离被压短了,而集群本身仍旧带着很强的 Kubernetes 正统性。
最容易错位的地方,出现在操作者想保留“轻量安装”的快感,却又不想继承其中大部分打包前提。若你一开始就确定要 external database、另一套 ingress、另一套 load balancer、另一套 cloud-controller,以及更强分离的 control-plane 拓扑,K3s 当然仍能工作,它的价值重心却已经变了。此时它给你的,不再主要是一套现成而完整的 bundle,而是一份需要尽早围绕外部组件重新切边的紧凑底盘。[3][4]
因此,K3s 最值得追问的问题,并非一句泛泛的“要不要用 K3s”。更好的问题是:当这套集群离开演示阶段以后,哪些打包默认项仍然值得继续保留? 若答案是“大部分都值得”,K3s 会显得格外锋利;若答案是“几乎都要换掉”,轻量这件事就会迅速退到后面,真正的工作则会前移到组件替换与存储设计上。
来源
- K3s 文档,《Architecture》:server 与 agent 角色、embedded SQLite 单机场景、HA 形态、agent 侧负载均衡、node-password secret 与
--with-node-id。 - K3s 文档,《Requirements》:SSD 建议、ARM 与 Raspberry Pi 的磁盘注意事项、HA sizing table,以及 6443、2379-2380 等端口要求。
- K3s 文档,《High Availability Embedded etcd》:三台 server 的 embedded-etcd 要求、
--cluster-init、server 之间需要一致的配置项,以及从 single-node 向 etcd 转换的路径。 - K3s 文档,《Networking Services》:内嵌 Traefik、network-policy controller、ServiceLB 的 hostPort 模式、allow-list labels 与 disable flags。
- GitHub API 中
k3s-io/k3s的仓库快照:stars、forks、open issues 与最近一次 push 时间。 - GitHub API 中
k3s-io/k3s的发布列表:最近几条稳定版本 tag 与发布时间。 - Cloud Native Computing Foundation,《Running a production-ready Raspbery Pi Kubernetes cluster at home》:一篇来自项目外部的实践文章,涵盖 Raspberry Pi 硬件、cgroup 开启、静态 IP 配置与 external datastore 路线。
- 本文配图所用 Raspberry Pi 4 Model B 板卡照片的 Wikimedia Commons 文件页。