如何为启用CRI的Kubernetes静态POD指定docker凭据?

如何为启用CRI的Kubernetes静态POD指定docker凭据?,kubernetes,Kubernetes,启动Kubernetes集群时,我将etcd和核心Kubernetes进程(kube代理、kube apiserver、kube控制器管理器、kube调度程序)作为静态POD从私有注册表加载。这在过去是有效的,它确保kubelet的$HOME环境变量设置为“/root”,然后使用私有docker注册表的凭据定义/root/.docker/config.json 当尝试在启用CRI的情况下运行Kubernetes 1.6时,我在kubelet日志中收到错误消息,称由于没有身份验证,它无法从我的私有

启动Kubernetes集群时,我将etcd和核心Kubernetes进程(kube代理、kube apiserver、kube控制器管理器、kube调度程序)作为静态POD从私有注册表加载。这在过去是有效的,它确保kubelet的$HOME环境变量设置为“/root”,然后使用私有docker注册表的凭据定义/root/.docker/config.json

当尝试在启用CRI的情况下运行Kubernetes 1.6时,我在kubelet日志中收到错误消息,称由于没有身份验证,它无法从我的私有docker注册表中提取pause:3.0容器

在kubelet命令行上设置--enable cri=false可以工作,但是当启用cri时,它似乎没有使用/root/.docker/config文件进行身份验证


在启用CRI的情况下运行时,是否有一些新的方法来提供加载静态POD所需的docker凭据?

在1.6中,我成功地使用了

您需要在pod规范的imagePullSecrets字段下指定新创建的myregistrykey作为凭证

apiVersion: v1
kind: Pod
metadata:
  name: foo
  namespace: awesomeapps
spec:
  containers:
    - name: foo
      image: janedoe/awesomeapp:v1
  imagePullSecrets:
    - name: myregistrykey

事实证明,Kubernetes 1.6中的CRI功能存在缺陷。在CRI中,“暂停”容器(现在称为“Pod沙盒映像”)被视为特例,因为它是容器运行时的“实现细节”,无论您是否需要它。在1.6版本中,在尝试提取Pod沙盒映像时,不使用应用于其他容器的凭据,例如来自/root/.docker/config.json的凭据

因此,如果您试图从私有注册表中提取此映像,CRI逻辑不会将凭据与提取请求相关联。现在有一个Kubernetes问题()来解决这个问题,目标是1.7


同时,一个简单的解决方法是在启动kubelet进程之前将“暂停”容器预拉入节点的本地docker映像缓存

这里似乎有鸡和蛋的问题。我正在尝试将kube apiserver作为静态pod加载,从而启动集群。在kube apiserver运行之前,我无法通过kubectl创建一个秘密,可以吗?您能否详细说明如何“在启动kubelet进程之前将“暂停”容器预拉入节点的本地docker映像缓存。”?
apiVersion: v1
kind: Pod
metadata:
  name: foo
  namespace: awesomeapps
spec:
  containers:
    - name: foo
      image: janedoe/awesomeapp:v1
  imagePullSecrets:
    - name: myregistrykey