在树莓派上玩 K3s:从安装到实战,打造你的私人 Kubernetes 集群

Posted on Sat 24 January 2026 in Tech

Abstract 在树莓派上玩 K3s:从安装到实战
Authors Walter Fan
Category tech note
Status v1.0
Updated 2026-01-24
License CC-BY-NC-ND 4.0

你有没有过这样的经历:想学 Kubernetes,但云服务器太贵(一个月几百块起步),本地装 minikube 又吃掉大半内存,跑两个 Pod 电脑风扇就开始起飞。

然后你看着角落里吃灰的树莓派,心想:这玩意儿能跑 K8s 吗?

答案是:能,而且比你想象的简单。

K3s 就是为这个场景而生的——一个只有不到 70MB 的轻量级 Kubernetes 发行版,专门为树莓派、边缘设备、IoT 场景优化。它不是"阉割版 K8s",而是"生产级 K8s 的精简版",该有的功能都有,只是去掉了你在边缘场景用不到的东西(比如云厂商的存储驱动)。

这篇文章会带你:

  1. 在树莓派上 10 分钟装好 K3s
  2. 理解 K3s 能干什么、适合什么场景
  3. 跑几个实际的例子,让你的树莓派"活"起来

读完你会发现:原来"在家搭一个 Kubernetes 集群"这件事,门槛没那么高。


一、K3s 是什么?为什么选它?

1.1 K3s vs K8s:一张图说清楚

对比项 K8s (标准版) K3s (轻量版)
二进制大小 数百 MB < 70 MB
内存占用 1GB+ 512MB 可运行
依赖 etcd, Docker/containerd, ... 内置 SQLite/etcd, 内置 containerd
安装复杂度 一堆组件要配 一条命令搞定
生产可用 是(CNCF 认证)
适用场景 云端、大规模集群 边缘、IoT、开发测试、Home Lab

K3s 的设计哲学是:把 Kubernetes 的核心能力打包成一个二进制文件,去掉云厂商特定的插件、legacy 代码和不常用的功能,让它能在资源受限的设备上跑起来。

1.2 为什么树莓派 + K3s 是绝配?

  • 省电:4 台树莓派 5 组成的集群,idle 功耗只有 10W 左右,一个月电费几块钱
  • 便宜:一台树莓派 5(8GB)大概 600 块,比云服务器划算太多
  • 真实:这是一个真正的多节点 Kubernetes 集群,不是模拟器
  • 好玩:可以跑各种 self-hosted 服务,学习 DevOps 技能

二、准备工作

2.1 硬件要求

组件 最低配置 推荐配置
树莓派型号 Pi 4 (4GB) Pi 5 (8GB)
存储 32GB microSD 64GB+ SSD (USB 启动)
电源 官方电源适配器 5V/3A+ 稳定电源
网络 有线以太网 有线(比 WiFi 稳定)

小贴士:如果你打算跑多个 Pod 或者存储密集型应用,强烈建议用 SSD 替代 SD 卡。SD 卡的写入寿命有限,长期运行 K8s 会把它写坏。

2.2 系统准备

  1. 安装 64 位 Raspberry Pi OS Lite

Raspberry Pi Imager 下载官方烧录工具,选择: - OS: Raspberry Pi OS Lite (64-bit) - 不要选带桌面的版本,浪费资源

