边缘集群部署 - 原理与适用场景
一、适用场景
通过边缘集群的形式,在中心节点部署平台,并将边缘节点加入调度。每个私有网用户通过项目组,把 notebook、pipeline、推理服务(service)部署在边缘节点。好处:
- 避免数据到中心节点的带宽传输;
- 避免中心节点的算力成本,充分利用边缘节点算力;
- 避免边缘节点的运维成本(统一由中心纳管)。

支持设备
- 边缘设备支持英伟达 ARM 盒子;
- 独立子网的服务器或 PC,例如商城或门店的机房。
二、网络访问方向(核心原则,决定了所有限制)
- 边缘网络的用户可以访问边缘网络和中心网络;中心网络的用户无法访问边缘网络。所以部署在边缘网络中的 k8s 服务都无法被中心网络访问。
- 在中心网络和边缘网络中间也无法通过 k8s 服务名进行代理;但在中心网络或边缘网络内部可以通过 k8s 服务名进行代理。
- 中心网络部署 CubeStudio 平台的控制器部分,边缘网络部署用户容器(notebook / pipeline 任务 / 服务容器)。使用时主要涉及两个操作:
- 将 minio 的 host 改为中心网络的 IP(而不是服务名),因为边缘网络的任务无法通过服务名访问中心网络的 minio,但通过 IP 可以;
- 为每个边缘网络配置专门的项目组,并在项目组中配置服务代理 IP(边缘网络的某台机器 IP),这样边缘网络的 notebook / service 就会自动使用代理 IP 进行访问。
由此带来的 by-design 限制(不是 bug)
- Cloud → Edge pod 方向走不通:边缘在 NAT 后面,云端 flannel 无法主动建 VXLAN 隧道到边缘,公网经 istio ingressgateway → ClusterIP → edge pod 会返回 502。
- Edge 内网用户可用:CubeStudio 为边缘 service 建
<svc>-external(externalIPs=[边缘内网 IP],端口为 NodePort)。同子网用户直接curl http://<边缘内网IP>:<nodeport>/即可,web UI 显示的访问地址就是这个。 - 云端 pod → Edge pod:边缘 flannel 主动建的 VXLAN 是单向的,云端节点能 curl 到 edge pod IP,但云端 service 的 iptables 规则不会自动同步到边缘,除非修了 kube-proxy(见 05)。
要把边缘服务暴露到公网,需自己在边缘上加反向代理(nginx / frp)。
三、搭建边缘 K8s 集群的几种方式
把边缘节点接入云端 K8s,前提是先有一套支持边缘的 K8s 集群。除了本目录主线推荐的 kubeadm 云端 K8s + keadm 接入边缘(见 03 ~ 05),还有以下几种历史/备选方式。
方式 1:直接在云厂商选择边缘 K8s 集群
各云厂商控制台一般都有"边缘容器服务"产品,开箱即用。

