边缘集群部署 - 一键脚本

云端 K8s 已就绪、kubeadm init 时已加公网 SAN,想用编号脚本几条命令把边缘节点接入时读这篇

02-部署安装 / 部署方式 / 边缘集群
KubeEdge一键脚本keadmcloudcore00-check-prereq10-cloud-cloudcore20-cloud-rbac30-edge-join40-edge-fix-label45-fix-kube-proxy50-verifygettoken卸载uninstall

边缘集群部署 - 一键脚本

install/kubernetes/kubeedge/ 下提供了一套编号脚本,用 KubeEdge 把本地/专线/独立机房的边缘节点接入云端 K8s,CubeStudio 统一调度训练(云)与推理(边)。完整原理见本目录其它子文档(03 ~ 06)。

来源:install/kubernetes/kubeedge/README.md。脚本以仓库实际文件为准。


脚本目录

文件 在哪执行 用途
00-check-prereq.sh 云端 检查 K8s / containerd / 端口
10-cloud-cloudcore.sh <advertise-ip> 云端 一键装 keadm + CloudCore + 开 dynamicController
20-cloud-rbac.yaml 云端 CloudCore 需要的 ClusterRole(聚合到默认 cloudcore 角色)
30-edge-join.sh <token> <ip:port> <node-name> 边缘 keadm join + 配 edgecore + 装 CNI 插件
40-edge-fix-label.sh <edge-node-name> 云端 ⭐ 修复 edge 节点 label 为空值
45-fix-kube-proxy.sh <advertise-ip> 云端 ⭐ 修复 kube-proxy server 为公网 IP
50-verify.sh <edge-node-name> 云端 跑一个 busybox 测试 pod,验证落到边缘并 Running

20-cloud-rbac.yaml 实际定义的 ClusterRole 名为 cloudcore-extra,带 rbac/aggregate-to-cloudcore: "true" 标签,补齐 v1.23 以下 keadm 默认不全的 CRD 权限(devices.kubeedge.io / apps.kubeedge.io / policy.kubeedge.io 等)。见 install/kubernetes/kubeedge/20-cloud-rbac.yaml


快速流程

前提:K8s 集群已就绪,且 kubeadm init 时加了 --apiserver-cert-extra-sans=<公网 IP>(四大坑之 4)。

云端(一次性)

cd install/kubernetes/kubeedge

# 1. 前置检查
bash 00-check-prereq.sh

# 2. 装 CloudCore(传 advertise IP,必须是公网/边缘能到达的 IP)
bash 10-cloud-cloudcore.sh 47.114.127.214

# 3. RBAC 补齐(keadm 装的默认 cluster role 少权限)
kubectl apply -f 20-cloud-rbac.yaml

# 4. 让 kube-proxy 走公网 IP(否则边缘节点永远同步不到 service 规则)
bash 45-fix-kube-proxy.sh 47.114.127.214

# 5. 取 token,下面边缘要用
keadm gettoken

边缘(每台)

# 把脚本 + token 传到边缘(SSH/scp)
scp 30-edge-join.sh user@edge:/tmp/
ssh user@edge "sudo bash /tmp/30-edge-join.sh <上面拿到的 token> 47.114.127.214:10000 edge-pc-01"

30-edge-join.sh 会自动:装 keadm / stop docker / 调 containerd SystemdCgroup / keadm join / 打开 edgeStream+metaServer / 装 CNI plugins。

云端:修 label 并验证

bash 40-edge-fix-label.sh edge-pc-01
bash 50-verify.sh edge-pc-01

看到 POD edge-verify RUNNING ON edge-pc-01 ✓ 即全通。


CubeStudio 项目组配置

  • Web UI → 项目管理 → 新建"边缘项目组";
  • SERVICE_EXTERNAL_IP 填边缘代理 IP(或云端公网 IP 做验证);
  • 挂到边缘项目组的 notebook / pipeline task / inference service 会自动打 serving=true 等 label,被 scheduler 调度到 edge 节点。

关键代码位置(节点选择器默认值与组装逻辑):

  • myapp/models/model_serving.py:51,232:推理默认 cpu=true;serving=true
  • myapp/models/model_job.py:385,742:训练/任务默认 cpu=true;train=true
  • myapp/models/base.py:316get_default_node_selector(按 GPU / org 组装最终 selector)

⚠️ 说明:install/kubernetes/kubeedge/README.md 原文写的是 model_job.py:188,545,但当前代码里 node_selector 默认值实际在 model_job.py:385:742(值仍为 cpu=true;train=true),此处已按代码改正。


⚠️ 访问边缘推理服务(by design)

CubeStudio 给边缘 service 配的 externalIPs边缘节点内网 IP(如 192.168.3.22)+ NodePort(如 20038)。这是 KubeEdge + NAT 边缘的必然限制:

  • Cloud → Edge pod 方向:云端 flannel 没法建 VXLAN 到 NAT 后的边缘,公网经 istio ingress → ClusterIP → edge pod 走不通(502);
  • Edge 内网用户:同子网下直接 curl http://<edge-ip>:<nodeport>/xxx 可用;
  • 云端 pod → Edge pod:边缘 flannel 主动建的 VXLAN 单向,云端能 curl 到 edge pod IP,但 service iptables 规则不会在边缘生效,除非跑了 45-fix-kube-proxy.sh

所以 web UI 里看到的"访问地址"默认就是 http://<边缘内网 IP>:<nodeport>,供边缘网内用户使用。


卸载

云端:

helm uninstall cloudcore -n kubeedge 2>/dev/null || true
kubectl delete ns kubeedge --grace-period=0 --force
kubectl get crd | grep kubeedge | awk '{print $1}' | xargs -r kubectl delete crd
rm -rf /etc/kubeedge /var/lib/kubeedge

边缘:

sudo keadm reset --force
sudo rm -rf /etc/kubeedge /var/lib/kubeedge /var/lib/edged \
            /etc/systemd/system/edgecore.service \
            /usr/lib/systemd/system/edgecore.service
sudo systemctl daemon-reload

如果 kubectl delete ns kubeedge 卡在 Terminating,见 07-踩坑速查 的"namespace 卡 Terminating"。

最后更新 2026-07-04完整文档以官方仓库为准:GitHub Wiki