使用过 kubeadm 来创建集群的老铁应该知道,像 kube-apiserver, kube-controller-manager, kube-scheduler 这些组件是通过静态 Pod,也就是 Static Pod 来启动的,那么也许我们会好奇,这些镜像是怎么下载的,不妨看下 kubeadm 的代码分析一下
如果按常理想用 docker ps
或者 docker images
看不到的话,可以换通过 crictl ps
和 crictl images
是可以看到的
[root@VM-16-15-centos ~]# crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/library/redis alpine3.13 1690b63e207f6 10.9MB
registry.aliyuncs.com/google_containers/coredns v1.8.6 a4ca41631cc7a 13.6MB
registry.aliyuncs.com/google_containers/etcd 3.5.3-0 aebe758cef4cd 102MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.24.1 e9f4b425f9192 33.8MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.24.1 b4ea7e648530d 31MB
registry.aliyuncs.com/google_containers/kube-proxy v1.24.1 beb86f5d8e6cd 39.5MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.24.1 18688a72645c5 15.5MB
registry.aliyuncs.com/google_containers/pause 3.7 221177c6082a8 311kB
下面的代码是 Kubernetes 1.21.7 的代码,这个版本还是 Dockershim 保留的版本,如果看 1.24.0 的代码就会发现,PullImage
这个方法只剩下调用 crictl
的了
// PullImage pulls the image
func (runtime *CRIRuntime) PullImage(image string) error {
var err error
var out []byte
for i := 0; i < constants.PullImageRetry; i++ {
out, err = runtime.exec.Command("crictl", "-r", runtime.criSocket, "pull", image).CombinedOutput()
if err == nil {
return nil
}
}
return errors.Wrapf(err, "output: %s, error", out)
}
// PullImage pulls the image
func (runtime *DockerRuntime) PullImage(image string) error {
var err error
var out []byte
for i := 0; i < constants.PullImageRetry; i++ {
out, err = runtime.exec.Command("docker", "pull", image).CombinedOutput()
if err == nil {
return nil
}
}
return errors.Wrapf(err, "output: %s, error", out)
}
按照代码,很明显,在执行 kubeadm init
的时候,会有一个 PullImage
的操作去拉取一些镜像,至于用的是 docker pull
还是 crictl pull
就要具体看 Kubernetes 的版本了