KubeEdge 的资源调度与边缘节点管理主要由 edgecontroller
(云端)和 edged
(边端)模块共同实现。edgecontroller
扩展了 Kubernetes 的控制平面,负责调度、下发和管理边缘节点的资源。边缘节点的资源调度通过 CRD(自定义资源定义)进行扩展,使得 Kubernetes 能够支持边缘计算的特定需求。以下是 KubeEdge 中资源调度与边缘节点管理核心代码的详细分析。
1. 云端 edgecontroller
模块
edgecontroller
是 KubeEdge 云端控制器,负责将 Kubernetes 的资源和工作负载调度到边缘节点。该模块的核心代码位于 cloud/pkg/edgecontroller
目录下。
资源下发与同步
edgecontroller
的主要任务是将 Kubernetes 的资源(如 Pod、ConfigMap、Secrets 等)分发到边缘节点,以便边缘节点可以执行工作负载。资源同步的核心逻辑在 downstream.go
文件中。
- 资源同步控制器:
DownstreamController
是edgecontroller
的子模块,负责监听 Kubernetes 的资源变化并将其分发到边缘节点。func (dc *DownstreamController) syncEdgeNodes() { // 监听 Kubernetes API,监控边缘节点资源(如 Pod、ConfigMap)的变化 dc.nodeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: dc.handleAddNode, UpdateFunc: dc.handleUpdateNode, DeleteFunc: dc.handleDeleteNode, }) }
这个代码片段通过
Informer
监听 Kubernetes 中边缘节点相关资源的增删改事件,将事件处理程序绑定到handleAddNode
、handleUpdateNode
和handleDeleteNode
函数。 -
资源下发:当有新的资源创建或资源发生变化时,
DownstreamController
会通过HandleAddPod
函数将 Pod 信息发送到对应的边缘节点。func (dc *DownstreamController) HandleAddPod(obj interface{}) { pod := obj.(*v1.Pod) message := model.NewMessage("") message.BuildRouter(constants.EdgeControllerModuleName, GroupResource, pod.Namespace+"/"+pod.Name, model.InsertOperation) message.Content = pod dc.messageLayer.Send(*message) }
HandleAddPod
函数创建一个Message
,包含目标资源的信息(如 Pod),并将其通过消息层发送到边缘节点。
消息层(Message Layer)
edgecontroller
通过消息层将资源和状态信息发送到边缘节点。消息层的核心代码位于 cloud/pkg/edgecontroller/common
中,定义了 messageLayer
接口。
- 消息发送:
Send
函数负责将消息发送到cloudhub
,最终到达edgehub
模块,实现云边数据同步。func (ml *MessageLayer) Send(message model.Message) error { // 将消息传递到 cloudhub,进而发送到 edgehub ml.cloudHubClient.Send(message) }
messageLayer
的设计保证了edgecontroller
与cloudhub
之间的通信可以解耦,使资源调度和状态同步更加灵活。
2. 边端 edged
模块
edged
是边端的核心模块,负责资源的本地管理和执行。edged
的核心代码位于 edge/pkg/edged
目录下,它的功能类似于 Kubernetes 中的 kubelet
,但增加了边缘环境下的特性,如离线模式和本地缓存。
本地资源管理
在 edged
模块中,Pod 和其他资源的管理是通过 syncPod
和 syncConfigMap
等函数实现的。这些函数确保接收到的资源在边缘节点上被正确创建和管理。
- Pod 同步:在
syncPod
函数中,edged
会检查资源的状态并执行相应的操作,例如启动或停止容器。func (e *edged) syncPod(pod *v1.Pod) error { // 检查 Pod 的状态,并在边缘节点上执行相应的操作 if pod.Status.Phase == v1.PodRunning { e.containerRuntime.StartPod(pod) } else if pod.Status.Phase == v1.PodSucceeded || pod.Status.Phase == v1.PodFailed { e.containerRuntime.StopPod(pod) } return nil }
这个函数根据 Pod 的状态启动或停止相应的容器。通过
containerRuntime
接口,edged
可以支持多种容器运行时。
本地缓存与离线模式
在网络不稳定或断开时,edged
可以依赖本地缓存的数据继续管理资源,从而实现边缘自治。metamanager
模块在 edge/pkg/metamanager
中实现了资源的缓存和同步逻辑。
- 资源缓存:
metamanager
使用本地数据库(如 SQLite)缓存从云端下发的资源数据,以便在断网时继续使用。func InsertOrUpdate(meta *Meta) error { db := getDB() _, err := db.Exec("INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)", meta.Key, meta.Value) return err }
资源信息(如 Pod)被持久化到本地数据库,这样即使在断网时,边端也可以从本地数据库读取资源配置,确保任务的连续性。
3. 边缘节点状态监控与上报
边缘节点需要定期向云端报告其状态信息,如 CPU、内存、网络等资源的使用情况。edged
模块通过 getNodeStatus
函数实现了节点状态的采集和上报。
- 节点状态采集:
getNodeStatus
函数在edged.go
中实现,负责采集边缘节点的资源使用情况。func (e *edged) getNodeStatus() *v1.NodeStatus { // 获取节点的资源使用情况,例如 CPU、内存、网络 return &v1.NodeStatus{ Capacity: e.getCapacity(), Allocatable: e.getAllocatable(), Conditions: e.getNodeConditions(), } }
getNodeStatus
返回节点的资源使用情况,如可用 CPU、内存、存储等。这些状态信息会被上报到云端,以便 Kubernetes 的调度器更好地了解边缘节点的情况。 -
状态上报:在
upstream.go
中实现了将节点状态发送到云端的逻辑。节点的状态被封装到消息中,发送到云端的cloudhub
。func (uc *UpstreamController) sendNodeStatus(status v1.NodeStatus) { message := model.NewMessage("") message.BuildRouter(constants.EdgeControllerModuleName, GroupResource, "node/status", model.UpdateOperation) message.Content = status uc.messageLayer.Send(*message) }
该函数封装节点状态并发送到云端,通过
messageLayer
将状态传递给cloudhub
,实现节点状态的更新。
4. 自定义资源定义(CRD)支持
KubeEdge 支持使用 CRD 来扩展边缘节点的资源管理。通过自定义资源,用户可以为边缘节点定义特定的资源类型,满足不同应用场景的需求。
- CRD 定义与同步:
edgecontroller
监控 Kubernetes 中的自定义资源,并将其同步到边缘节点。对于每个自定义资源,edgecontroller
通过消息层将资源分发到对应的边缘节点。边缘节点使用metamanager
将 CRD 缓存到本地,实现自定义资源的管理。
5. 边缘资源调度策略
KubeEdge 的资源调度策略可以通过扩展 Kubernetes 调度器来实现。在默认情况下,KubeEdge 使用 Kubernetes 的调度策略,将工作负载调度到已注册的边缘节点。
- 调度器扩展:用户可以通过修改 Kubernetes 调度器的配置文件,或添加自定义调度器来实现基于边缘场景的调度策略。例如,可以基于节点的地理位置、带宽、延迟等特性来选择合适的边缘节点。
总结
KubeEdge 的资源调度与边缘节点管理通过 edgecontroller
和 edged
模块实现,edgecontroller
扩展了 Kubernetes 的控制平面,实现了边缘节点的资源下发和同步,edged
实现了边缘节点的资源管理、状态采集与上报。在网络断开时,metamanager
缓存资源数据并支持离线模式,确保边缘节点的自治运行。