EDGECONTROLLER模块详解

边缘控制器概述

EdgeController是Kubernetes Api服务器和Edgecore之间的桥梁

边缘控制器执行的操作

以下是Edge控制器执行的功能:

  • 下游控制器:将添加/更新/删除事件从K8s Api服务器同步到Edgecore

  • 上游控制器:将监视和更新资源和事件(节点,pod和configmap)的状态同步到K8s-Api服务器,还订阅来自edgecore的消息-控制器管理器:创建管理器接口,该接口实现用于管理ConfigmapManager,LocationCache和podManager的事件

下游控制器:

  • 将添加/更新/删除事件同步到边缘。
  • 监视K8S-Api服务器并通过cloudHub将更新发送到Edgecore
  • 通过cloudHub将(pod,configmap,secret)添加/更新/删除事件同步到边缘
  • 通过调用管理器界面创建相应的管理器(pod,configmap,secret)以处理事件
  • 找到configmap和secret应该发送到哪个节点


    image.png

上游控制器:

  • 同步监视并更新资源和事件的状态
  • UpstreamController接收来自edgecore的消息并将更新同步到K8S-Api服务器
  • 创建停止通道以调度和停止事件以处理Pod,configMap,node和secret
  • 创建消息通道以更新Nodestatus,Podstatus,Secret和configmap相关事件
  • 获取Podcondition信息,例如Ready,Initialized,Podscheduled和Unscheduled详细信息

以下是PodCondition的信息

  • Ready:PodReady表示该Pod能够处理请求,应将其添加到所有匹配服务的负载平衡池中
  • PodScheduled:表示此Pod的调度过程的状态
  • Unschedulable:这意味着现在无法调度安排pod ,可能是由于集群中的资源不足
  • Initialized:这意味着容器中的所有Init容器已成功启动
  • ContainersReady:指示容器中的所有容器是否已准备就绪

以下是PodStatus的信息

  • PodPhase:容器的当前状态
  • Conditions:详细说明pod为何处于这种状态
  • HostIP:分配了pod的主机的IP地址
  • PodIp:分配给Pod的IP地址
  • QosClass:根据资源需求分配给Pod


    image.png

控制器管理员:

创建管理器接口并实现ConfigmapManager,LocationCache和podManager

  • Manager定义管理器的接口,ConfigManager,Podmanager,secretmanager实现
  • 管理OnAdd,OnUpdate和OnDelete事件,这些事件将从K8s-Api服务器更新到相应的边缘节点
  • 创建一个eventManager(configMaps,pod,secrets),它将为每个事件启动CommonResourceEventHandler,NewListWatch和newShared Informer,以通过cloudHub将事件(pod,configmap,secret)- 同步(添加/更新/删除)到edgecore

以下是控制器管理器创建的处理程序列表

  • CommonResourceEventHandler:NewcommonResourceEventHandler创建用于Configmap和Pod Manager的CommonResourceEventHandler
  • NewListWatch:从指定的客户端资源名称空间和字段选择器创建新的ListWatch
  • NewSharedInformer:为Listwatcher创建一个新实例

1、入口函数
kubeedge\cloud\cmd\cloudcore\app\server.go

// registerModules register all the modules started in cloudcore
func registerModules(c *v1alpha1.CloudCoreConfig) {
   cloudhub.Register(c.Modules.CloudHub, c.KubeAPIConfig)
   edgecontroller.Register(c.Modules.EdgeController, c.KubeAPIConfig, "", false)
   devicecontroller.Register(c.Modules.DeviceController, c.KubeAPIConfig)
   synccontroller.Register(c.Modules.SyncController, c.KubeAPIConfig)
   cloudstream.Register(c.Modules.CloudStream)
}

2、结构定义、初始化
// EdgeController use beehive context message layer

type EdgeController struct {
   enable bool
}

func newEdgeController(enable bool) *EdgeController {
   return &EdgeController{
      enable: enable,
   }
}

3、启动方法
// Start controller

func (ec *EdgeController) Start() {
   upstream, err := controller.NewUpstreamController()
   if err != nil {
      klog.Errorf("new upstream controller failed with error: %s", err)
      os.Exit(1)
   }

   if err := upstream.Start(); err != nil {
      klog.Fatalf("start upstream failed with error: %s", err)
   }

   downstream, err := controller.NewDownstreamController()
   if err != nil {
      klog.Fatalf("new downstream controller failed with error: %s", err)
   }

   if err := downstream.Start(); err != nil {
      klog.Fatalf("start downstream failed with error: %s", err)
   }
}

4、上游控制器:接收来自edgecore的消息并将更新同步到K8S-Api服务器
// NewUpstreamController create UpstreamController from config

func NewUpstreamController() (*UpstreamController, error) {
   cli, err := utils.KubeClient()
   if err != nil {
      klog.Warningf("create kube client failed with error: %s", err)
      return nil, err
   }
   uc := &UpstreamController{
      kubeClient:   cli,
      messageLayer: messagelayer.NewContextMessageLayer(),
   }
   return uc, nil
}

// NewContextMessageLayer create a ContextMessageLayer
func NewContextMessageLayer() MessageLayer {
   return &ContextMessageLayer{
      SendModuleName:     string(config.Config.Context.SendModule),
      ReceiveModuleName:  string(config.Config.Context.ReceiveModule),
      ResponseModuleName: string(config.Config.Context.ResponseModule),
   }
}

启动UpstreamController

// Start UpstreamController

