K3S实战:5分钟在树莓派上搭建轻量级Kubernetes集群(含避坑指南)

边缘计算和物联网设备的普及让轻量级Kubernetes发行版成为刚需。作为Rancher实验室专为资源受限环境设计的解决方案,K3S以其不到50MB的二进制体积和极简架构,正在重塑ARM设备上的容器编排体验。本文将带你在树莓派4B(4GB内存版)上完成从零部署到应用发布的完整流程,过程中会特别针对ARM架构的常见陷阱提供解决方案。

1. 硬件准备与系统优化

树莓派作为典型的ARM架构设备,其SD卡读写性能和CPU散热能力直接影响K3S集群稳定性。建议选择Raspberry Pi OS Lite(64位)作为基础系统,安装完成后执行以下关键优化:

# 禁用交换分区(Kubernetes官方建议)
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo systemctl disable dphys-swapfile

# 启用cgroups(K3S依赖项)
echo "cgroup_memory=1 cgroup_enable=memory" | sudo tee -a /boot/cmdline.txt

# 配置SSD替代SD卡(可选但强烈推荐)
sudo blkid /dev/sda2 | awk '{print $2}' | sed 's/"//g' | sudo tee -a /etc/fstab

存储性能对比测试数据:

存储介质随机读取(IOPS)顺序写入(MB/s)适合场景
普通SD卡150-30010-15开发测试
高速SD卡500-80020-30轻度生产
USB3 SSD3000+200+生产环境

注意:树莓派4B的USB3接口实际带宽约为400MB/s,建议选择低功耗SSD以避免供电不足

2. 集群部署实战

2.1 单节点快速部署

使用官方一键安装脚本时,ARM设备需要显式指定架构参数:

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik" INSTALL_K3S_ARCH="arm64" sh -

关键参数解析:

  • --disable traefik:在资源有限时禁用默认Ingress控制器
  • --resolv-conf /run/systemd/resolve/resolv.conf:解决DNS解析问题
  • --kubelet-arg="eviction-hard=memory.available<100Mi":调整内存驱逐阈值

验证安装:

sudo kubectl get nodes -o wide
NAME       STATUS   ROLES    AGE   VERSION        INTERNAL-IP
raspberry  Ready    master   2m    v1.24.3+k3s1  192.168.1.100

2.2 多节点集群扩展

在第二台树莓派上加入集群时,需要特别注意证书SAN配置:

curl -sfL https://get.k3s.io | \
  K3S_URL=https://主节点IP:6443 \
  K3S_TOKEN=从主节点获取的token \
  INSTALL_K3S_ARCH="arm64" \
  sh -s - agent --node-ip 当前节点IP

常见问题处理:

  1. 节点NotReady状态:

    # 检查CNI插件日志
    journalctl -u k3s -f | grep flannel
    
    # 典型解决方案:重置网络配置
    sudo systemctl restart systemd-networkd
    
  2. 证书过期错误:

    # 手动更新证书
    sudo k3s certificate rotate
    

3. ARM架构专属优化技巧

3.1 容器镜像兼容性

使用docker manifest inspect命令验证镜像是否支持ARMv7/ARM64:

docker manifest inspect alpine:latest | grep architecture

推荐的基础镜像:

  • arm64v8/alpine (官方ARM64构建)
  • balenalib/rpi-raspbian (树莓派专用)
  • multiarch/qemu-user-static (跨架构模拟)

3.2 资源配额管理

示例Pod资源限制配置:

apiVersion: v1
kind: Pod
metadata:
  name: stress-test
spec:
  containers:
  - name: main
    image: arm64v8/stress-ng
    resources:
      limits:
        cpu: "2"
        memory: "512Mi"
      requests:
        cpu: "0.5"
        memory: "256Mi"
    command: ["stress-ng", "--cpu", "4", "--vm", "1", "--vm-bytes", "500M"]

4. 生产级部署方案

4.1 高可用架构设计

树莓派集群的推荐拓扑:

                       [外部负载均衡]
                            |
       ----------------------------------------
       |                  |                  |
[Master 1]           [Master 2]          [Master 3]
   ||                     ||                  ||
[Worker 1]           [Worker 2]          [Worker 3]

关键配置参数:

# Master节点启动参数
--cluster-init \
--tls-san yourdomain.com \
--datastore-endpoint="mysql://username:password@tcp(数据库地址)/k3s"

# Worker节点连接参数
--server https://负载均衡IP:6443 \
--node-external-ip 公网IP

4.2 持久化存储方案

对比三种常用方案:

方案读写性能可靠性配置复杂度
hostPath★★★★★★★
NFS★★★★★★★★
Longhorn (ARM版)★★★★★★★★★★★

Longhorn安装命令:

helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn \
  --namespace longhorn-system \
  --create-namespace \
  --set defaultSettings.defaultDataPath="/mnt/ssd"

5. 性能监控与调优

5.1 精简监控套件

推荐使用kube-prometheus-stack的ARM兼容配置:

prometheus:
  prometheusSpec:
    resources:
      limits:
        cpu: 500m
        memory: 512Mi
grafana:
  resources:
    limits:
      cpu: 300m
      memory: 256Mi

5.2 关键指标告警规则

针对树莓派的特殊规则示例:

- alert: HighTemperature
  expr: node_hwmon_temp_celsius > 70
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "节点温度过高 ({{ $value }}°C)"
    description: "持续高温可能导致CPU降频"

实际部署中发现,在树莓派集群上运行K3S时,定期执行kubectl drain配合节点重启能有效缓解内存泄漏问题。建议每周维护窗口执行:

sudo kubectl drain <节点名> --ignore-daemonsets --delete-emptydir-data
sudo reboot

更多推荐