【问题标题】:Create kubernetes docker-registry secret from yaml file?从 yaml 文件创建 kubernetes docker-registry 密码?
【发布时间】:2018-09-12 17:32:17
【问题描述】:

我可以运行这个命令来为 Kubernetes 集群创建一个 docker 注册表秘密:

kubectl create secret docker-registry regsecret \
--docker-server=docker.example.com \
--docker-username=kube \
--docker-password=PW_STRING \
--docker-email=my@email.com \
--namespace mynamespace 

我想从 YAML 文件创建相同的秘密。有谁知道如何在 YAML 文件中设置它?

我需要这个作为 YAML 文件,以便它可以用作 Helm 模板,它允许 Helm 安装命令,例如这个(简化的):

helm install ... --set docker.user=peter,docker.pw=foobar,docker.email=...

【问题讨论】:

    标签: docker kubernetes docker-registry kubernetes-secrets


    【解决方案1】:

    您可以自己编写该 yaml,但使用 kubectl 分两步创建它会更快:

    1. 生成一个“yaml”文件。您可以在试运行模式和输出模式yaml 下使用相同的命令。

    下面是一个命令示例,它将一个秘密保存到一个 'docker-secret.yaml' 文件中,用于kubectl 版本 kubectl version --short|grep Client 检查版本):

    kubectl create secret docker-registry --dry-run=true $secret_name \
      --docker-server=<DOCKER_REGISTRY_SERVER> \
      --docker-username=<DOCKER_USER> \
      --docker-password=<DOCKER_PASSWORD> \
      --docker-email=<DOCKER_EMAIL> -o yaml > docker-secret.yaml
    

    对于kubectl 版本>= 1.18:

    kubectl create secret docker-registry --dry-run=client $secret_name \
      --docker-server=<DOCKER_REGISTRY_SERVER> \
      --docker-username=<DOCKER_USER> \
      --docker-password=<DOCKER_PASSWORD> \
      --docker-email=<DOCKER_EMAIL> -o yaml > docker-secret.yaml
    
    1. 您可以像应用任何其他 Kubernetes 'yaml' 一样应用该文件:

      kubectl apply -f docker-secret.yaml

    UPD,因为问题已更新。

    如果你正在使用 Helm,这里有一个官方的 documentation 关于如何创建一个 ImagePullSecret

    来自文档:

    1. 首先,假设凭据在values.yaml 文件中定义,如下所示:
    imageCredentials:
      registry: quay.io
      username: someone
      password: sillyness
    
    1. 然后我们定义我们的帮助模板如下:
    {{- define "imagePullSecret" }}
    {{- printf "{\"auths\": {\"%s\": {\"auth\": \"%s\"}}}" .Values.imageCredentials.registry (printf "%s:%s" .Values.imageCredentials.username .Values.imageCredentials.password | b64enc) | b64enc }}
    {{- end }}
    
    1. 最后,我们在一个更大的模板中使用辅助模板来创建Secret 清单:
    apiVersion: v1
    kind: Secret
    metadata:
      name: myregistrykey
    type: kubernetes.io/dockerconfigjson
    data:
      .dockerconfigjson: {{ template "imagePullSecret" . }}
    

    【讨论】:

    • 这很好!但这给我留下了一个问题。与 docker 相关的值得到 base64 编码。我需要这个 yaml 文件作为 Helm 模板,所以值必须是纯文本。不确定这是否可能。
    • @Rotareti base64 专门设计用于将任何数据编码为纯文本格式。您可以在 Helm 变量中使用生成的行作为纯文本。
    • 对不起,我不清楚。我更新了这个问题。我希望它现在更有意义!
    • 漂亮!非常感谢!
    • @AntonKostenko @Rotareti 这意味着密码应该在values.yaml 文件中以纯文本形式输入?如果我使用b64enc,我正在对密码进行编码,真的,然后,我可以输入已经编码的密码(echo &lt;my-password-in-text-plain&gt; | base64)并在那里使用生成的哈希,然后在模板帮助程序中而不是使用b64enc我应该解码吗?也许有像b64dec这样的标签
    【解决方案2】:
    cat <<EOF | kubectl apply -f -
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: regcred
    data:
      .dockerconfigjson: $(echo "{\"auths\": {\"https://index.docker.io/v1/\": {\"auth\": \"$(echo "janedoe:xxxxxxxxxxx" | base64)\"}}}" | base64)
    type: kubernetes.io/dockerconfigjson
    EOF
    

    【讨论】:

      【解决方案3】:

      如果有人也只想将 kubectl 命令映射到 yaml 文件:

      kubectl create secret docker-registry --dry-run=true dockerhostsecretname \
        --docker-server=localhost \
        --docker-username=root \
        --docker-password=toor \
        --docker-email=root@toor.nl -o yaml
      

      给我

      apiVersion: v1
      data:
        .dockerconfigjson: eyJhdXRocyI6eyJsb2NhbGhvc3QiOnsidXNlcm5hbWUiOiJyb290IiwicGFzc3dvcmQiOiJ0b29yIiwiZW1haWwiOiJyb290QHRvb3IubmwiLCJhdXRoIjoiY205dmREcDBiMjl5In19fQ==
      kind: Secret
      metadata:
        creationTimestamp: null
        name: dockerhostsecretname
      type: kubernetes.io/dockerconfigjson
      

      密码的base64字符串:

      eyJhdXRocyI6eyJsb2NhbGhvc3QiOnsidXNlcm5hbWUiOiJyb290IiwicGFzc3dvcmQiOiJ0b29yIiwiZW1haWwiOiJyb290QHRvb3IubmwiLCJhdXRoIjoiY205dmREcDBiMjl5In19fQ
      

      解码为:

      {"auths":{"localhost":{"username":"root","password":"toor","email":"root@toor.nl","auth":"cm9vdDp0b29y"}}}
      

      【讨论】:

        【解决方案4】:

        您可以在一行中kubectl apply命令式命令的输出:

        kubectl create secret docker-registry --dry-run=true $secret_name \
          --docker-server=<DOCKER_REGISTRY_SERVER> \
          --docker-username=<DOCKER_USER> \
          --docker-password=<DOCKER_PASSWORD> \
          --docker-email=<DOCKER_EMAIL> -o yaml | kubectl apply -f -
        

        【讨论】:

          【解决方案5】:
          apiVersion: v1
          kind: Secret
          metadata:
            name: <NAME>
            namespace: <NAMESPACE>
          data:
            .dockercfg: eyJldXJvcGEubGFSfsdfsdfSFSDFsdfsdfSFSDFSDfjM2x1SDFSDFSDFSDFSDFSDFSFSDFSDFSDFSDFG9mZmVyLm5pY2tsYXNzb25AbGVuc3dheWdyb3VwLmNvbSIsImF1dGgiOiJWRTlMUlU0Nk1EZDBNM0JxTXpWak0yeDFNakEwZEdkbGRHVndjVzQ1YUdZPSJ9fQ==
          type: kubernetes.io/dockercfg
          

          这适用于 k8s 1.11.2。我还没有在低于 1.9 的任何东西上测试它。因为他们改变了类型。

          【讨论】:

          • 配置中那个奇怪的字符串是什么?
          • 这是秘密包含的base64编码数据..我已经打乱了我们的:)
          猜你喜欢
          • 2019-03-17
          • 2021-02-11
          • 1970-01-01
          • 2021-06-09
          • 1970-01-01
          • 2016-09-03
          • 2021-09-12
          • 2021-04-02
          • 1970-01-01
          相关资源
          最近更新 更多