「连载」边缘计算(十八)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(map[string]bool),

containerCleanupInfos:     make(map[string]*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     map[string]bool

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 map[string]*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()

}

 「未完待续…… 

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值