【注】源码分析均以 k8s 的第一个 commit 代码分析;
在启动监听之后,主要是处理资源清单的变更;
1、RunSyncLoop():处理 channel 的主循环;
func (sl *Kubelet) RunSyncLoop(etcdChannel <-chan []api.ContainerManifest, fileChannel, serverChannel, httpChannel <-chan api.ContainerManifest, handler SyncHandler) {}
这个函数启动循环,监控各个通道中的内容,每次只同步一个通道中的内容;
这里着重分析 SyncManifests() 方法实现:
func (sl *Kubelet) SyncManifests(config []api.ContainerManifest) error {}
将从通道中读取的资源清单,交付到对应的节点上;
// Sync the configured list of containers (desired state) with the host current state
同步配置容器列表,比较期望状态和主机上的容器状态;
-- 如果对应的节点上存在,则不进行处理
-- 如果对应的节点上不存在,则需要在对应的节点上启动容器;
1)判断对应节点上的是否存在容器
func (sl *Kubelet) ContainerExists(manifest *api.ContainerManifest, container *api.Container) (exists bool, foundName string, err error) {}
2)启动对应节点上的容器
func (sl *Kubelet) RunContainer(manifest *api.ContainerManifest, container *api.Container) (name string, err error) {}
-- 拉取镜像
sl.pullImage(container.Image)
这个函数中,是直接执行 docker pull 命令;
cmd := exec.Command("docker", "pull", image)
name = manifestAndContainerToDockerName(manifest, container)
将资源名和容器名转换成 docker 名;
fmt.Sprintf("%s--%s--%x", escapeDash(container.Name), escapeDash(manifest.Id), rand.Uint32())
这里需要对名字进行规则转换:
// 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
dockerContainer, err := sl.DockerClient.CreateContainer(opts)
2)启动 Docker
sl.DockerClient.StartContainer(dockerContainer.ID, &docker.HostConfig{
PortBindings: portBindings,
Binds: binds,
})
这里是使用了 docker-client 的方式操作 Docker 的接口;
至此,kubelet 就完整的启动了容器;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。