Openshift/OKD - 如何模板 docker 秘密

Openshift/OKD - how to template docker secrets

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

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

The Ask:如何创建带有参数 ${DOCKER_USER}、${DOCKER_PASSWORD}、${DOCKER_SERVER} 和 ${[=30 的 SECRET 模板=]} 然后创建可用于从 private/secured docker 注册表中提取 docker 图像的实际秘密。

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

谢谢!

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

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 字段。如同一页所述:

Entries in the stringData map are converted to base64 and the entry will then be moved to the data map automatically. This field is write-only; the value will only be returned via the data field.

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 工具应该能够使用原始 username/password 字符串执行此操作。