背景

在对K8S版本升级或修改K8S源码重新编译后,使用kubeadm去部署K8S集群时,会拉取其对应的固定版本kube镜像,因此需要确认相关镜像版本:

  • 通过kubeadm去部署K8S集群时,kube-controller-manager-amd64 / kube-scheduler-amd64 / kube-proxy-amd64 / kube-apiserver-amd64 这四个镜像版本跟 kubernetes(即kubelet/kubeadmin)版本保持一致,但是 dns 和 pause 镜像版本跟 kubernetes 版本没有直接关联
  • 关于如何确认对应的dns(k8s v1.13之前使用kube-dns; k8s v1.13版本之后使用coredns)和pause镜像版本,是确认镜像版本的重点

确认方式

考虑这种方式:在使用kubeadm init 进行初始化,由于这个时候没有对应版本的镜像:

  • kube-dns pod会启动失败,此时通过 kubectl describe命令去看 kube-dns pod 获取镜像版本
  • 但由于 pause 不会启动相应pod,只会针对相应pod启动pause container,所以不能获取pause镜像版本

v1.13版本之前

通过查看源代码去获取:切换到对应版本的分支,相关代码在 cmd/kubeadm/app目录下 (具体代码就不分析了)

  • kube-apiserver/kube-controller-manager/kube-scheduler 这三个pod对应的镜像被定义在 images/images.go 文件
  • kube-dns 对应镜像版本为定义在 phases/addons/dns/versions.go
  • proxy 对应镜像版本被定义在 phases/addons/proxy/proxy.go (同kube-apiserver版本一致,只是定义位置不同)
  • pause 由于是被kubelet使用,被定义在cmd/kubelet/app/options/container_runtime.go文件

v1.13版本之后

  • 在v1.13版本之后,kubeadm代码对镜像版本的定义进行了相关调整,可直接通过命令kubeadm config images list列出部署K8S所需要的镜像和版本:
[root@k1 amd64]# ./kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.14.0
k8s.gcr.io/kube-controller-manager:v1.14.0
k8s.gcr.io/kube-scheduler:v1.14.0
k8s.gcr.io/kube-proxy:v1.14.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
[root@k1 amd64]#
  • images的版本获取全部放到cmd/kubeadm/app/images/images.go文件,所有镜像版本定义存放在cmd/kubeadm/app/constants/constants.go文件