KubeEdge 边缘节点 Windows 支持:EdgeCore 移植方案与实现解析
【免费下载链接】kubeedgeKubernetes Native Edge Computing Framework (project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedge
导读
本文基于 KubeEdge 官方提案(docs/proposals/sig-node/edge-on-windows.md),系统讲解如何在 Windows Server 上运行 KubeEdge 边缘节点。文章首先剖析 EdgeCore 各模块对操作系统能力的依赖,指出"问题核心在 Edged",随后给出完整的改造思路:通过补齐 Kubelet Windows 相关配置字段、使 containerd 在 Windows 上运行、配合 CloudCore 与 Keadm 完成一整套可落地的实施任务清单。读完本文,你将掌握 KubeEdge 从 Linux 扩展至 Windows 生态的技术原理、代码改造点(WindowsService与WindowsPriorityClass)以及分阶段验证方案。
背景:为什么需要 Windows 边缘节点
KubeEdge 将 Kubernetes 的容器化编排能力延伸到边缘主机,基于 Kubernetes 构建,为云与边缘之间提供网络、应用部署和元数据同步等基础能力,已在工业边缘计算场景中被广泛采用。
尽管 KubeEdge 已支持 Linux、Android 等操作系统并拥有大量成功案例,但它目前不支持 Windows Server,这限制了它在部分潜在边缘计算场景中的能力。边缘计算涉及传感器、摄像头、工业控制设备等多种设备,其中一些可能运行 Windows 操作系统;同时许多企业的 IT 基础设施中部署了 Windows 服务器,并已运行部分应用和服务。要让边缘计算与既有基础设施融合、推动边缘计算生态发展,KubeEdge 就必须能在 Windows Server 节点上运行。
从技术可行性上看:当前 KubeEdge 的云端节点可以以 Kubernetes Pod 方式运行,而边缘侧节点需要在支持 Docker、containerd 等容器技术的系统上运行(无需运行 Kubernetes)。微软已经提供了基于**进程隔离(Process Isolation)**和Hyper-V 隔离的容器化方案,两者都能成功运行 containerd,这为 KubeEdge 在 Windows 上运行创造了条件。
目标
本项目旨在让 KubeEdge 的边缘节点运行在 Windows Server 上,从而将 KubeEdge 扩展到 Windows 生态系统,扩大其在物联网领域的用例与生态。
现状分析:EdgeCore 为什么无法在 Windows 上运行
KubeEdge 是一个在边缘计算节点上运行本地化 Kubernetes 集群的开源系统。它由 Cloud 与 Edge 两大部分组成:
- Cloud 组件运行在云服务器的 Kubernetes 环境中;
- Edge 组件运行在边缘设备上。
两者都必须在受支持的操作系统上运行。
CloudCore:云端组件
CloudCore 是运行在云端的核心组件,负责管理边缘节点与应用,并与边缘节点通信,包含以下模块:
- CloudHub:负责与 EdgeHub 建立 WebSocket 连接,并转发来自边缘节点的消息;
- EdgeController:负责将云端的资源状态(节点、Pod、ConfigMap、Secret 等)同步到边缘节点;
- DeviceController:负责管理边缘设备的生命周期,并同步设备状态与设备模型。
EdgeCore:边缘侧核心组件
EdgeCore 是运行在边缘节点上的核心组件,负责运行容器与设备、与云端通信,包含以下重要模块:
- DeviceTwin:负责存储边缘设备的状态与属性,并与 DeviceController 同步;
- Edged:负责管理边缘节点上的容器,包括创建、启动、停止、删除等操作,功能与 kubelet 类似但更轻量;
- EdgeHub:负责与 CloudHub 建立 WebSocket 连接并转发来自云端的消息;
- EventBus:负责与 MQTT 服务器通信,提供发布/订阅(pub/sub)能力;
- MetaManager:负责管理边缘节点上的元数据,包括 Pod、ConfigMap、Secret 等;
- ServiceBus:一个 HTTP 客户端,与 HTTP 服务器(REST)交互,为云组件访问边缘侧 HTTP 服务器提供 HTTP 客户端功能。
这些模块由 EdgeCore 启动时统一注册。下图展示了registerModules函数(见 edge/cmd/edgecore/app/server.go)如何按顺序注册上述核心模块:
主要难点:Edged 模块
在 Windows 上运行边缘节点的最大挑战在于运行 EdgeCore。
EdgeCore 的六个组件以 Goroutine 方式运行,但即便如此,它们仍依赖其他外部组件。例如 EventBus 依赖外部 Mosquitto 服务器——如果 Mosquitto 不支持在 Windows 上运行,则启用 EventBus 的 EdgeCore 就无法运行。
要让 EdgeCore 在 Windows 上运行,需要先分析其无法运行的原因并逐一解决。首先可以尝试编译 Windows 版本的 EdgeCore——它能启动但会因内部错误退出。逐模块分析如下:
- DeviceTwin:依赖 Sqlite,Sqlite 不应因系统差异出现问题;
- Edged:它是 kubelet 的轻量版本,需要与系统中的 CRI 和 RuntimeCgroups 交互。如果系统中没有容器运行时和相关的 Cgroups,该模块将无法运行;
- EdgeHub:与云端通信,不应有问题;
- EventBus:依赖 Mosquitto 服务,通过 MQTT 协议交互,与操作系统无关;
- MetaManager:依赖 Sqlite,不应有问题;
- ServiceBus:不依赖外部组件,只需具备发送 HTTP 请求的能力;
- Edgestream:一个 WebSocket Secure(WSS)隧道,只需连接到 Cloudstream;
- Test:一个测试 HTTP 服务器,依赖 Edged 等组件。
整体来看,问题集中在 Edged 模块。在 kubelet 中,Linux 与 Windows 的配置文件存在差异,主要体现在 CRI 地址和资源隔离工具上。
解决方案:向 Edged 补齐 Kubelet 的 Windows 配置
Edged 是 kubelet 的裁剪版本。Kubernetes 本身支持以 Windows 作为节点(甚至在 1.27 版本中增加了对 Windows Server 2019 的支持),这意味着 Kubelet 可以在 Windows 侧运行,因此 Edged 理论上也应该可以。
下图描述了目标架构:Windows Server 边缘节点上(基于进程隔离)运行 EdgeCore,通过 CloudHub/EdgeHub 通道与云端的 CloudCore(Edge Controller、Device Controller)及 K8s API Server 通信,EdgeCore 内部的 Edged 通过 CRI 与容器运行时交互,EventBus 与本地 MQTT Broker 通信:
对比 Edged 与 Kubelet 的代码后发现:Edged 没有考虑到 Kubelet 中与 Windows 支持相关的配置(实际上 Kubelet 中存在这些字段,只是在传递给 Kubelet 的过程中被忽略了)。具体来说,Edged 的 KubeletFlags 结构体中缺少WindowsService和WindowsPriorityClass两个字段。因此理论上,只要修改 Edged 代码、补充对 Windows 配置的支持,再交给k8s.io/kubernetes/cmd/kubelet/app完成其余工作,就可以运行 Edged。
下图展示了从 KubeEdge 的TailoredKubeletFlag转换到 KubernetesKubeletFlags的代码,红色高亮即为新增的WindowsService与WindowsPriorityClass字段:
需要说明的是,这只是一个理论方案。实际实现中可能涉及更多细节和依赖,实现过程中需要深入阅读 Kubelet 与 Edged 的代码,确保对其整体架构和实现有充分理解;同时必须对修改后的 Edged 代码进行测试和验证,确保在实际环境中的稳定性和正确性。
源码验证:Windows 配置字段已落地
从当前仓库源码看,这一提案中的关键字段与转换逻辑已经得到实现:
1. 配置结构体字段定义
在 staging/src/github.com/kubeedge/api/apis/componentconfig/edgecore/v1alpha2/types.go 中,TailoredKubeletFlag结构体定义了:
WindowsService bool:当 kubelet 作为 Windows 服务运行时应设为 true,该标志仅在 Windows 构建中注册;WindowsPriorityClass string:设置与 Kubelet 进程关联的优先级类,该标志仅在 Windows 构建中注册。Windows 中与任何进程关联的默认优先级类是NORMAL_PRIORITY_CLASS,为保持向后兼容而保留此默认值。
2. 按平台区分的默认值
- default_windows.go(
//go:build windows):DefaultWindowsService = true、DefaultWindowsPriorityClass = "NORMAL_PRIORITY_CLASS",数据库路径为C:\var\lib\kubeedge\edgecore.db,默认 CgroupDriver 为空; - default_others.go(
//go:build !windows):DefaultWindowsService = false、DefaultWindowsPriorityClass = "",数据库路径为/var/lib/kubeedge/edgecore.db。
这种"构建标签 + 平台默认值"的做法,正是 Windows 与 Linux 差异(CRI 地址、资源隔离工具等)在配置层面的体现。
3. 字段转换逻辑
在 edge/pkg/edged/config/config.go 的ConvertConfigEdgedFlagToConfigKubeletFlag函数中,WindowsPriorityClass与WindowsService被从 KubeEdge 配置显式映射到kubeletoptions.KubeletFlags,同时完成RuntimeCgroups、PodSandboxImage等容器运行时特定选项的转换。
4. Windows 专属构建文件
仓库中还存在多个仅针对 Windows 构建的文件,如 edge/cmd/edgecore/app/init_windows.go、edge/cmd/edgecore/app/options/options_windows.go、edge/pkg/common/util/network_windows.go,进一步印证了 Windows 支持已进入工程实现层面。
设计细节:分阶段实施任务
以下任务清单来自提案,是完整落地 Windows 边缘节点支持的分步方案:
Task 1:在 Windows Server 上运行 Containerd
- 准备硬件环境:Windows Server 2019。也可以是 Windows 10 或 Windows 11,但必须是专业版/企业版并启用 Hyper-V。由于 Kubernetes 官方文档目前推荐 Windows Server,因此将 Windows Server 2019 作为首选;
- 准备容器运行时:在 Windows 操作系统上安装容器运行时 containerd;
- 测试容器运行时:验证 containerd 运行正常,并启动任意 Hello-world 容器(如 nginx)。
Task 2:搭建 CloudCore 环境
为便于调试并获得完整环境,在另一台服务器上部署云端节点:
- 安装 Kubernetes:使用 Kubeadm 部署单节点集群;
- 安装 CloudCore:使用 Keadm 在装有 Kubernetes 的机器上部署 CloudCore,并妥善保存 token。
Task 3:在 Windows Server 上运行 EdgeCore 核心组件
- 修改 Edged 源码,使其支持与 Windows 相关的容器运行时配置,并修改相关的传输代码;
- 编译为二进制文件;
- 测试 Edged 组件的运行。
Task 4:集成测试
- 启用所有边缘节点组件,测试云到边的通信是否正常工作;
- 使用 Kubernetes 将服务调度到边缘节点,运行边缘应用以测试其可用性。
Task 5:更新 Keadm 代码以支持 Windows Server
- 修改 Keadm 的部分代码,支持在 Windows Server 上一键启动边缘节点。
Task 6:更新 GitHub Action 发布 Windows 版本(keadm、edgecore)
- 修改发布脚本,支持 Windows 平台的 release 产物。
Task 7:进一步支持
- 尝试使用 Windows Server 2022,探索 KubeEdge 在 Windows 生态中更多的可能性。
Roadmap:提案时间规划
提案给出了明确的里程碑式时间规划,可作为实施参考:
- 7.1-7.31 准备阶段:评审并提交提案;部署 KubeEdge 服务,搭建"一主一从"集群(一个 master + 一个 Linux 边缘节点)以熟悉 KubeEdge 操作;熟悉 Edged 源码;准备 Windows Server 2019 资源并搭建远程开发与调试环境;
- 8.1-8.31 开发阶段:在 Windows Server 上开发并修改 KubeEdge 代码,使 Edged 成功运行;调试云到边通信,确保 Windows 节点顺利接入集群;开发 Keadm,支持在 Windows 节点上启动 KubeEdge;
- 9.1-9.11 代码清理:整理和优化代码、补充必要注释、删除调试代码;
- 9.11-9.30 总结阶段:确保 EdgeCore 在 Windows Server 2019 上平稳运行;编写项目文档、演示材料并提交代码。
总结与展望
将 KubeEdge 边缘节点迁移到 Windows Server 的核心路径可以概括为三点:
- 问题定位:EdgeCore 各模块中,EventBus(依赖 Mosquitto)、Edged(依赖 CRI 与 Cgroups)是最可能出问题的环节,其中 Edged 是核心难点;
- 改造思路:Kubelet 本身支持 Windows,Edged 作为其裁剪版本只需补齐
WindowsService与WindowsPriorityClass等 Windows 配置字段,再交由 kubelet 相关代码完成剩余工作。该改造在当前仓库源码中已落地,从配置默认值(按平台构建标签区分)到字段转换逻辑(edge/pkg/edged/config/config.go)均有完整实现; - 实施验证:遵循"containerd on Windows → CloudCore 环境 → Edged 改造 → 集成测试 → Keadm 一键启动 → 发布脚本 → Windows Server 2022 扩展"的分阶段任务,逐步验证并沉淀为可复用的边缘节点接入能力。
随着 Windows 容器生态的成熟与 Keadm 一键部署能力的完善,KubeEdge 有望进一步覆盖企业级 Windows 基础设施,为物联网与工业边缘场景提供更广泛的落地选择。
【免费下载链接】kubeedgeKubernetes Native Edge Computing Framework (project under CNCF)项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedge
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考