在创建容器,会执行kubernetes\pkg\kubelet\kuberuntime\kuberuntime_manager.go中的SyncPod方法,该方法的整体做的事情是:
- 计算需要创建或者删除的pod个数;
- 如果sandbox容器发生改变则杀掉重来;
- 删掉不需要在pod中维持或者保留的containers;
- 创建一个sandbox容器;
- 创建临时容器;
- 创建初始化容器;
- 创建正常的容器;
- 更新容器资源。
首先看computePodActions
// Step 1: Compute sandbox and container changes.
podContainerChanges := m.computePodActions(pod, podStatus)
去到具体的方法中,
为pod创建一个sandbox,sandbox是pod的一个特殊容器,需要占住整个pod的network namespace。这样同一个pod下的container就可以共享一个network namespace了。开始创建,首先要拿到sandbox的配置,包括pod的dns,log目录以及container 的 portMapping等配置信息。
真正执行创建的是kubernetes/pkg/kubelet/dockershim/docker_sandbox.go中的RunPodSandbox方法:
9. 先去下载镜像
if err := ensureSandboxImageExists(ds.client, image); err != nil {
return nil, err
}
- 获取runtime handler
- 注入config
- CreateCheckpoint校验
- 如果不是hostNetwork mode开始请求网络插件创建网络。
ds.network.SetUpPod
然后依次启动init 容器,业务容器,就是开头说的流程,