前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >KubeEdge - edgecore edged模块源码分析

KubeEdge - edgecore edged模块源码分析

作者头像
有点技术
发布2020-07-14 14:58:31
8120
发布2020-07-14 14:58:31
举报
文章被收录于专栏:有点技术

edged

在边缘管理容器化的应用程序,edged实际上是kubelet的精简版本,复用了kubelet的主要功能,实现了和其他edgecore组件的通信同步功能,代码很多,按照流程简单过一遍

初始化

  • 设置backoff的值
  • 创建podmanager
  • 创建image gc policy
  • 创建事件记录器
  • 初始化edged
  • 创建pods目录
  • 创建livenessmanager
  • 定义noderef
  • 创建StateProvider接口实现,用于在垃圾回收期间获取镜像信息
  • 创建镜像GC策略
  • 如果remote-image-endpoint为空则设置为remote-runtime-endpoint
  • 根据配置创建一个docker shim grpc客户端
  • 设置dns地址及配置
  • 创建一个containerRefManager
  • 创建image和运行时管理程序
  • 创建容器声明周期管理器
  • 创建容器运行时管理器
  • 创建容器管理器
  • 创建image GC管理器
  • 创建容器GC管理器
  • 创建卷插件管理器

启动

  • 创建元数据管理客户端,用于和beehive交互同步消息
  • 创建Clientset 包含kube client(k8s clientset)和MetaClient
  • 创建pod状态管理器
  • 创建、运行volume管理器
  • 创建运行probemanager
  • 运行pod add worker
  • 运行pod delete worker
  • 运行pod状态管理器
  • 启动edge server,10255/pods
  • 启动imageGCmanager
  • 启动容器gc
  • 创建CSI插件管理器
  • sync pod

syncPod

  • 发送消息给metamanager获取register-node-namespace指定的命名空间下的pod列表
  • 从beehive中读取发给自己的消息
  • 获取资源的类型和id
  • 当资源类型为pod
  • 当动作为response切ID为空且来源为metamanager,将pod加入运行队列
  • 当动作为response且ID为空来源为metamanager edgecontroller,将坡道加入队列
  • 其他情况
    • insert 加入队列
    • update 更新pod到指定队列
    • delete 加入删除队列
  • configmap 对cachestore进行增删改
  • secret 对secret进行增删改
  • volume 对volume进行增删改

consumePodAddition

重点看一下consumePodAddition

代码语言:javascript
复制
func (e *edged) consumePodAddition(namespacedName *types.NamespacedName) error {    podName := namespacedName.Name    klog.Infof("start to consume added pod [%s]", podName)    pod, ok := e.podManager.GetPodByName(namespacedName.Namespace, podName)    if !ok || pod.DeletionTimestamp != nil {        return apis.ErrPodNotFound    }    if err := e.makePodDataDirs(pod); err != nil {        klog.Errorf("Unable to make pod data directories for pod %q: %v", format.Pod(pod), err)        return err    }    if err := e.volumeManager.WaitForAttachAndMount(pod); err != nil {        klog.Errorf("Unable to mount volumes for pod %q: %v; skipping pod", format.Pod(pod), err)        return err    }    secrets, err := e.getSecretsFromMetaManager(pod)    if err != nil {        return err    }    curPodStatus, err := e.podCache.Get(pod.GetUID())    if err != nil {        klog.Errorf("Pod status for %s from cache failed: %v", podName, err)        return err    }    result := e.containerRuntime.SyncPod(pod, curPodStatus, secrets, e.podAdditionBackoff)    if err := result.Error(); err != nil {        // Do not return error if the only failures were pods in backoff        for _, r := range result.SyncResults {            if r.Error != kubecontainer.ErrCrashLoopBackOff && r.Error != images.ErrImagePullBackOff {                // Do not record an event here, as we keep all event logging for sync pod failures                // local to container runtime so we get better errors                return err            }        }        return nil    }    e.workQueue.Enqueue(pod.UID, utilwait.Jitter(time.Minute, workerResyncIntervalJitterFactor))    klog.Infof("consume added pod [%s] successfully\n", podName)    return nil}

在edgecore启动的时间发送一个获取pod列表的消息给metamanager,当启动时间,从metamanager获取configmap和secret从而保证离线时间依旧能够运行

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • edged
    • 初始化
      • 启动
      • syncPod
      • consumePodAddition
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档