K3s:把 Kubernetes 塞进一个 50MB 的二进制里

举报
yd_238692410 发表于 2026/10/28 23:48:09 2026/10/28
【摘要】 K3s 深度实战:轻量级 Kubernetes 的前世今生与落地指南一句话定位:K3s 是 Rancher(现 SUSE)出品的 CNCF 认证轻量级 Kubernetes 发行版,把一个完整的 K8s 集群压缩进一个不到 70MB 的二进制文件里,专为边缘计算、IoT、CI/CD 和开发测试场景设计。一、为什么会有 K3s标准 Kubernetes(下文简称 K8s)功能强大,但"重"是它...

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

安装脚本会自动:

  1. 下载 k3s 二进制到 /usr/local/bin/k3s

  2. 生成 systemd 服务 k3s.service 并设为开机自启

  3. 把 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 集群。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。