func (uc *UpstreamController) Start() error {
   klog.Info("start upstream controller")

   uc.nodeStatusChan = make(chan model.Message, config.Config.Buffer.UpdateNodeStatus)
   uc.podStatusChan = make(chan model.Message, config.Config.Buffer.UpdatePodStatus)
   uc.configMapChan = make(chan model.Message, config.Config.Buffer.QueryConfigMap)
   uc.secretChan = make(chan model.Message, config.Config.Buffer.QuerySecret)
   uc.serviceChan = make(chan model.Message, config.Config.Buffer.QueryService)
   uc.endpointsChan = make(chan model.Message, config.Config.Buffer.QueryEndpoints)
   uc.persistentVolumeChan = make(chan model.Message, config.Config.Buffer.QueryPersistentVolume)
   uc.persistentVolumeClaimChan = make(chan model.Message, config.Config.Buffer.QueryPersistentVolumeClaim)
   uc.volumeAttachmentChan = make(chan model.Message, config.Config.Buffer.QueryVolumeAttachment)
   uc.queryNodeChan = make(chan model.Message, config.Config.Buffer.QueryNode)
   uc.updateNodeChan = make(chan model.Message, config.Config.Buffer.UpdateNode)
   uc.podDeleteChan = make(chan model.Message, config.Config.Buffer.DeletePod)

   go uc.dispatchMessage()

   for i := 0; i < int(config.Config.Load.UpdateNodeStatusWorkers); i++ {
      go uc.updateNodeStatus()
   }
   for i := 0; i < int(config.Config.Load.UpdatePodStatusWorkers); i++ {
      go uc.updatePodStatus()
   }
   for i := 0; i < int(config.Config.Load.QueryConfigMapWorkers); i++ {
      go uc.queryConfigMap()
   }
   for i := 0; i < int(config.Config.Load.QuerySecretWorkers); i++ {
      go uc.querySecret()
   }
   for i := 0; i < int(config.Config.Load.QueryServiceWorkers); i++ {
      go uc.queryService()
   }
   for i := 0; i < int(config.Config.Load.QueryEndpointsWorkers); i++ {
      go uc.queryEndpoints()
   }
   for i := 0; i < int(config.Config.Load.QueryPersistentVolumeWorkers); i++ {
      go uc.queryPersistentVolume()
   }
   for i := 0; i < int(config.Config.Load.QueryPersistentVolumeClaimWorkers); i++ {
      go uc.queryPersistentVolumeClaim()
   }
   for i := 0; i < int(config.Config.Load.QueryVolumeAttachmentWorkers); i++ {
      go uc.queryVolumeAttachment()
   }
   for i := 0; i < int(config.Config.Load.QueryNodeWorkers); i++ {
      go uc.queryNode()
   }
   for i := 0; i < int(config.Config.Load.UpdateNodeWorkers); i++ {
      go uc.updateNode()
   }
   for i := 0; i < int(config.Config.Load.DeletePodWorkers); i++ {
      go uc.deletePod()
   }
   return nil
}

5、下游控制器:将添加/更新/删除事件从K8s Api服务器同步到Edgecore
// NewDownstreamController create a DownstreamController from config

func NewDownstreamController() (*DownstreamController, error) {
   lc := &manager.LocationCache{}

   cli, err := utils.KubeClient()
   if err != nil {
      klog.Warningf("create kube client failed with error: %s", err)
      return nil, err
   }

   var nodeName = ""
   if config.Config.EdgeSiteEnable {
      if config.Config.NodeName == "" {
         return nil, fmt.Errorf("kubeEdge node name is not provided in edgesite controller configuration")
      }
      nodeName = config.Config.NodeName
   }

   podManager, err := manager.NewPodManager(cli, v1.NamespaceAll, nodeName)
   if err != nil {
      klog.Warningf("create pod manager failed with error: %s", err)
      return nil, err
   }

   configMapManager, err := manager.NewConfigMapManager(cli, v1.NamespaceAll)
   if err != nil {
      klog.Warningf("create configmap manager failed with error: %s", err)
      return nil, err
   }

   secretManager, err := manager.NewSecretManager(cli, v1.NamespaceAll)
   if err != nil {
      klog.Warningf("create secret manager failed with error: %s", err)
      return nil, err
   }

   nodesManager, err := manager.NewNodesManager(cli, v1.NamespaceAll)
   if err != nil {
      klog.Warningf("Create nodes manager failed with error: %s", err)
      return nil, err
   }

   serviceManager, err := manager.NewServiceManager(cli, v1.NamespaceAll)
   if err != nil {
      klog.Warningf("Create service manager failed with error: %s", err)
      return nil, err
   }

   endpointsManager, err := manager.NewEndpointsManager(cli, v1.NamespaceAll)
   if err != nil {
      klog.Warningf("Create endpoints manager failed with error: %s", err)
      return nil, err
   }

   dc := &DownstreamController{
      kubeClient:       cli,
      podManager:       podManager,
      configmapManager: configMapManager,
      secretManager:    secretManager,
      nodeManager:      nodesManager,
      serviceManager:   serviceManager,
      endpointsManager: endpointsManager,
      messageLayer:     messagelayer.NewContextMessageLayer(),
      lc:               lc,
   }
   if err := dc.initLocating(); err != nil {
      return nil, err
   }

   return dc, nil
}
odesManager,
      serviceManager:   serviceManager,
      endpointsManager: endpointsManager,
      messageLayer:     messagelayer.NewContextMessageLayer(),
      lc:               lc,
   }
   if err := dc.initLocating(); err != nil {
      return nil, err
   }

   return dc, nil
}
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容