【问题标题】:Kubernetes: Putting JSON value in YAML fileKubernetes:将 JSON 值放入 YAML 文件中
【发布时间】:2018-12-10 11:31:08
【问题描述】:

我正在尝试从 JSON 值创建一个秘密,但当我执行 "secrets.yaml" at <b64enc>: wrong type for value; expected string; got map[string]interface {} 时,我不断收到此错误 helm install

secrets.yaml

apiVersion: v1
kind: Secret
metadata:
  name: cloudsql-instance-credentials
  namespace: wp-{{ .Values.name }}
  labels:
    app: wp-{{ .Values.name }}
type: Opaque
data:
  credentials.json: {{ .Values.dbCred | b64enc }}

values.yaml

dbCred: {
  'type': '',
  'project_id': '',
  'private_key_id': '',
  'private_key': '-----BEGIN PRIVATE KEY-----\n\n-----END PRIVATE KEY-----\n',
  'client_email': '',
  'client_id': '',
  'auth_uri': '',
  'token_uri': '',
  'auth_provider_x509_cert_url': '',
  'client_x509_cert_url': ''
}

【问题讨论】:

  • 试试toJson .Values.dbCred | b64enc。或者您甚至可以尝试将 json 结构中的值作为 yaml 放入 values.yaml 并让 helm 为您转换为 json - stackoverflow.com/a/53342487/9705485

标签: json kubernetes yaml google-kubernetes-engine kubernetes-helm


【解决方案1】:

您可以通过将{{ .Values.dbCred | b64enc }} 更改为{{ toJson .Values.dbCred | b64enc }} 来解决此问题

【讨论】:

  • 我尝试将 secrets.yaml 和值条目放入使用helm create 生成的示例图表中,并且能够重新创建错误。然后我做了这个更改,发现我没有收到错误
  • @O'Dane Brissett 对这个问题有点困惑。这个例子讨论的是一个secrets.yaml
  • 我正在使用 octopus deploy 来设置变量,然后替换我 helm 中的值。但是使用上面的例子我得到错误did not find expected key
  • @O'Dane Brissett 我建议在章鱼之外尝试它,如果可行,那么您知道这是章鱼级别的问题。如果它不起作用,那么我会建议一个关于 SO 的新问题或一个关于 helm repo 的问题。
【解决方案2】:

或者,您可以将 credentials.json 文件保存在图表目录中,以及 access file inside your template

data:
  credentials.json: {{ .Files.Get "credentials.json" | b64enc }}

【讨论】:

  • 真漂亮!正是我想要的。
【解决方案3】:

dbCred 前后使用双引号(“”),如下所示

dbCred: "{
  'type': '',
  'project_id': '',
  'private_key_id': '',
  'private_key': '-----BEGIN PRIVATE KEY-----\n\n-----END PRIVATE KEY-----\n',
  'client_email': '',
  'client_id': '',
  'auth_uri': '',
  'token_uri': '',
  'auth_provider_x509_cert_url': '',
  'client_x509_cert_url': ''
}"

其他的看起来还不错。

【讨论】:

    【解决方案4】:

    您可以按照以下方式进行配置:

    apiVersion: v1
    kind: Secret
    metadata:
      name: cloudsql-instance-credentials
      namespace: wp-{{ .Values.name }}
      labels:
        app: wp-{{ .Values.name }}
    type: Opaque
    data:
      credentials.json: |-
         {{ include (print $.Template.BasePath "/_helper_conf.tpl") . | b64enc }}
    

    请注意,当您尝试将配置注入秘密(特别是大的)时,您可能需要使用 |-

    你也可以使用类似的助手

    {{ include (print $.Template.BasePath "/_helper_conf.tpl") . | b64enc }}
    

    或者甚至更好,在你的 yaml 配置中( values.yml ) 你可以写如下:

    dbCred:
      type: ''
      project_id: ''
      private_key_id: ''
      private_key: '-----BEGIN PRIVATE KEY-----\n\n-----END PRIVATE KEY-----\n'
      client_email: ''
      client_id: ''
      auth_uri: ''
      token_uri: ''
      auth_provider_x509_cert_url: ''
      client_x509_cert_url: ''
    

    要使用这种配置,您可以检查以下对象:

    apiVersion: v1
    kind: Secret
    metadata:
      name: cloudsql-instance-credentials
      namespace: wp-{{ .Values.name }}
      labels:
        app: wp-{{ .Values.name }}
    type: Opaque
    data:
      credentials.json: |-
         {{ toJson .Values.dbCred | b64enc }}
    

    这个配置的用途是提供对所提供的json的抽象,并将其放在你的values.yml中

    {{ toJson .Values.dbCred | b64enc }}
    

    请注意,如果您支持多个环境,这可能会重复,因此您可能更喜欢在内部(或 tpl)使用帮助程序和一些变量以避免重复代码

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-10
      • 2020-02-11
      • 2012-03-20
      • 2018-10-19
      • 2021-01-08
      • 2018-12-26
      • 2020-03-30
      • 2017-03-01
      相关资源
      最近更新 更多