烧录时记得在设置里: - 开启 SSH - 设置用户名密码 - 配置 WiFi(如果需要) - 设置 hostname(比如 k3s-master

  1. 首次启动后的基础配置

```bash # SSH 连接到树莓派 ssh pi@k3s-master.local # 或者用 IP 地址 ssh pi@192.168.1.xxx

# 更新系统 sudo apt update && sudo apt upgrade -y

# 安装必要工具 sudo apt install -y curl wget vim ```

  1. 启用 cgroup(关键步骤)

K3s 需要 cgroup 来管理容器资源。编辑启动配置:

bash sudo vim /boot/firmware/cmdline.txt

在行末添加(不要换行,保持一行):

cgroup_memory=1 cgroup_enable=memory

保存后重启:

bash sudo reboot

  1. 验证 cgroup 是否生效

bash cat /proc/cgroups | grep memory # 应该看到 memory 那行的 enabled 是 1


三、安装 K3s(真的只要一条命令)

3.1 单节点安装(最简单)

curl -sfL https://get.k3s.io | sh -

就这样。等个一两分钟,K3s 就装好了。

验证安装:

# 查看节点状态
sudo kubectl get nodes

# 输出示例:
# NAME         STATUS   ROLES                  AGE   VERSION
# k3s-master   Ready    control-plane,master   1m    v1.28.5+k3s1

# 查看所有 Pod
sudo kubectl get pods -A

3.2 配置 kubectl 免 sudo

默认情况下,kubectl 需要 sudo 权限。这样配置后可以直接用:

# 复制配置文件到用户目录
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config

# 设置环境变量
echo 'export KUBECONFIG=~/.kube/config' >> ~/.bashrc
source ~/.bashrc

# 现在可以不用 sudo 了
kubectl get nodes

3.3 从本地电脑访问集群

你肯定不想每次都 SSH 到树莓派上操作。把 kubeconfig 复制到你的电脑:

# 在树莓派上
sudo cat /etc/rancher/k3s/k3s.yaml

把输出的内容复制到你电脑的 ~/.kube/config,然后把 server: https://127.0.0.1:6443 改成树莓派的实际 IP:

server: https://192.168.1.xxx:6443

现在你可以在自己电脑上操作树莓派上的 K3s 集群了。

3.4 多节点集群(可选)

如果你有多台树莓派,可以组成一个真正的集群:

在 Master 节点获取 Token:

sudo cat /var/lib/rancher/k3s/server/node-token

在 Worker 节点安装并加入集群:

curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.xxx:6443 K3S_TOKEN=<上面获取的token> sh -

验证:

kubectl get nodes
# 应该看到多个节点

四、K3s 能干什么?典型用例

装好了 K3s,然后呢?这里列几个我实际在用的场景:

4.1 Home Lab:自托管各种服务

把那些"我不想付订阅费"的服务自己跑起来:

服务 用途 推荐镜像
Nextcloud 私有云盘(替代 Dropbox/Google Drive) nextcloud:latest
Bitwarden 密码管理器 vaultwarden/server
Home Assistant 智能家居中枢 homeassistant/home-assistant
Pi-hole 全屋广告过滤 DNS pihole/pihole
Jellyfin 私人影音服务器 jellyfin/jellyfin
Gitea 私有 Git 服务 gitea/gitea

示例:部署一个 Pi-hole

# pihole.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: pihole
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pihole
  namespace: pihole
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pihole
  template:
    metadata:
      labels:
        app: pihole
    spec:
      containers:
      - name: pihole
        image: pihole/pihole:latest
        env:
        - name: TZ
          value: "Asia/Shanghai"
        - name: WEBPASSWORD
          value: "your-secure-password"
        ports:
        - containerPort: 80
          name: http
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        - containerPort: 53
          name: dns-udp
          protocol: UDP
        volumeMounts:
        - name: pihole-config
          mountPath: /etc/pihole
      volumes:
      - name: pihole-config
        hostPath:
          path: /opt/pihole
          type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
  name: pihole
  namespace: pihole
spec:
  type: LoadBalancer
  selector:
    app: pihole
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: dns-tcp
    port: 53
    targetPort: 53
    protocol: TCP
  - name: dns-udp
    port: 53
    targetPort: 53
    protocol: UDP
kubectl apply -f pihole.yaml

# 查看状态
kubectl get pods -n pihole
kubectl get svc -n pihole

4.2 学习 Kubernetes:真实环境练手

比起 minikube 这类模拟器,K3s 提供的是一个真正的 K8s 环境,你可以练习:

  • Deployment、Service、Ingress:核心概念
  • ConfigMap、Secret:配置管理
  • PersistentVolume:存储
  • Helm Chart:包管理
  • GitOps (ArgoCD/Flux):持续部署

练手示例:部署一个 Nginx + 自动扩缩容

# nginx-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:alpine
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 50m
            memory: 64Mi
          limits:
            cpu: 100m
            memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-demo
spec:
  type: NodePort
  selector:
    app: nginx-demo
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-demo-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-demo
  minReplicas: 2
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
kubectl apply -f nginx-demo.yaml

# 访问
curl http://<树莓派IP>:30080

# 查看 HPA 状态
kubectl get hpa

4.3 边缘计算 / IoT 网关

这是 K3s 的"正经"用途——在边缘设备上运行容器化工作负载:

  • 数据采集:从传感器收集数据,本地预处理后上报
  • AI 推理:在边缘跑轻量级 ML 模型(比如图像识别)
  • 协议转换:MQTT / Modbus / OPC-UA 等工业协议转换

示例场景:树莓派 + 温湿度传感器 + K3s

传感器 → 树莓派 GPIO → Pod (数据采集) → Pod (MQTT Broker) → 云端

4.4 CI/CD Runner

把树莓派变成你的私有 CI/CD 执行器:

  • GitLab Runner:跑 GitLab CI 任务
  • GitHub Actions Self-hosted Runner:跑 GitHub Actions
  • Jenkins Agent:跑 Jenkins 任务

好处:不用付云厂商的计算费用,适合个人项目或小团队。


五、最佳实践和注意事项

5.1 存储:别用 SD 卡当主力

方案 优点 缺点 推荐场景
SD 卡 便宜、方便 写入寿命短、速度慢 临时测试
USB SSD 速度快、寿命长 贵一点 长期运行
NFS/NAS 集中存储、易备份 依赖网络 多节点共享数据

配置 SSD 启动(树莓派 5):

# 用 raspi-config 配置启动顺序
sudo raspi-config
# Advanced Options → Boot Order → USB Boot

5.2 网络:用 Traefik 暴露服务

K3s 默认自带 Traefik 作为 Ingress Controller。配置一个域名访问你的服务:

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: myapp.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app
            port:
              number: 80

配合本地 DNS(或者修改 /etc/hosts),就可以用域名访问了。

5.3 监控:轻量级方案

不要在树莓派上跑完整的 Prometheus + Grafana 栈,太重了。推荐:

  • k9s:终端里的 K8s 管理界面,超轻量

```bash # 安装 k9s curl -sS https://webinstall.dev/k9s | bash

# 使用 k9s ```

  • Lens:桌面版 K8s 管理工具,在你电脑上运行,连接树莓派集群

5.4 备份:定期备份 etcd/SQLite

# K3s 默认用 SQLite,数据在这里
/var/lib/rancher/k3s/server/db/

# 简单备份
sudo cp -r /var/lib/rancher/k3s/server/db/ ~/k3s-backup-$(date +%Y%m%d)

5.5 安全:别把集群暴露到公网

  • 用 WireGuard/Tailscale 做内网穿透,而不是直接暴露端口
  • 定期更新 K3s:curl -sfL https://get.k3s.io | sh -
  • 不要用 --disable-agent 等不安全选项

六、常见问题 FAQ

Q1: K3s 和 MicroK8s 怎么选?

K3s MicroK8s
维护方 Rancher (SUSE) Canonical (Ubuntu)
安装方式 curl 脚本 snap
ARM 支持 原生支持 支持但偶有问题
资源占用 更轻量 稍重
生态 Rancher 生态 Ubuntu 生态

我的建议:树莓派选 K3s,Ubuntu 服务器选 MicroK8s。

Q2: 树莓派 4GB 够用吗?

  • 跑 K3s 本身:够
  • 跑 2-3 个轻量服务:够
  • 跑 5+ 个服务或者有状态应用:建议 8GB

Q3: 为什么我的 Pod 一直 Pending?

# 看看原因
kubectl describe pod <pod-name>

# 常见原因:
# 1. 资源不足:检查 requests/limits 配置
# 2. 存储问题:PVC 没有对应的 PV
# 3. 镜像拉取失败:检查网络或镜像名

Q4: 怎么卸载 K3s?

# 卸载 Server 节点
/usr/local/bin/k3s-uninstall.sh

# 卸载 Agent 节点
/usr/local/bin/k3s-agent-uninstall.sh

七、总结

回顾一下核心要点:

主题 关键信息
K3s 是什么 轻量级 K8s 发行版,< 70MB,专为边缘/IoT 设计
安装 curl -sfL https://get.k3s.io \| sh -,一条命令搞定
典型用例 Home Lab 自托管、K8s 学习、边缘计算、CI/CD Runner
最佳实践 用 SSD、配置 Ingress、轻量监控、定期备份

下一步可以做什么

  1. 装好 K3s,跑一个 Hello World
  2. 部署一个你真正会用的服务(比如 Pi-hole 或 Nextcloud)
  3. 如果有多台树莓派,组个多节点集群
  4. 试试 Helm 和 ArgoCD,体验 GitOps

最后,如果你还在犹豫要不要折腾——那就别犹豫了。一台吃灰的树莓派 + 一个小时的时间,你就能拥有一个真正的 Kubernetes 集群。比起在云上花钱,这个投入产出比太香了。


参考资料


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。