前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【K8s】kubelet 源码分析 01-03

【K8s】kubelet 源码分析 01-03

原创
作者头像
Librant
修改2022-07-02 14:38:57
3390
修改2022-07-02 14:38:57
举报
文章被收录于专栏:跟我一起学 K8s跟我一起学 K8s

【注】源码分析均以 k8s 的第一个 commit 代码分析;

在启动监听之后,主要是处理资源清单的变更;

1、RunSyncLoop():处理 channel 的主循环;

代码语言:go
复制
func (sl *Kubelet) RunSyncLoop(etcdChannel <-chan []api.ContainerManifest, fileChannel, serverChannel, httpChannel <-chan api.ContainerManifest, handler SyncHandler)  {}
  • etcdChannel
  • fileChannel
  • serverChannel
  • httpChannel

这个函数启动循环,监控各个通道中的内容,每次只同步一个通道中的内容;

这里着重分析 SyncManifests() 方法实现:

代码语言:go
复制
func (sl *Kubelet) SyncManifests(config []api.ContainerManifest) error {}

将从通道中读取的资源清单,交付到对应的节点上;

// Sync the configured list of containers (desired state) with the host current state

同步配置容器列表,比较期望状态和主机上的容器状态;

-- 如果对应的节点上存在,则不进行处理

-- 如果对应的节点上不存在,则需要在对应的节点上启动容器;


1)判断对应节点上的是否存在容器

代码语言:go
复制
func (sl *Kubelet) ContainerExists(manifest *api.ContainerManifest, container *api.Container) (exists bool, foundName string, err error)  {}

2)启动对应节点上的容器

代码语言:go
复制
func (sl *Kubelet) RunContainer(manifest *api.ContainerManifest, container *api.Container) (name string, err error) {}

-- 拉取镜像

代码语言:go
复制
sl.pullImage(container.Image)

这个函数中,是直接执行 docker pull 命令;

代码语言:go
复制
cmd := exec.Command("docker", "pull", image)

代码语言:go
复制
name = manifestAndContainerToDockerName(manifest, container)

将资源名和容器名转换成 docker 名;

代码语言:go
复制
fmt.Sprintf("%s--%s--%x", escapeDash(container.Name), escapeDash(manifest.Id), rand.Uint32())

这里需要对名字进行规则转换:

代码语言:go
复制
// Converts "-" to "_-_" and "_" to "___" so that we can use "--" to meaningfully separate parts of a docker name.
func escapeDash(in string) (out string) {
	out = strings.Replace(in, "_", "___", -1)
	out = strings.Replace(out, "-", "_-_", -1)
	return
}

1)先将下划线,转换成三个下划线;

2)再将中划线转换成两个下划线和一个中划线;

转换参数后:

-- 端口

-- 挂载点

1)创建 Docker

代码语言:go
复制
dockerContainer, err := sl.DockerClient.CreateContainer(opts)

2)启动 Docker

代码语言:go
复制
sl.DockerClient.StartContainer(dockerContainer.ID, &docker.HostConfig{
		PortBindings: portBindings,
		Binds:        binds,
	})

这里是使用了 docker-client 的方式操作 Docker 的接口;

至此,kubelet 就完整的启动了容器;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

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