八.资源调度与边缘节点管理的核心代码

KubeEdge 的资源调度与边缘节点管理主要由 edgecontroller(云端)和 edged(边端)模块共同实现。edgecontroller 扩展了 Kubernetes 的控制平面,负责调度、下发和管理边缘节点的资源。边缘节点的资源调度通过 CRD(自定义资源定义)进行扩展,使得 Kubernetes 能够支持边缘计算的特定需求。以下是 KubeEdge 中资源调度与边缘节点管理核心代码的详细分析。

1. 云端 edgecontroller 模块

edgecontroller 是 KubeEdge 云端控制器,负责将 Kubernetes 的资源和工作负载调度到边缘节点。该模块的核心代码位于 cloud/pkg/edgecontroller 目录下。

资源下发与同步

edgecontroller 的主要任务是将 Kubernetes 的资源(如 Pod、ConfigMap、Secrets 等)分发到边缘节点,以便边缘节点可以执行工作负载。资源同步的核心逻辑在 downstream.go 文件中。

  • 资源同步控制器DownstreamControlleredgecontroller 的子模块,负责监听 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 中边缘节点相关资源的增删改事件,将事件处理程序绑定到 handleAddNodehandleUpdateNodehandleDeleteNode 函数。

  • 资源下发:当有新的资源创建或资源发生变化时,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 的设计保证了 edgecontrollercloudhub 之间的通信可以解耦,使资源调度和状态同步更加灵活。

2. 边端 edged 模块

edged 是边端的核心模块,负责资源的本地管理和执行。edged 的核心代码位于 edge/pkg/edged 目录下,它的功能类似于 Kubernetes 中的 kubelet,但增加了边缘环境下的特性,如离线模式和本地缓存。

本地资源管理

edged 模块中,Pod 和其他资源的管理是通过 syncPodsyncConfigMap 等函数实现的。这些函数确保接收到的资源在边缘节点上被正确创建和管理。

  • 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 的资源调度与边缘节点管理通过 edgecontrolleredged 模块实现,edgecontroller 扩展了 Kubernetes 的控制平面,实现了边缘节点的资源下发和同步,edged 实现了边缘节点的资源管理、状态采集与上报。在网络断开时,metamanager 缓存资源数据并支持离线模式,确保边缘节点的自治运行。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注