【问题标题】:How to specify docker credentials for Kubernetes static pods with CRI enabled?如何为启用 CRI 的 Kubernetes 静态 Pod 指定 docker 凭据?
【发布时间】:2017-10-07 04:56:12
【问题描述】:

在启动 Kubernetes 集群时,我将 etcd 和核心 kubernetes 进程(kube-proxy、kube-apiserver、kube-controller-manager、kube-scheduler)加载为来自私有注册表的静态 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 凭据?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    在 1.6 中,我设法使它与 https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod 中的以下配方一起工作

    $ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
    

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

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

    【讨论】:

    • 这里似乎存在先有鸡还是先有蛋的问题。我正在尝试将 kube-apiserver 作为静态 pod 加载,从而启动集群。在 kube-apiserver 运行之前,我无法通过 kubectl 创建秘密,可以吗?
    【解决方案2】:

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

    因此,如果您尝试从私有注册表中提取此映像,则 CRI 逻辑不会将凭据与拉取请求相关联。现在有一个针对 1.7 的 Kubernetes 问题 (#45738) 来解决这个问题。

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

    【讨论】:

    • 您能否详细说明如何“在启动 kubelet 进程之前将“暂停”容器预拉到节点的本地 docker 映像缓存中。” ?
    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2018-12-10
    • 2018-09-06
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多