Kubernetes集群一般会管理多个节点,每个节点都有自己的docker环境。如果让用户分别到集群节点上登录镜像仓库,显然是很不方便的。
为了解决这个问题,Kubernetes实现了自动拉取镜像的功能。如图8-7所示,这个功能的核心,是把docker.json内容编码,并以Secret的方式作为Pod定义的一部分传给Kubelet。

图8-7 私有镜像拉取基本方式
具体来说,步骤如下:
第一步,创建Secret。这个Secret的.dockerconfigjson数据项包括了一份Base64编码的docker.json文件。
第二步,创建Pod,且使Pod编排中imagePullSecrets指向第一步创建的Secret。
第三步,Kubelet作为集群控制器,监控着集群的变化。当它发现新的Pod被创建时,就会通过API Server获取Pod的定义,这包括imagePullSecrets引用的Secret。
第四步,Kubelet调用docker创建容器且把.dockerconfigjson传给docker。
第五步,运行时docker使用解码得到的用户名和密码拉取镜像,这和上一节的方法一致。
上面的功能在一定程度上解决了集群节点登录镜像仓库不方便的问题,但是我们在创建Pod的时候,仍然需要给Pod指定imagePullSecrets。
Kubernetes通过变更准入控制(Mutating Admission Control)进一步优化了上面的基本功能,如图8-8所示。

图8-8 私有镜像拉取进阶方式
进一步优化的内容如下:
一是在第一步创建Secret之后,添加default service account对imagePull Secrets的引用。
二是Pod默认使用default service account,而service account变更准入控制器会在default service account引用imagePullSecrets的情况下,在Pod的编排文件里添加imagePullSecrets配置。