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

问题描述 投票:9回答:2

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

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

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

是否有办法全局设置,如果kube试图从注册表X拉出它使用秘密Y?

谢谢

kubernetes artifactory kubernetes-helm
2个回答
2
投票

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

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "mySecret"}]}'

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

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

解决方案2: This section of the doc解释了如何在节点基础上设置私有注册表:

以下是配置节点以使用私有注册表的建议步骤。在此示例中,在桌面/笔记本电脑上运行这些:

  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} {end}')
  4. 将本地.docker / config.json复制到上面的搜索路径列表之一。例如: for $ in $ nodes;做scp~ / .docker / config.json root @ $ n:/var/lib/kubelet/config.json; DONE

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

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

好吧,我想我不需要解释那是多么丑陋。

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


0
投票

两个简单的问题,你在哪里运行你的k8s集群?您的注册表在哪里?这里有一些方法可以解决您的问题:https://kubernetes.io/docs/concepts/containers/images/#using-a-private-registry

© www.soinside.com 2019 - 2024. All rights reserved.