「连载」边缘计算(十八)02-21:边缘部分源码(源码分析篇)

(接上篇)

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| k8s.io/Kubernetes/pkg/Kubelet/dockershim/docker_service.go |
| // NewdockerService creates a new `dockerService` struct. // NOTE: Anything passed to dockerService should be eventually handled in another way when we switch to running the shim as a different process. func NewdockerService(config *ClientConfig, podSandboxImage string, streamingConfig *streaming.Config, pluginSettings *NetworkPluginSettings, cgroupsName string, kubeCgroupDriver string, dockershimRootDir string, startLocalStreamingServer bool) (dockerService, error) { ... ds := &dockerService{ client: c, os: kubecontainer.RealOS{}, podSandboxImage: podSandboxImage, streamingRuntime: &streamingRuntime{ client: client, execHandler: &NativeExecHandler{}, }, containerManager: cm.NewContainerManager(cgroupsName, client), checkpointManager: checkpointManager, startLocalStreamingServer: startLocalStreamingServer, networkReady: make(mapstringbool), containerCleanupInfos: make(mapstring*containerCleanupInfo), } ... } |

从 NewdockerService()函数可以看出,dockershim的真身是dockerService struct。dockerService struct定义具体如下所示。

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| k8s.io/Kubernetes/pkg/Kubelet/dockershim/docker_service.go |
| type dockerService struct { client libdocker.Interface os kubecontainer.OSInterface podSandboxImage string streamingRuntime *streamingRuntime streamingServer streaming.Server network *network.PluginManager // Map of podSandboxID :: network-is-ready networkReady mapstringbool networkReadyLock sync.Mutex containerManager cm.ContainerManager // cgroup driver used by docker runtime. cgroupDriver string checkpointManager checkpointmanager.CheckpointManager // caches the version of the runtime. // To be compatible with multiple docker versions, we need to perform // version checking for some operations. Use this cache to avoid querying // the docker daemon every time we need to do such checks. versionCache *cache.ObjectCache // startLocalStreamingServer indicates whether dockershim should start a // streaming server on localhost. startLocalStreamingServer bool // containerCleanupInfos maps container IDs to the `containerCleanupInfo` structs // needed to clean up after containers have been started or removed. // (see `applyPlatformSpecificdockerConfig` and `performPlatformSpecificContainerCleanup` // methods for more info). containerCleanupInfos mapstring*containerCleanupInfo } |

从dockerService的定义可以看出,大部分属性都是与container、pod、image相关的。我们从这些属性可以推测dockerService是与container runtime交互的一个组件。为了进一步验证猜想,可以在同一个文件中(k8s.io/Kubernetes/pkg/Kubelet/dockershim/docker_service.go)查看dockerService实现的方法。

以上只是剖析了edged的初始化过程。下面剖析edged的启动过程,具体如下所示。

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| KubeEdge/edge/pkg/edged/edged.go |
| func (e *edged) Start(c *context.Context) { e.context = c e.metaClient = client.New(c) // use self defined client to replace fake kube client e.kubeClient = fakekube.NewSimpleClientset(e.metaClient) e.statusManager = status.NewManager(e.kubeClient, e.podManager, utilpod.NewpodDeleteSafety(), e.metaClient) if err := e.initializeModules(); err != nil { klog.Errorf("initialize module error: %v", err) os.Exit(1) } e.volumeManager = volumemanager.NewVolumeManager( ... ) go e.volumeManager.Run(edgedutil.NewSourcesReady(), utilwait.NeverStop) go utilwait.Until(e.syncNodeStatus, e.nodeStatusUpdateFrequency, utilwait.NeverStop) e.probeManager = prober.NewManager(e.statusManager, e.livenessManager, containers.NewContainerRunner(), kubecontainer.NewRefManager(), record.NewEventRecorder()) e.pleg = edgepleg.NewGenericLifecycleRemote(e.containerRuntime, e.probeManager, plegChannelCapacity, plegRelistPeriod, e.podManager, e.statusManager, e.podCache, clock.RealClock{}, e.interfaceName) e.statusManager.Start() e.pleg.Start() e.podAddWorkerRun(concurrentConsumers) e.podRemoveWorkerRun(concurrentConsumers) housekeepingTicker := time.NewTicker(housekeepingPeriod) syncWorkQueueCh := time.NewTicker(syncWorkQueuePeriod) e.probeManager.Start() go e.syncLoopIteration(e.pleg.Watch(), housekeepingTicker.C, syncWorkQueueCh.C) go e.server.ListenAndServe() e.imageGCManager.Start() e.StartGarbageCollection() e.pluginManager = pluginmanager.NewPluginManager( ... ) // Adding Registration Callback function for CSI Driver e.pluginManager.AddHandler(pluginwatcherapi.CSIPlugin, plugincache.PluginHandler(csiplugin.PluginHandler)) // Start the plugin manager go e.pluginManager.Run(edgedutil.NewSourcesReady(), utilwait.NeverStop) e.syncpod() } |

未完待续......

相关推荐
Elastic 中国社区官方博客2 小时前
搜索倍增器:推动收入、生产力和 AI 实现规模化
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
wjkjpcba2 小时前
机器人控制板PCBA怎么加工?从SMT贴片到BGA焊接解析机器人电子制造工艺
大数据·人工智能
青 春 记 忆3 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
小猪妈咪爱学法3 小时前
欧盟最新发布《AI数字综合法案(Digital Omnibus‑on‑AI,AI综合修订法案)
人工智能·网络安全
ZGIAI3 小时前
ZGI Workflow 变量池:接住节点输出
人工智能·架构
梵构广告3 小时前
提升品牌识别度有哪些方法?
人工智能
ZGIAI3 小时前
ZGI 记忆隔离:多人共用不串号
人工智能·架构
星栈独行4 小时前
决定 Agent 交付下限的「操作系统」:Harness 六层架构拆解
人工智能·架构
AKAMAI4 小时前
实时可观测性:Akamai Cloud Pulse 警报功能正式发布
人工智能·云计算
Capricorn19884 小时前
解决全网抄 Karpathy 导致的 LLM Wiki 污染?基于知芽 Notebook Skill 的 raw/ 笔记法排障指南
大数据·论文阅读·人工智能·笔记·论文笔记