3

作为拥有大量参数化 Openshift 模板的管理员,我正在努力在 kubernetes.io/dockerconfigjson 或 kubernetes.io/dockercfg 类型的模板中创建参数化的 SECRET 对象,以便可以将秘密用于 docker pulls。

挑战:对于正常的 dockerconfigjson 模板设置,所有内容都是 pre-base64 编码的 JSON 格式,不知道如何更改它。

问:如何创建一个 SECRET 模板,该模板接受参数 ${DOCKER_USER}、${DOCKER_PASSWORD}、${DOCKER_SERVER} 和 ${DOCKER_EMAIL},然后创建可用于从私有/提取 docker 图像的实际秘密/安全的 docker 注册表。

这是为了替换命令行“oc create secret docker-registry ....”技术,将它们放入存储在 gitlab/github 中的模板文件中,以具有 gitOps 风格的部署模式。

谢谢!

4

1 回答 1

5

docker 配置密钥的格式可以在文档(或在集群中通过oc export secret/mysecret)中的Using Secrets部分找到。

apiVersion: v1
kind: Secret
metadata:
  name: aregistrykey
  namespace: myapps
type: kubernetes.io/dockerconfigjson 
data:
  .dockerconfigjson:<base64encoded docker-config.json>

一种方法是在模板参数中接受 json 文件的 pre-based64 编码内容并将它们填充到数据部分中。

apiVersion: v1
kind: Secret
metadata:
  name: aregistrykey
  namespace: myapps
type: kubernetes.io/dockerconfigjson 
data:
  .dockerconfigjson:${BASE64_DOCKER_JSON}

另一种方法是使用秘密对象的 stringData 字段。如同一页所述:

stringData 映射中的条目将转换为 base64,然后该条目将自动移动到数据映射中。该字段是只写的;该值将仅通过数据字段返回。

apiVersion: v1
kind: Secret
metadata:
  name: aregistrykey
  namespace: myapps
type: kubernetes.io/dockerconfigjson 
stringData:
  .dockerconfigjson:${REGULAR_DOCKER_JSON}

.dockerconfigjson 键的实际的格式与文件的内容相同.docker/config.json。因此,在您的特定情况下,您可能会执行以下操作:

apiVersion: v1
kind: Secret
metadata:
  name: aregistrykey
  namespace: myapps
type: kubernetes.io/dockerconfigjson 
stringData:
  .dockerconfigjson:'{"auths": {"${REGISTRY_URL}": {"auth": "${BASE64_USERNAME_COLON_PASSWORD}"}}}'

不幸的是,OpenShift 用于模板的模板语言不够强大,无法为您对实际参数值进行 base64 编码,因此您无法完全避免username:password在模板本身之外对这对进行编码,但您的 CI/CD 工具应该是能够使用原始用户名/密码字符串执行此操作。

于 2019-03-29T16:26:33.857 回答