从私有注册表中提取时自动使用秘密

apr*_*985 10 artifactory kubernetes kubernetes-helm

是否可以全局(或至少每个名称空间)配置kubernetes,使其在连接到私有存储库时始终使用映像拉密钥?有两种用例:

  1. 当用户在部署中的私有注册表中指定容器时
  2. 当用户将Helm图表指向我们的私人仓库时(因此我们无法控制图片提取秘密标签)。

我知道可以在服务帐户的基础上执行此操作,但是如果不编写控制器将其添加到创建的每个新服务帐户中,就会有些混乱。

有没有办法全局设置此值,因此如果kube尝试从注册表X拉出它使用秘密Y?

谢谢

vic*_*rtv 15

据我所知,通常默认serviceAccount 负责拉取图像。要轻松地将 imagePullSecrets 添加到 serviceAccount,您可以使用patch 命令

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "mySecret"}]}'
Run Code Online (Sandbox Code Playgroud)

可以kubectl patch在跨所有命名空间的 serviceAccounts 上插入 imagePullSecrets 的脚本中使用。

如果管理多个命名空间太复杂,您可以查看kubernetes-replicator,它在命名空间之间同步资源。

解决方案 2:
文档的这一部分解释了如何基于节点设置私有注册表:

以下是配置节点以使用私有注册表的推荐步骤。在本例中,在您的台式机/笔记本电脑上运行这些:

  1. docker login [server]为您要使用的每组凭据运行。这更新$HOME/.docker/config.json
  2. $HOME/.docker/config.json在编辑器中查看以确保它只包含您要使用的凭据。
  3. 获取节点列表,例如:

    • 如果您想要名称:
      nodes=$(kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}')

    • 如果你想获取 IP:
      nodes=$(kubectl get nodes -o jsonpath='{range .items[*].status.addresses[?(@.type=="ExternalIP")]}{.address} {结尾}')

  4. 将本地 .docker/config.json 复制到上面的搜索路径列表之一。例如:

    对于 $nodes 中的 n;做 scp ~/.docker/config.json root@$n:/var/lib/kubelet/config.json; 完毕

解决方案 3:
我发现不需要在部署/服务帐户基础上设置 imagePullSecret 的(非常脏!)方法是:

  1. 设置 ImagePullPolicy:IfNotPresent
  2. 拉取每个节点中的图像
    2.1。手动使用docker pull myrepo/image:tag.
    2.2. 使用脚本或诸如docker-puller 之类的工具来自动化该过程。

好吧,我想我不需要解释它有多丑。

PS:如果有帮助,我在 kubernetes/kops 上发现了一个关于为私有注册表创建全局配置的功能的问题

  • 我去找解决方案2。用户将 b64 编码的 docker 配置添加到 AWS 密钥中,将 ARN 传递给 terraform,后者创建 AWS 启动配置用户数据以提取密钥并将其放入 asg 启动的任何工作进程中:) (3认同)