K3s:把 Kubernetes 塞进一个 50MB 的二进制里
K3s 深度实战:轻量级 Kubernetes 的前世今生与落地指南
一句话定位:K3s 是 Rancher(现 SUSE)出品的 CNCF 认证轻量级 Kubernetes 发行版,把一个完整的 K8s 集群压缩进一个不到 70MB 的二进制文件里,专为边缘计算、IoT、CI/CD 和开发测试场景设计。
一、为什么会有 K3s
标准 Kubernetes(下文简称 K8s)功能强大,但"重"是它绕不开的标签:
-
组件分散:
kube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy,每个都要单独部署和维护。 -
资源门槛高:官方建议控制平面节点至少 2 核 2G,生产环境动辄 8G 起步。
-
安装复杂:kubeadm、二进制、各种 Addon,初学者光搭环境就能劝退一大片。
而在边缘设备、树莓派、工控机、4 核以下的小服务器上,上面这套根本跑不动。K3s 就是为了解决"我只想要一个能用的 K8s,别给我这么多负担"而生的。
名字的梗也很有意思:Kubernetes 简称 K8s(8 个字母),K3s 砍掉了一半的"重量",所以用了更小的数字 3,官方并没有把它展开成某个全称。
二、K3s 到底砍了什么、加了什么
2.1 做减法
| 砍掉/替换的东西 | 说明 |
|---|---|
| 旧版 in-tree cloud provider | 移除历史遗留的云厂商插件代码 |
| 旧版 in-tree storage driver | 移除大量内置存储驱动,需要时用 CSI |
| Docker(默认) | 默认改用内置的 containerd,更轻 |
| etcd(默认) | 单节点默认用 SQLite,省内存 |
2.2 做加法 / 做整合
-
单一二进制:server 和 agent 都打包进一个
k3s可执行文件,启动即用。 -
内置常用组件,开箱即用:
-
Traefik:默认 Ingress Controller -
ServiceLB(Klipper-LB):轻量级 LoadBalancer 实现 -
CoreDNS:集群 DNS -
local-path-provisioner:默认本地存储 -
Helm Controller:用 CRD 方式管理 Helm Chart
-
-
封装的数据库层 Kine:通过一个叫 Kine 的 shim,让 K3s 可以把 etcd API 翻译到 SQLite / MySQL / PostgreSQL,这是 K3s 能用关系型数据库替代 etcd 的关键。
2.3 架构对比图(文字版)
标准 K8s 控制平面:
┌─────────────────────────────────────────────┐
│ apiserver controller scheduler etcd ... │ ← 多进程
└─────────────────────────────────────────────┘
K3s Server (单进程):
┌─────────────────────────────────────────────┐
│ k3s server │
│ ├── apiserver / controller / scheduler │
│ ├── kine ──▶ SQLite / etcd / MySQL / PG │
│ ├── containerd │
│ └── 内置 Traefik / CoreDNS / ServiceLB │
└─────────────────────────────────────────────┘
K3s Agent (单进程):
┌─────────────────────────────────────────────┐
│ k3s agent → kubelet + kube-proxy + containerd│
└─────────────────────────────────────────────┘
三、K3s vs K8s vs K0s vs MicroK8s
| 维度 | K8s (kubeadm) | K3s | K0s | MicroK8s |
|---|---|---|---|---|
| 厂商 | CNCF 社区 | SUSE/Rancher | Mirantis | Canonical |
| 二进制 | 多组件 | 单文件 ~70MB | 单文件 | snap 包 |
| 默认存储后端 | etcd | SQLite(可切 etcd) | etcd/kine | dqlite |
| 默认运行时 | 需自配 | containerd | containerd | containerd |
| 最小内存 | 2G+ | 512MB 可跑 | 1G | 540MB |
| 典型场景 | 大规模生产 | 边缘/IoT/中小生产 | 边缘 | 本地开发 |
| CNCF 认证 | ✔ | ✔ | ✔ | ✔ |
结论:K3s 是"轻量但不残缺"的代表——它是通过 CNCF 一致性认证的,跑在上面的工作负载和标准 K8s 完全兼容,kubectl、YAML、Helm 原封不动能用。
四、动手安装
4.1 单节点:一条命令搞定
# 官方脚本(server 节点)
curl -sfL https://get.k3s.io | sh -
# 国内加速(使用镜像源)
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn sh -
# 验证
sudo k3s kubectl get nodes
sudo k3s kubectl get pods -A
安装脚本会自动:
-
下载 k3s 二进制到
/usr/local/bin/k3s -
生成 systemd 服务
k3s.service并设为开机自启 -
把 kubeconfig 写到
/etc/rancher/k3s/k3s.yaml
4.2 让 kubectl 不用 sudo / 直接用
# 复制 kubeconfig 到用户目录
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config
export KUBECONFIG=~/.kube/config
kubectl get nodes
4.3 常用安装参数(环境变量)
curl -sfL https://get.k3s.io | \
INSTALL_K3S_VERSION=v1.30.5+k3s1 \ # 指定版本
INSTALL_K3S_EXEC="server \
--disable traefik \ # 不装内置 Traefik
--disable servicelb \ # 不装内置 LB
--write-kubeconfig-mode 644 \ # kubeconfig 权限
--node-name master-01 \
--tls-san 192.168.1.100" \ # 额外的证书 SAN
sh -
五、搭建多节点集群
5.1 准备 Server(控制平面)
# 在第一台机器上,用一个自定义 token 启动 server
curl -sfL https://get.k3s.io | \
INSTALL_K3S_EXEC="server --cluster-init" \
K3S_TOKEN="my-super-secret-token" \
sh -
# 拿到 server 的 token(如果没自定义)
sudo cat /var/lib/rancher/k3s/server/node-token
--cluster-init表示启用嵌入式 etcd(HA 模式的前提),不加则默认 SQLite 单点。
5.2 加入 Agent(工作节点)
# 在每台 worker 上执行
curl -sfL https://get.k3s.io | \
K3S_URL="https://192.168.1.100:6443" \
K3S_TOKEN="my-super-secret-token" \
sh -
5.3 再加 Server 做高可用(3 节点 etcd)
# 第二、第三台 server
curl -sfL https://get.k3s.io | \
INSTALL_K3S_EXEC="server --server https://192.168.1.100:6443" \
K3S_TOKEN="my-super-secret-token" \
sh -
HA 的黄金法则:server(etcd)节点数要是奇数(3、5、7),以满足 Raft 的多数派选举。生产推荐 3 个 server + N 个 agent,前面再挂一个 L4 负载均衡指向三个 6443。
5.4 验证集群
kubectl get nodes -o wide
# NAME STATUS ROLES AGE VERSION
# master-01 Ready control-plane,etcd,master 10m v1.30.5+k3s1
# master-02 Ready control-plane,etcd,master 5m v1.30.5+k3s1
# master-03 Ready control-plane,etcd,master 4m v1.30.5+k3s1
# worker-01 Ready <none> 2m v1.30.5+k3s1
六、部署第一个应用
6.1 一个最小 Deployment + Service + Ingress
# demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 2
selector:
matchLabels: { app: nginx-demo }
template:
metadata:
labels: { app: nginx-demo }
spec:
containers:
- name: nginx
image: nginx:1.27-alpine
ports:
- containerPort: 80
resources:
requests: { cpu: 50m, memory: 32Mi }
limits: { cpu: 200m, memory: 128Mi }
---
apiVersion: v1
kind: Service
metadata:
name: nginx-demo
spec:
selector: { app: nginx-demo }
ports:
- port: 80
targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-demo
annotations:
# 使用 K3s 自带的 Traefik
spec.ingressClassName: traefik
spec:
rules:
- host: demo.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-demo
port: { number: 80 }
kubectl apply -f demo.yaml
kubectl get pod,svc,ingress
# 本地测试(把 demo.local 指向节点 IP)
echo "192.168.1.100 demo.local" | sudo tee -a /etc/hosts
curl http://demo.local
6.2 用 local-path 做持久化
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: local-path # K3s 默认 StorageClass
resources:
requests:
storage: 1Gi
七、运维要点
7.1 配置文件集中管理
K3s 支持用 /etc/rancher/k3s/config.yaml 代替一长串命令行参数:
# /etc/rancher/k3s/config.yaml
write-kubeconfig-mode: "0644"
tls-san:
- "k3s.mydomain.com"
- "192.168.1.100"
disable:
- traefik
node-label:
- "region=cn-east"
7.2 镜像仓库加速 / 私有仓库
# /etc/rancher/k3s/registries.yaml
mirrors:
docker.io:
endpoint:
- "https://registry.example.com"
configs:
"registry.example.com":
auth:
username: admin
password: "xxxx"
改完需要 systemctl restart k3s。
7.3 服务管理命令
# server 节点
sudo systemctl status k3s
sudo systemctl restart k3s
sudo journalctl -u k3s -f # 看日志
# agent 节点
sudo systemctl status k3s-agent
sudo journalctl -u k3s-agent -f
7.4 升级
# 重新跑安装脚本并指定新版本即可
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.31.x+k3s1 sh -
# 或用 System Upgrade Controller 做滚动升级(生产推荐)
7.5 备份与恢复(etcd 模式)
# 创建快照
sudo k3s etcd-snapshot save --name backup-$(date +%F)
# 列出快照
sudo k3s etcd-snapshot ls
# 从快照恢复
sudo k3s server \
--cluster-reset \
--cluster-reset-restore-path=/var/lib/rancher/k3s/server/db/snapshots/backup-xxxx
SQLite 模式只需备份
/var/lib/rancher/k3s/server/db/state.db。
7.6 卸载
# server
/usr/local/bin/k3s-uninstall.sh
# agent
/usr/local/bin/k3s-agent-uninstall.sh
八、常见坑与排查
| 现象 | 可能原因 | 处理 |
|---|---|---|
kubectl 连不上 |
KUBECONFIG 没设 / 权限不对 | export KUBECONFIG=/etc/rancher/k3s/k3s.yaml 或改 mode 644 |
| agent 加不进来 | token 错 / 6443 不通 / 时间不同步 | 核对 token,开放防火墙,ntpdate 校时 |
| Pod 一直 Pending | 节点资源不足 / 无可用 StorageClass | kubectl describe pod 看 Events |
| 镜像拉不动 | 国内网络 | 配 registries.yaml 镜像加速 |
| Traefik 不想要 | 想换 Nginx Ingress | 启动加 --disable traefik |
| 单节点内存爆 | SQLite + 太多 Pod | 控制负载或升级到 etcd + 更大内存 |
| 重启后 IP 变了 | 证书 SAN 没包含新 IP | 用 --tls-san 预置或固定 IP |
九、适用与不适用场景
适合 K3s:
-
边缘计算、IoT 网关、门店/工厂的本地集群
-
树莓派 / ARM 设备集群
-
CI/CD 流水线里的临时集群
-
开发、测试、学习 K8s
-
中小规模生产(几台到几十台节点)
可能不适合(更推荐标准 K8s / 托管服务):
-
超大规模(成百上千节点)集群
-
需要深度定制 apiserver / 特殊云厂商集成
-
团队已有成熟的 kubeadm / 云托管(EKS/GKE/ACK)运维体系
十、一张速查表收尾
# 装 server
curl -sfL https://get.k3s.io | sh -
# 装 agent
curl -sfL https://get.k3s.io | K3S_URL=https://SERVER:6443 K3S_TOKEN=xxx sh -
# 取 token
cat /var/lib/rancher/k3s/server/node-token
# kubeconfig
cat /etc/rancher/k3s/k3s.yaml
# 看节点 / Pod
k3s kubectl get nodes
k3s kubectl get pods -A
# 备份 etcd
k3s etcd-snapshot save
# 卸载
/usr/local/bin/k3s-uninstall.sh
结语
K3s 的价值不在于"功能更多",而在于用十分之一的复杂度,交付了九成的 Kubernetes 能力。对绝大多数不是在跑超大规模集群的团队和个人来说,它往往才是那个"刚刚好"的选择——下载一个二进制,一条命令,五秒钟你就拥有了一个真正的、CNCF 认证的 Kubernetes 集群。
- 点赞
- 收藏
- 关注作者
评论(0)