【问题标题】:Kubernetes - Use secrets on pre-install jobKubernetes - 在预安装作业中使用机密
【发布时间】:2020-04-12 20:08:56
【问题描述】:

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

错误:未找到秘密“SecretsFileName”

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

注意事项:

  • 我想使用机密来加密属性。我不想直接在我的 pod 上使用解密后的值;
  • 我已经阅读了Helm install in certain order,但我仍然不明白这个错误的原因;
  • 我已经尝试在秘密上使用 "helm.sh/hook": pre-install,post-delete"helm.sh/hook-weight": "1",在我的 pod 上使用 "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==

【问题讨论】:

    标签: kubernetes kubernetes-helm kubernetes-secrets


    【解决方案1】:

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

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

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

    下一个问题是这个 Secret 何时被删除notes 的文档 helm uninstall 不会删除钩子资源;您需要添加一个单独的helm.sh/hook-delete-policy annotation,否则它会一直存在,直到下次安排运行挂钩。我的意思是,如果您修改 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" . }}
    

    【讨论】:

    • 有没有解释为什么 job/helm/k8s 倾向于删除秘密以及作业?我目前正面临这个问题,即使可行,额外的秘密似乎也是一个 hack。
    • 这个很好,我采用了模板的方式!不过,我想指出的一件事——这可能只是较新的 K8 版本的问题——你需要将挂钩重量放在引号中,因为它需要作为字符串给出。 (helm.sh/docs/topics/charts_hooks/#writing-a-hook)
    • 谢谢@robbash,我已经解决了。 (语法注释键和值总是需要是字符串,它不应该特定于 Kubernetes 或 Helm 版本。)
    • 我对@9​​87654329@ 部分有点困惑。如果我正在安装密钥,我不想在安装后保留它吗?对我来说,我尝试安装的秘密确实像我想要的那样首先安装,但随后它被自动删除。我必须添加helm.sh/resource-policy: keep。这是掌舵3.4.1
    【解决方案2】:

    根据docs

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

    【讨论】:

    • 我已经读过了。而Secret 是资源?解决方案是什么?每个人都在 pod 上使用秘密......
    猜你喜欢
    • 2021-07-26
    • 2021-10-30
    • 1970-01-01
    • 2020-01-02
    • 2021-06-17
    • 2019-07-25
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    相关资源
    最近更新 更多