一、为什么要用K3s做边缘计算?

边缘计算的核心是把数据处理能力下沉到靠近用户的设备(如工厂传感器、智能摄像头),但传统Kubernetes集群太重,不适合资源受限的边缘环境。这时K3s凭借"轻量级K8s"的特性脱颖而出:

  • 极简部署:二进制文件仅40MB,依赖项大幅减少,甚至能在树莓派上运行。
  • 资源高效:默认禁用非必要组件(如云控制器),内存占用低于512MB。
  • 离线支持:通过Airgap模式实现无网络环境部署,适合工业场景。

适用场景

  • 工业物联网(智能工厂设备监控)
  • 智慧城市(交通摄像头实时分析)
  • 零售门店(本地库存管理系统)

二、快速搭建K3s集群(基于Ubuntu 22.04)

技术栈:K3s v1.27 + Containerd + Ubuntu 22.04

2.1 控制节点安装

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

# 查看节点状态
sudo kubectl get nodes -o wide
# 输出示例:
# NAME       STATUS   ROLES                  AGE   VERSION
# master-1   Ready    control-plane,master   45s   v1.27.6+k3s1

# 保存kubeconfig供后续管理
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config

2.2 边缘节点接入

假设边缘设备IP为192.168.1.100,先在控制节点获取Token:

sudo cat /var/lib/rancher/k3s/server/node-token
# 输出示例:K103e7d8e4c5a8d9c6b7a1::server:6b7a8c5d9e4f3a1b2c3d

在边缘节点执行:

curl -sfL https://get.k3s.io | K3S_URL=https://192.168.1.50:6443 K3S_TOKEN=K103e7d8e4c5a8d9c6b7a1::server:6b7a8c5d9e4f3a1b2c3d sh -

三、边缘节点管理关键技巧

3.1 标签化管理(区分计算层与边缘层)

# 给边缘节点打标签(设备类型+地理位置)
kubectl label node edge-node-1 node-type=edge location=beijing

# 部署应用时使用节点选择器
apiVersion: apps/v1
kind: Deployment
metadata:
  name: video-analytics
spec:
  replicas: 3
  selector:
    matchLabels:
      app: video-analytics
  template:
    metadata:
      labels:
        app: video-analytics
    spec:
      containers:
      - name: analyzer
        image: myregistry/video-analyzer:v1.2
      nodeSelector:
        node-type: edge  # 只在边缘节点运行

3.2 自动污点驱逐(防止资源抢占)

# 给边缘节点添加污点(禁止非边缘服务调度)
kubectl taint nodes edge-node-1 edge=true:NoSchedule

# 边缘应用必须声明容忍度
tolerations:
- key: "edge"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"

四、部署实战:边缘视频分析服务

4.1 使用Helm部署Nginx Ingress(替代Traefik)

# 添加Helm仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# 自定义配置(禁用不必要的插件)
helm install edge-ingress ingress-nginx/ingress-nginx \
  --set controller.watchIngressWithoutClass=true \
  --set controller.ingressClassResource.enabled=false \
  --set controller.service.type=NodePort

4.2 部署AI推理服务

# video-inference.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ai-inference
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1  # 确保至少一个Pod可用
  template:
    spec:
      volumes:
      - name: model-store
        hostPath:
          path: /mnt/edge-models  # 直接挂载边缘设备存储
      containers:
      - name: infer
        image: tensorflow-serving:2.9.0
        ports:
        - containerPort: 8501
        volumeMounts:
        - mountPath: /models
          name: model-store
        resources:
          limits:
            cpu: "2"
            memory: 4Gi

五、关键问题与优化方案

5.1 网络波动处理

  • 连接保持:在K3s agent配置中增加重试参数
# /etc/systemd/system/k3s-agent.service.d/override.conf
[Service]
Restart=always
RestartSec=5s
  • 离线缓存:配置本地镜像仓库
# 在边缘节点预加载镜像
sudo k3s ctr images import my-images.tar

5.2 资源监控(Prometheus + Grafana)

# prometheus-edge.yaml
scrape_configs:
  - job_name: 'edge-nodes'
    static_configs:
    - targets: ['edge-node-1:9100', 'edge-node-2:9100']
    relabel_configs:
    - source_labels: [__address__]
      target_label: instance
    metric_relabel_configs:
    - action: keep
      regex: '(cpu_usage|memory_free)'
      source_labels: [__name__]

六、技术选型深度分析

优势 vs 局限

特性 优势 局限性
部署复杂度 单节点启动时间<30秒 大规模集群需额外配置高可用
资源占用 内存峰值<500MB(无负载) 仍不适合超低端设备(如256MB内存)
生态兼容性 兼容90%标准K8s API 部分CRD需要适配

七、总结

通过K3s实施边缘计算绝非简单的Kubernetes裁剪,而是需要针对性地设计网络策略、资源调度规则和故障恢复机制。本文展示的技术方案已在多个工业检测场景中验证,能够稳定支撑200+边缘节点的管理。随着5G和AIoT的发展,这种轻量化容器编排方案将成为边缘智能的基石技术。