方式 2:使用 SuperEdge(edgeadm)
每台机器先初始化环境,下载 edgeadm:
arch=amd64 version=v0.7.0 kubernetesVersion=1.22.6 && \
rm -rf edgeadm-linux-* && \
wget https://superedge-1253687700.cos.ap-guangzhou.myqcloud.com/$version/$arch/edgeadm-linux-$arch-$version-k8s-$kubernetesVersion.tgz && \
tar -xzvf edgeadm-linux-* && \
cd edgeadm-linux-$arch-$version-k8s-$kubernetesVersion && ./edgeadm
云上主节点执行 init(替换尖括号里的 IP):
./edgeadm init --kubernetes-version=1.22.6 \
--image-repository superedge.tencentcloudcr.com/superedge \
--service-cidr=10.42.0.0/16 --pod-network-cidr=10.43.0.0/16 \
--install-pkg-path ./kube-linux-*.tar.gz \
--apiserver-cert-extra-sans=<Master节点外网IP> \
--apiserver-advertise-address=<Master节点内网IP> \
--enable-edge=true
init 后会弹出边缘节点 join 命令,在边缘节点执行类似:
./edgeadm join 175.178.172.40:6443 --token 9hepes.rppzsjbo7hu2odkx \
--discovery-token-ca-cert-hash sha256:170ced41d33851f64c7d4f7660dc0747931f733a5d67c3b0d832b4f202ef9e85 \
--install-pkg-path ./kube-linux-*.tar.gz
清理(记得删除):
rm -rf /etc/docker/daemon.json
方式 3:使用 KubeSphere + KubeEdge
云上用 KubeSphere 部署 K8s 集群
参考 KubeSphere 部署 CubeStudio,先在云上用 KubeSphere 部署 K8s,然后在"自定义资源"中搜索 clusterconfiguration,修改 ks-installer 的 yaml:
- 把
edgeruntime和kubeedge下的enabled从false改为true,并配置advertiseAddress为公网 IP; - 把
metrics_server改为true,openpitrix下store改为true。
之后会出现 kubeedge 命名空间,在 web 界面"节点管理"下会出现边缘节点入口,按要求填写验证后会生成节点加入命令。该命令中:
./keadm join -r docker:-r指定边缘节点运行时,这里用 docker 运行时;--cloudcore-ipport=<公网IP>:30000:后面是公网地址 +kubeedge命名空间 cloudcore 服务的 NodePort 端口;--quicport 30001 --certport 30002 --tunnelport 30004:也全部换成 NodePort 端口。
开启 cloudcore dynamicController
开启后才能直接访问边缘节点的服务,不需要可以不开。修改 kubeedge 命名空间下 cloudcore 这个 configmap:
modules:
...
dynamicController:
enable: true
然后重启 cloudcore。
添加边缘节点(配置 EdgeMesh)
边缘节点自行安装 docker,并配置 EdgeMesh:
vi /etc/nsswitch.conf
# hosts: 行改为:
hosts: dns files mdns4_minimal [NOTFOUND=return]
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p | grep ip_forward
执行 web 界面复制的边缘节点添加命令,类似:
arch=$(uname -m); if [[ $arch != x86_64 ]]; then arch='arm64'; fi; \
curl -LO https://kubeedge.pek3b.qingstor.com/bin/v1.13.0/$arch/keadm-v1.13.0-linux-$arch.tar.gz && \
tar xvf keadm-v1.13.0-linux-$arch.tar.gz && chmod +x keadm && \
./keadm join --kubeedge-version=1.13.0 --cloudcore-ipport=<公网IP>:30000 \
--quicport 30001 --certport 30002 --tunnelport 30004 \
--edgenode-name test100 --edgenode-ip 192.168.3.100 --token <token>
开启边缘节点上 pod 的 metric / log / exec 等操作:
vi /etc/kubeedge/config/edgecore.yaml
# 把 edgeStream 段的 enable 改为 true
# 如果需要访问边缘节点上的服务,配置 clusterDNS:
# edged:
# clusterDNS: 169.254.96.16
# clusterDomain: cluster.local
systemctl restart edgecore.service
边缘端开启 EdgeStream,云端部署 CloudCore 后会自动开启。可能需要重启机器,之后即可在云端查看边缘节点上 pod 的日志和资源使用。
卸载边缘节点
# 在边缘节点上执行
./keadm reset # 按提示输入 y
# 或强制卸载
./keadm reset --force
apt remove mosquitto
# 删除相关文件
rm -rf /etc/systemd/system/edgecore.service /usr/lib/systemd/system/edgecore.service
rm -rf /etc/kubeedge /var/lib/kubeedge /var/lib/edged
# 在云端删除节点
kubectl delete node <边缘节点名>
# 停止服务
systemctl stop edgecore.service
systemctl daemon-reload
上述方式 2/3 为历史记录,命令中的版本(k8s 1.22.6 / KubeEdge v1.13.0 等)较旧。本目录主线(03 起)用的是更新的 K8s v1.28 + KubeEdge v1.23.0 + containerd 运行时。