如何不覆盖Helm模板中随机生成的秘密

Mik*_*ski 5 passwords kubernetes kubernetes-helm

我想在Helm模板中生成一个密码,使用此randAlphaNum功能很容易做到。但是,升级发行版后,密码将更改。有没有一种方法可以检查以前是否生成过密码,然后使用现有值?像这样:

apiVersion: v1
kind: Secret
metadata:
  name: db-details
data:
  {{ if .Secrets.db-details.db-password }}
  db-password:  {{ .Secrets.db-details.db-password | b64enc }}
  {{ else }}
  db-password: {{ randAlphaNum 20 | b64enc }}
  {{ end }}
Run Code Online (Sandbox Code Playgroud)

use*_*157 14

我对Jan Duboisshaunc的答案感到很困惑。所以我构建了一个组合解决方案。

Jan 的答案的缺点:当它与 一起使用时,它会导致错误--dry-run
shaunc 答案的缺点:它不起作用,因为资源将在 上被删除helm upgrade

这是我的代码:

# store the secret-name as var
# in my case, the name was very long and containing a lot of fields
# so it helps me a lot
{{- $secret_name := "your-secret-name" -}}

apiVersion: v1
kind: Secret
metadata:
  name: {{ $secret_name }}

data:
  # try to get the old secret
  # keep in mind, that a dry-run only returns an empty map 
  {{- $old_sec := lookup "v1" "Secret" .Release.Namespace $secret_name }}

  # check, if a secret is already set
  {{- if or (not $old_sec) (not $old_sec.data) }}
  # if not set, then generate a new password
  db-password: {{ randAlphaNum 20 | b64enc }}
  {{ else }}
  # if set, then use the old value
  db-password: {{ index $old_sec.data "db-password" }}
  {{ end }}
Run Code Online (Sandbox Code Playgroud)


小智 10

您可以根据shaunc的想法使用查找功能来修复原始海报的代码,如下所示:

apiVersion: v1
kind: Secret
metadata:
  name: db-details
data:
  {{- if .Release.IsInstall }}
  db-password: {{ randAlphaNum 20 | b64enc }}
  {{ else }}
  # `index` function is necessary because the property name contains a dash.
  # Otherwise (...).data.db_password would have worked too.
  db-password:  {{ index (lookup "v1" "Secret" .Release.Namespace "db-details").data "db-password" }}
  {{ end }}
Run Code Online (Sandbox Code Playgroud)

Secret在它尚不存在时创建它是行不通的,因为 Helm 将删除在升级过程中不再定义的对象。

使用注释来保留对象的缺点是,当您使用 删除发布时,它不会被删除helm delete ...

  • 虽然我确实喜欢这种方法,但它似乎不太适合“helm lint”、“helm template”和“helm --dry-run”,因为它不会(也不应该)联系 Kubernetes API 服务器获取现有的秘密。[文档](https://helm.sh/docs/chart_template_guide/functions_and_pipelines/#using-the-lookup-function) 指出“在这种情况下,‘lookup’函数将返回一个空列表(即字典)” 。这会导致“nil 指针评估接口”(当不使用“index”调用时)或“调用索引时出错:无类型 nil 的索引”(当使用“index”调用时)。有想法吗? (4认同)

Vas*_*pov 7

这仍然是 Helm 最大的问题之一。据我所知,目前还没有好的解决方案(参见https://github.com/helm/charts/issues/5167)。

一种肮脏的解决方法是创建 secret 作为 pre-install hook。这种方法的明显缺点是在 helm delete 时不会删除 secret。

apiVersion: v1
kind: Secret
metadata:
  name: {{ template "helm-random-secret.fullname" . }}
  annotations:
    "helm.sh/hook": "pre-install"
    "helm.sh/hook-delete-policy": "before-hook-creation"
  labels:
    app: {{ template "helm-random-secret.name" . }}
    chart: {{ template "helm-random-secret.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
data:
  some-password: {{ default (randAlphaNum 10) .Values.somePassword | b64enc | quote }}
Run Code Online (Sandbox Code Playgroud)