如果只把 MicroK8s 描述成“Kubernetes,但更小”,它很容易被低估。这个说法只在最浅层成立。更有用的读法是,MicroK8s 在 Kubernetes 周围划出一条打包与运维边界:用 snap 安装,用 microk8s add-nodemicrok8s join 加入节点,经由 add-ons 打开平台功能,并在集群节点数量足够后,让 dqlite 支撑的控制平面承担高可用。[1][2][3]

由此看,MicroK8s 作为玩具集群的趣味有限,作为架构折中则更值得讨论。它让 Kubernetes API 足够贴近真实 manifest 和 controller,同时把 bootstrap 问题的相当一部分收进 Canonical 的封装路线。Plural 的独立比较也把 MicroK8s 放在相近的实用位置:本地开发、边缘与 IoT 部署、CI 式临时集群,以及小型 workload;在这些地方,手工拼装 Kubernetes 环境的完整运维表面积会显得过重。[6]

这笔交换保留了平台工作,只是把取舍前移:接受一条带立场的包边界,让小团队把有限注意力放在集群目标、更新策略、add-on 选择、存储与恢复上。这句话不太像市场文案,却更接近 MicroK8s 在接近生产的使用中成败分化的方式。

Snap 本身就是架构的一部分

MicroK8s 的起点是发行方式选择。集群以 snap 包抵达;通常散落给 operator 手工连线的一组二进制、systemd units、证书、manifests 与 bootstrap scripts,被收进同一个包内。Snap channel 带有 stable、candidate、beta 和 edge 等风险等级,其中 stable 是已安装 snap 的默认风险等级。[4] MicroK8s 文档也在高可用设置示例中展示了固定 channel 的安装与 refresh 命令。[2]

这个打包细节会带来架构后果。选择 MicroK8s 的团队,也是在把 snap channel 纳入自己的变更管理系统。channel 回答了自建集群通常交给自动化处理的问题:安装哪条 Kubernetes 版本线,升级从哪里进入,一个节点在 refresh 前可以漂移多远。这个答案可以带来便利,同时仍需要有人负责。

这也解释了 MicroK8s 为何更适合实验室、appliance、边缘盒子和小型内部平台,大规模共享基础设施的匹配度则较低。在这些环境里,可重复安装和清晰更新通道,常常比自由替换每个控制平面组件更有价值。野外系统或实验室机器通常更需要一座能由少数人重建、升级、检查并讲清楚的集群,定制 bootstrap stack 的价值相对有限。

同一条边界也规定了失效方式。若组织无法接受 snapd,无法治理自动 refresh 行为,或要求每个控制平面二进制都经由内部打包流水线供应,MicroK8s 这个抽象就需要重新评估。Snap 同时是交付格式和运行契约。

高可用是一份小集群契约

MicroK8s 能以单节点集群运行,但它的架构在三节点时开始变得更有意思。Canonical 的 HA 文档写明,三节点及以上集群会自动启用高可用;clustering 指南也说明,从 1.19 release 开始,三节点及更大集群会复制 datastore,并能在单节点故障时保持 workload 运行。[1][2] 这是一个具体阈值,区别于含混的韧性承诺。

其机制是 dqlite。在 MicroK8s HA 模式下,所有节点都运行控制平面,至少三个节点维护 Kubernetes dqlite 数据库副本。HA 文档区分了 voter 节点、standby 节点和 spare 节点:voter 复制数据库并参与 leader election;standby 复制数据库但不投票;spare 两者都不做。[2]

这种模型适合小集群,因为团队的第一课不再落在 etcd 运维上。分布式系统行为仍在,只是被收束到更明确的位置。dqlite 使用 Raft 复制 SQLite 写事务,通过当前 leader 发送写入,在 quorum 持久化后提交,并在 leadership 变更或 commit 结果不确定时依赖 retry 行为。[5] MicroK8s 把许多细节从日常管理中收起,但 quorum 现实仍在。

实际含义是,MicroK8s HA 适合作为本地小集群韧性模式来理解,企业级平台的整套叙事需要另行论证。三节点可以防住单节点损失,却防不住粗心的共享电源、坏掉的交换机、共享存储错误、时钟漂移、薄弱备份纪律,或一次 refresh 太多集群节点的升级策略。架构给了小团队一个较好的起点,常规规则仍然有效。

Add-ons 是平台菜单,开关之后仍有平台工作

MicroK8s 的另一条边界是 add-on 系统。Canonical 将 add-ons 分为 Core repository 与 Community repository;前者由 MicroK8s 团队维护并获得官方支持,后者可以单独启用。[3] core 清单包括熟悉的平台部件:DNS、dashboard、HA、Helm、hostpath storage、ingress、metrics、MetalLB、registry 等,并为各项标出版本与兼容性信号。[3]

这个特性让 MicroK8s 很快显得有生产力。开发者可以启用 DNS、ingress、registry 或本地 storage class,省下先拼装一整个平台团队级别安装配方的时间。对教学、本地集成测试、小型 appliance 或受控边缘站点来说,这种速度是真实价值。

但 add-ons 也会让责任归属变得清楚。启用 ingress,就要决定流量如何进入集群。启用 MetalLB,就要决定本地网络上的地址如何分配。启用 registry,就要决定镜像如何构建、保留、保护和 garbage-collect。启用 observability,就要决定谁来读、哪些 alerts 有意义。MicroK8s 降低了开关成本,启用后的服务仍归团队负责。

存储给出的警示最清楚。clustering 指南说明,hostpath storage add-on 只在启用了它的节点上可用,集群化存储应选择 NFS 等替代方案。add-ons reference 说得更直截了当:hostpath-storage 从主机目录分配空间,生产环境或集群不适用。[1][3] 这种边界条件应当出现在采用评审里。团队若因为便利启用本地存储,随后把它当作集群化存储使用,责任不在 MicroK8s 误导;文档已经给出警告。

