保姆级教程:用K3s在边缘设备(如RK3568)和虚拟机搭建你的第一个边云协同集群

张开发
2026/4/19 1:51:28 15 分钟阅读

分享文章

保姆级教程:用K3s在边缘设备(如RK3568)和虚拟机搭建你的第一个边云协同集群
从零开始构建K3s边云协同集群RK3568开发板与虚拟机的实战指南当物联网设备数量呈现指数级增长时传统云计算架构的局限性逐渐显现——数据往返云端造成的延迟、带宽压力与隐私风险成为棘手难题。这正是边缘计算与云原生技术结合的绝佳场景而K3s作为轻量级Kubernetes发行版恰好能在RK3568这类资源受限的边缘设备上流畅运行。本教程将带您完成一次从芯片级设备到虚拟机的完整边云协同实践。1. 环境准备跨越硬件差异的统一基础在RK3568开发板边缘侧和Ubuntu虚拟机云端的混合环境中首先需要解决三个核心问题操作系统一致性、网络可达性和资源分配合理性。虽然硬件架构不同ARM vs x86但通过容器抽象层可以实现应用的无差别部署。1.1 操作系统配置要点对于RK3568开发板推荐使用官方优化的Debian或Ubuntu镜像。关键配置步骤包括# 在RK3568上执行 sudo apt update sudo apt upgrade -y sudo timedatectl set-timezone Asia/Shanghai sudo apt install -y vim curl net-tools虚拟机端建议使用Ubuntu Server LTS版本特别注意关闭Swap以免影响Kubernetes调度# 在虚拟机上执行 sudo swapoff -a sudo sed -i / swap / s/^/#/ /etc/fstab1.2 网络拓扑规划典型的边云协同网络需要满足以下要求网络要素边缘侧(RK3568)云端(虚拟机)IP地址范围192.168.5.100-200192.168.5.10-50端口开放6443/TCP入站6443/TCP出站连通性测试ping云端的网关telnet边缘的6443端口提示在家庭网络环境中建议将开发板和虚拟机置于同一局域网段。若使用云服务器需配置安全组放行6443端口并通过DDNS或内网穿透工具建立连接。2. K3s控制平面云端虚拟机的精简化部署K3s的Server节点控制平面适合部署在资源相对充足的虚拟机环境。与传统K8s相比K3s通过以下优化实现轻量化使用SQLite替代etcd作为默认存储将多个核心组件合并为单个进程默认包含Containerd运行时2.1 单节点控制平面安装# 在虚拟机执行快速安装 curl -sfL https://get.k3s.io | sh -s - \ --write-kubeconfig-mode 644 \ --tls-san ${YOUR_PUBLIC_IP}关键参数解析--write-kubeconfig-mode 644放宽kubeconfig文件权限--tls-san为证书添加额外域名/IP解决边云网络差异问题安装完成后验证核心组件状态sudo kubectl get pods -A -o wide sudo kubectl get node -o wide2.2 高可用方案选型对于生产环境K3s提供多种高可用配置方式嵌入式HA使用内置的etcd集群3节点起步curl -sfL https://get.k3s.io | sh -s - server --cluster-init外部数据库对接MySQL/PostgreSQL等curl -sfL https://get.k3s.io | sh -s - server \ --datastore-endpointmysql://username:passwordtcp(hostname:3306)/database-nameAgent自动加入适合动态边缘节点# 从Server节点获取token cat /var/lib/rancher/k3s/server/node-token3. 边缘节点RK3568的特殊适配策略ARM架构的开发板需要特别注意容器镜像兼容性和资源限制。K3s通过以下机制完美适配边缘场景自动检测并拉取匹配架构的镜像arm64可配置资源预留参数支持离线安装包部署3.1 边缘节点注册流程在RK3568上执行节点加入命令前需确保已建立到Master节点的网络路由获取有效的Join Token配置适当的节点标签实际注册命令示例curl -sfL https://get.k3s.io | K3S_URLhttps://${MASTER_IP}:6443 \ K3S_TOKEN${NODE_TOKEN} \ INSTALL_K3S_EXEC--node-name edge-node-1 \ --node-label devicerk3568 \ --kubelet-argsystem-reservedcpu200m,memory256Mi sh -3.2 边缘特有配置项通过kubectl为边缘节点添加专属污点和容忍# edge-toleration.yaml apiVersion: v1 kind: Node metadata: name: edge-node-1 spec: taints: - key: edge value: true effect: NoSchedule应用配置并验证kubectl apply -f edge-toleration.yaml kubectl describe node edge-node-1 | grep -A5 Taints4. 边云协同应用部署实战4.1 混合调度策略示例下面的部署清单展示了如何将计算密集型组件调度到云端而数据采集服务部署到边缘# hybrid-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: video-analytics spec: replicas: 3 selector: matchLabels: app: video-analytics template: metadata: labels: app: video-analytics spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: [arm64] containers: - name: capture image: arm64v8/opencv:4.5 resources: limits: cpu: 1 memory: 1Gi - name: process image: amd64/tensorflow:2.7 nodeSelector: kubernetes.io/arch: amd644.2 状态监控与日志收集边缘环境下的监控方案需要特殊考虑精简版Prometheus配置# prometheus-edge.yaml global: scrape_interval: 60s evaluation_interval: 120s scrape_configs: - job_name: edge-nodes metrics_path: /metrics static_configs: - targets: [edge-node-1:9100]日志收集优化方案使用Fluent Bit替代Fluentd配置边缘侧日志缓存设置日志滚动策略# RK3568上的Fluent Bit配置示例 [INPUT] Name tail Path /var/log/containers/*.log Parser docker Mem_Buf_Limit 5MB [OUTPUT] Name forward Host cloud-logging-server Port 24224 Retry_Limit False5. 故障排除与性能调优5.1 常见边缘场景问题网络闪断处理# 在边缘节点创建自动恢复服务 [Unit] DescriptionK3s Connection Watchdog Afternetwork.target [Service] ExecStart/usr/local/bin/k3s-agent-watchdog.sh Restartalways [Install] WantedBymulti-user.target资源不足告警# 查看边缘节点资源使用 kubectl top pod -n kube-system --use-protocol-buffers kubectl describe node edge-node-1 | grep -A10 Allocatable5.2 关键性能指标监控建立边缘健康度评分卡指标类别计算公式健康阈值CPU负载1m avg / core count 0.7内存压力(used-cache)/total 0.8网络延迟ping Master平均RTT 100ms存储可用空间df -h /var/lib 可用百分比 20%在RK3568上实际部署时发现通过适当调低kubelet的同步频率可以显著降低CPU占用# /etc/systemd/system/k3s-agent.service.d/override.conf [Service] ExecStartPre/bin/sleep 30 ExecStart/usr/local/bin/k3s agent \ --kubelet-argsync-frequency30s \ --kubelet-argnode-status-update-frequency1m0s

更多文章