oss

K3s 轻在哪里,又从哪里开始变重

8 条来源 5 条一手来源 已翻译 2026年4月6号

正文
一块 Raspberry Pi 4 Model B 单板计算机从上方拍摄,置于白色背景上。

这张 Raspberry Pi 4 的真实硬件照片适合本文,因为 K3s 最显身手的地方,始终是那些必须把 Kubernetes 放进小型机器里的现场:边缘节点、实验室设备、单板计算机,连存储介质与端口占用都带着很强的现实感。[8]

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+k3s1v1.34.6+k3s1v1.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,再安装和迁移,而不是等默认值慢慢浮现。[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 vCPUs4 GB RAM;embedded etcd 部署里 server 与 server 之间需要开放 2379-2380,agent 到 server 需要 6443,特定 Flannel 后端还会牵涉 84725182051821,节点之间的 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 当然仍能工作,它的价值重心却已经变了。此时它给你的,主要是一份需要尽早围绕外部组件重新裁剪的紧凑底盘。[3][4]

因此,K3s 最值得追问的问题,不是一句泛泛的“要不要用 K3s”。更好的问题是:当这套集群离开演示阶段以后,哪些打包默认项仍然值得继续保留? 若答案是“大部分都值得”,K3s 的锋利之处会很快显出来;若答案是“几乎都要换掉”,轻量这件事就会迅速退到后面,真正的工作则会前移到组件替换与存储设计上。

来源

  1. K3s 文档,《Architecture》:server 与 agent 角色、embedded SQLite 单机场景、HA 形态、agent 侧负载均衡、node-password secret 与 --with-node-id
  2. K3s 文档,《Requirements》:SSD 建议、ARM 与 Raspberry Pi 的磁盘注意事项、HA sizing table,以及 6443、2379-2380 等端口要求。
  3. K3s 文档,《High Availability Embedded etcd》:三台 server 的 embedded-etcd 要求、--cluster-init、server 之间需要一致的配置项,以及从 single-node 向 etcd 转换的路径。
  4. K3s 文档,《Networking Services》:内嵌 Traefik、network-policy controller、ServiceLB 的 hostPort 模式、allow-list labels 与 disable flags。
  5. GitHub API 中 k3s-io/k3s 的仓库快照:stars、forks、open issues 与最近一次 push 时间。
  6. GitHub API 中 k3s-io/k3s 的发布列表:最近几条稳定版本 tag 与发布时间。
  7. Cloud Native Computing Foundation,《Running a production-ready Raspbery Pi Kubernetes cluster at home》:一篇来自项目外部的实践文章,涵盖 Raspberry Pi 硬件、cgroup 开启、静态 IP 配置与 external datastore 路线。
  8. 本文配图所用 Raspberry Pi 4 Model B 板卡照片的 Wikimedia Commons 文件页。
Previous Kanidm 在 2026:一篇写给想把 passkey、OIDC 与 Linux 登录收进同一身份平面的团队的项目介绍 Next Ceph 在 2026 的真正本事,是把故障写成算术:一篇关于 CRUSH、placement groups 与 BlueStore 恢复预算的架构笔记

Recommended In oss

Matched by subject and format