边缘上的节点角色很重要

MicroK8s 的 clustering 命令有意保持克制。现有节点运行 microk8s add-node;加入集群的机器运行生成的 microk8s join 命令。加入节点也可以使用 --worker,让它承载 workload,但不运行 Kubernetes 控制平面。[1] 这是一个小细节,在边缘部署里影响很大。

边缘站点的硬件少有对称配置。一个机柜里的组合可以是一台较强的工业 PC、几台配置普通的机器,以及几台更靠近传感器或显示设备的低端设备。worker join 让较弱机器也能参与集群,同时避开控制平面工作。随着集群增大,HA 文档中的 voter、standby 和 spare 角色又会把 datastore 形态显式摆出来。[2]

这里使用 Raspberry Pi 图像,是为了让小型单板计算机与紧凑边缘主机把取舍变得可见:有限 RAM、SD 卡或本地磁盘耐久性、热量、电源、网络布线和物理访问,都会塑造站点上的“Kubernetes”含义。[7] MicroK8s 在这个世界里有吸引力,因为它能把熟悉的 API 带到一类不足以支撑完整平台建设的硬件上;它在同一个世界里也有风险,因为这些物理限制会放大粗放默认值的代价。

合适的 pilot 应当超过“run a demo pod”。它应是一项具有站点形状的 workload,带上真实存储选择、ingress 路径、更新 channel、备份流程和节点损失测试。如果 workload 承受不了架构宣称可以处理的故障,即使 kubectl get nodes 看起来干净,集群也尚未准备好。

MicroK8s 适合的形状

当组织想要真实 Kubernetes 语义,同时希望把 Kubernetes 发行工程从首个项目中移开时,MicroK8s 很合适。它适用于需要贴近生产 manifest 的开发者机器、需要一次性集群的 CI job、课堂与实验室环境、边缘 appliance、分支办公室系统,以及能从 Kubernetes primitives 中受益但不足以支撑大型共享平台的小型内部服务。[6]

它也适合作为应用团队和平台团队之间的边界对象。应用团队可以用符合规范的 API 表面测试 manifests、controllers、ingress rules 和 Helm charts。平台团队可以用它原型验证 add-on 组合、存储预期和运维 runbook,再把同一 workload 模式迁移到托管或更大的 Kubernetes 环境中。

当集群被期待成为多团队企业底座,适配度会下降。若问题落在 policy federation、重度 multi-tenancy、受监管审计边界、复杂 CNI 或 CSI 选择、大型 fleet 一致性,或严格内部供应链流程上,MicroK8s 的优势会转成约束。Plural 的比较也作出相近区分:在受限或小型环境里,轻量化运维有帮助;当需求指向规模、组织隔离、广泛策略控制和高扩展性时,标准 Kubernetes 更占优势。[6]

好的采用规则,是先问团队正在压低哪类负担。如果答案是 bootstrap 摩擦、本地可复现性和小站点运维,MicroK8s 值得认真评估。如果答案是“我们完全不想学习 Kubernetes 运维”,它会令人失望。MicroK8s 缩小的是发行表面积,集群归属仍在团队手里。

有用的心智模型

MicroK8s 最有用的心智模型,是带有清晰边缘边界的 packaged Kubernetes。snap 决定安装与更新路径的大部分。dqlite 降低小集群 HA 的进入成本,quorum 仍然是约束。add-ons 将常见平台功能变成显式选择。worker join 和节点角色让混合硬件以受约束的方式加入。结果是一套紧凑运行单元,云服务商式的完整平台并未出现。

当集群有清晰任务时,这种紧凑性很有力量。一座 MicroK8s 集群若只运行一个 appliance workload、一个实验室平台、一个测试环境或一个分支站点服务,就可以以恰当的方式保持平淡。同一集群若被要求成为多团队通用平台,边缘会很快变锋利。

因此,当边界本身就是价值时,再采用它。有意选择 snap channel。把 add-ons 当作归属明确的服务来挑选。把 hostpath storage 视为仅限本地。用真实节点故障验证三节点 HA 叙事。写下集群如何备份与 refresh。如果这些任务适合团队,MicroK8s 就提供了一条务实路线,让 Kubernetes 进入那些完整平台显得过于沉重的地方。

来源

  1. Canonical MicroK8s,“Create a MicroK8s cluster”文档,涵盖 microk8s add-nodemicrok8s join、worker join、hostpath-storage 集群 caveat 与 HA 行为。
  2. Canonical MicroK8s,“High Availability (HA)”文档,涵盖三节点 HA 阈值、dqlite datastore 角色、voter/standby/spare 节点与故障域。
  3. Canonical MicroK8s,“Addons”reference,涵盖 core 与 community add-ons、DNS、HA、hostpath-storage、ingress、registry、MetalLB 与兼容性标签。
  4. Snapcraft 文档,“Channels”,涵盖 stable、candidate、beta 和 edge 等 snap channel 风险等级。
  5. Canonical dqlite 文档,“Replication”,解释基于 Raft 的 SQLite 事务复制、leader/gateway 行为、custom VFS、quorum commit 与 retry 行为。
  6. Plural,“MicroK8s vs. Kubernetes: Which Should You Use?”,一篇独立比较,把 MicroK8s 放在本地开发、边缘/IoT、小型 workload 以及轻量 Kubernetes 边界中讨论。
  7. Wikimedia Commons,“Raspberry Pi 4 Model B - Side”照片,作为本文图片来源。