9

在我的掌舵图上,我有一个pre-install钩子的工作,我需要使用我的秘密中的一个属性。但是,当我尝试安装 helm chart 时,我的pre-install工作出现以下错误:

错误:未找到秘密“SecretsFileName”

在 Pod 执行之前没有创建秘密?这里有什么问题?我该如何解决这个问题?

笔记:

  • 我想使用秘密来加密属性。我不想直接在我的 pod 上使用解密后的值;
  • 我已经按特定顺序阅读了 Helm install但我仍然不明白这个错误的原因;
  • 我已经尝试在秘密和我的 pod 上使用"helm.sh/hook": pre-install,post-delete和,但问题仍然存在。"helm.sh/hook-weight": "1""helm.sh/hook-weight": "2"

我的预安装工作:

apiVersion: batch/v1
kind: Job
metadata:
  name: "MyPodName"
  annotations:
    "helm.sh/hook": pre-install
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
  #some more code
spec:
  template:
    #some more code
    spec:
      dnsPolicy: {{ .Values.specPolicy.dnsPolicy }}
      restartPolicy: {{ .Values.specPolicy.restartPolicy }}
      volumes:
        - name: {{ .Values.volume.name }}
          persistentVolumeClaim:
            claimName: {{ .Values.volume.claimName }}
      securityContext:
        {{- toYaml .Values.securityContext | nindent 8 }}
      containers:
        - name: "MyContainerName"
          #some more code
          env:
            - name: SECRET_TO_USE
              valueFrom:
                secretKeyRef:
                  name: SecretsFileName
                  key: PROP_FROM_SCRETS
          #some more code

我的秘密文件:

apiVersion: v1
kind: Secret
metadata:
  name: "SecretsFileName"
  labels:
    app: "MyAppName"
    #some more code
type: Opaque
data:
    PROP_FROM_SCRETS: eHB0bw==
4

2 回答 2

11

虽然Helm 钩子通常是作业,但并不要求它们必须如此,而且 Helm 不会对钩子对象的内容进行任何分析以查看它可能依赖的其他内容。如果你通读那里描述的安装顺序,它是(7)安装标记为钩子的东西,(8)等待那些准备好,然后(9)安装其他所有东西;在安装它所依赖的 Secret 之前,它会等待 Job 完成。

那么,第一个答案是,您还需要将您的 Secret 标记为挂钩,以便在预安装阶段安装它,并修改权重,以便在主作业之前安装(较小的权重数字发生得更快) :

apiVersion: v1
kind: Secret
annotations:
  "helm.sh/hook": pre-install
  "helm.sh/hook-weight": "-5"

下一个问题是这个 Secret 何时被删除。不会删除钩子资源的文档说明;helm uninstall您需要添加一个单独的helm.sh/hook-delete-policy注释,否则它将一直存在,直到下次安排运行挂钩。这对我来说是说,如果您修改 Secret(或组成它的值)并升级(而不是删除和重新安装)图表,则 Secret 将不会得到更新。

我可能只创建两个 Secret 副本,一个在预安装时有用,另一个对主图表生命周期有用。您可以创建一个模板来呈现 Secret 正文,然后调用它两次:

{{- define "secret.content" -}}
type: Opaque
data:
    PROP_FROM_SCRETS: eHB0bw==
{{- end -}}
---
apiVersion: v1
kind: Secret
metadata:
  name: "SecretsFileName"
  labels:
    app: "MyAppName"
{{ include "secret.content" . }}
---
apiVersion: v1
kind: Secret
metadata:
  name: "SecretsFileName-preinst"
  labels:
    app: "MyAppName"
  annotations:
    "helm.sh/hook": pre-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
{{ include "secret.content" . }}
于 2019-12-20T12:11:03.963 回答
0

根据文档

pre-install:在模板渲染之后,在 Kubernetes 中创建任何资源之前执行

于 2019-12-20T10:33:42.997 回答