边缘集群部署 - 原理与适用场景

想先搞清楚边缘集群形态适合什么场景、网络访问有什么固有限制、以及除 keadm 外还有哪些方式建边缘 k8s 集群时读这篇

02-部署安装 / 部署方式 / 边缘集群
KubeEdge边缘计算适用场景网络方向单向访问NATEdgeMeshsuperedgekubesphere边缘k8sedgeadm中心网络边缘网络代理IPSERVICE_EXTERNAL_IP

边缘集群部署 - 原理与适用场景

一、适用场景

通过边缘集群的形式,在中心节点部署平台,并将边缘节点加入调度。每个私有网用户通过项目组,把 notebook、pipeline、推理服务(service)部署在边缘节点。好处:

  1. 避免数据到中心节点的带宽传输;
  2. 避免中心节点的算力成本,充分利用边缘节点算力;
  3. 避免边缘节点的运维成本(统一由中心纳管)。

边缘集群示意

支持设备

  1. 边缘设备支持英伟达 ARM 盒子;
  2. 独立子网的服务器或 PC,例如商城或门店的机房。

二、网络访问方向(核心原则,决定了所有限制)

  1. 边缘网络的用户可以访问边缘网络和中心网络;中心网络的用户无法访问边缘网络。所以部署在边缘网络中的 k8s 服务都无法被中心网络访问。
  2. 在中心网络和边缘网络中间也无法通过 k8s 服务名进行代理;但在中心网络或边缘网络内部可以通过 k8s 服务名进行代理。
  3. 中心网络部署 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>-externalexternalIPs=[边缘内网 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:

  • edgeruntimekubeedge 下的 enabledfalse 改为 true,并配置 advertiseAddress 为公网 IP;
  • metrics_server 改为 trueopenpitrixstore 改为 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 运行时。

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