边缘集群部署 - 一键脚本
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=truemyapp/models/model_job.py:385,742:训练/任务默认cpu=true;train=truemyapp/models/base.py:316:get_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"。