起因
K8s 全套 (kubeadm) 在小机器(2-4 vCPU / 4 GB)跑得费力:
- etcd + apiserver + controller-manager + scheduler 几 GB RAM
- 启动 5 分钟
- 升级痛苦
但有时只想:
- 边缘设备(树莓派 / IoT gateway)跑 K8s 编排
- 笔记本本地 dev
- 单租户产品打包"K8s on appliance"
- 小公司 1-2 server prod
k3s(Rancher,2019+):单 binary(~50 MB),裁剪 K8s 到 ~512 MB RAM。
microk8s(Canonical):类似目标,更 batteries-included。
k3s 装
# 一键装(server)
curl -sfL https://get.k3s.io | sh -
# kubectl 立刻可用
sudo k3s kubectl get nodes
# 或者复制 kubeconfig 用普通 kubectl
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER ~/.kube/config
完事。1 分钟起一个 K8s。
加 worker node
# server 拿 token
sudo cat /var/lib/rancher/k3s/server/node-token
# worker 上
curl -sfL https://get.k3s.io | K3S_URL=https://server:6443 K3S_TOKEN=xxx sh -
k3s 是什么 K8s
- 完整 K8s API(不是 mini K8s)
- 替代 etcd 用 SQLite(也支持 etcd / MySQL / PG external)
- 替代 docker 用 containerd
- 内置 traefik ingress(可关)
- 内置 helm controller / local storage provisioner / metrics-server
- 删了 in-tree cloud provider / 实验性 feature
90% workload 跟 vanilla K8s 一样跑。
资源占用
| k3s | kubeadm K8s | docker swarm | |
|---|---|---|---|
| RAM | 512 MB | 2 GB+ | 50 MB |
| 启动 | 30s | 5 min | 5s |
| Binary | 50 MB | 几百 MB | 50 MB |
树莓派 4 (4 GB RAM) 跑 k3s 余 3+ GB 给应用 → 完全实用。
HA k3s
# server 1
curl -sfL https://get.k3s.io | sh -s - server --cluster-init
# server 2 / 3
curl -sfL https://get.k3s.io | sh -s - server --server https://server1:6443 --token xxx
3 个 server 自动 embedded etcd HA。
worker 同前面加。
microk8s
Ubuntu 系强推:
sudo snap install microk8s --classic
sudo usermod -aG microk8s $USER
microk8s status
microk8s kubectl get nodes
# 启用 addon
microk8s enable dns ingress storage cert-manager
addon 系统比 k3s 友好:
dns / ingress / cert-manager / metallb / observability /
istio / linkerd / hostpath-storage / openebs / cilium / dashboard
一行启用,省手动 helm。
k3s vs microk8s
| k3s | microk8s | |
|---|---|---|
| 母公司 | Rancher / SUSE | Canonical |
| 分发 | shell script | snap |
| 多 distro | 是 | snap 限制(Ubuntu / 部分) |
| HA | embedded etcd | 自动 (3+ nodes) |
| addon | 内置少,手动 helm | addon 丰富 |
| 升级 | 手动 | snap 自动 |
| 默认 ingress | traefik | nginx |
| 体量 | 50 MB | 200 MB+ |
我倾向 k3s(更轻 + 跨 distro),但 ubuntu 系统 microk8s 顺手。
适合场景
- edge / IoT:低资源 + 远程管理
- CI / 测试:临时拉一个 k3s 测 manifest
- 个人 / 小 团队 prod:1-3 server 足够
- embedded product:appliance 内置 K8s
不适合:
- 千节点集群(k3s SQLite 不行;要 PostgreSQL 后端)
- 重 K8s feature(webhooks 多 / CRD 多) 仍 OK 但优势减
- 合规要求企业级 K8s 发行版
k3d (k3s in docker)
brew install k3d
k3d cluster create mycluster --servers 3 --agents 2
kubectl get nodes
3 master + 2 worker 在 5 个 docker container 起来 → laptop 测多
节点行为。
比 kind 轻量。
真实部署 case
某 IoT 客户:
- 100 个边缘 gateway(4 vCPU / 8 GB)
- 每 gateway 跑 k3s + 几个微服务 + 本地 DB
- 中心 cluster 用 Rancher 管 100 个 k3s 集群
- 应用更新通过 Fleet / ArgoCD 推
效果:
- 单 gateway 装 K8s 5 分钟(自动化 script)
- 中心可视化所有 edge 状态
- 应用迭代独立各 gateway
vs 老方案(docker compose + ansible):管理统一 + K8s API 标准化 +
故障恢复更智能。
本地 dev: k3s vs kind vs minikube
# kind (K8s in docker)
kind create cluster
# k3d (k3s in docker)
k3d cluster create
# minikube (VM)
minikube start
| 启动 | 资源 | 多节点 | |
|---|---|---|---|
| kind | 30s | 中 | ✅ |
| k3d | 15s | 低 | ✅ |
| minikube | 1 min | 高(VM) | 慢 |
我本地 dev 用 k3d。
升级 k3s
# 同样 curl 命令 + INSTALL_K3S_VERSION
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.30.0+k3s1 sh -
或者用 Rancher / system-upgrade-controller 自动滚动升级 多 node。
monitoring
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
-n monitoring --create-namespace
跟 vanilla K8s 一样 helm install。
metrics-server 已内置 (k3s)。
与 Talos Linux 对比
Talos Linux:Linux distro for K8s。OS 本身是 K8s。
极简 + 安全 + immutable。
| k3s | Talos | |
|---|---|---|
| Host OS | 任意 | Talos only |
| 管理 | systemd | API only(无 ssh) |
| 升级 | 手动 / 工具 | 强 immutable |
| 学习 | 易 | 中 |
Talos 是新潮选择,适合"K8s as appliance"。
踩过的坑
-
SQLite 单 server 限制:k3s 默认 SQLite 不支持多 server HA。
3+ server 要 embedded etcd(默认--cluster-init)。 -
storage 默认 hostpath:pod restart 跨 node 数据丢。生产用
longhorn / NFS / cloud volume。 -
traefik 内置版本旧:k3s 自带 traefik 跟最新版本可能差几个版本。
--disable traefik+ 自装最新。 -
resource 限制:CPU 紧张时 etcd / apiserver 慢 → pod schedule
失败。监控 system pod CPU。 -
firewall blocking 6443:worker 加入失败常见原因。
ufw allow 6443/ 防火墙规则。
登录后参与评论。