Kubernetes-在预安装作业中使用机密

时间:2019-12-20 09:47:32

标签: kubernetes kubernetes-helm kubernetes-secrets

在头盔图表上,我有一个pre-install钩子,需要在我的秘密中使用财产。但是,当我尝试安装头盔图表时,在我的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==

2 个答案:

答案 0 :(得分:2)

尽管Helm hooks通常是Jobs,但并不需要它们,而且Helm不会对钩子对象的内容进行任何分析,以了解它可能还依赖什么。如果通读了此处描述的安装顺序,则是(7)安装标记为钩子的东西,(8)等待它们准备就绪,然后(9)安装其他所有东西;它会等待作业完成,然后再安装依赖的机密。

那么,第一个答案是,您还需要将Secret标记为一个钩子,以便在预安装阶段将其安装,并具有更改的重量,以便在主要Job之前安装它(重量较小)发生得更快):

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

下一个问题是何时将该秘密删除helm uninstall不会删除挂钩资源的文档notes;您需要添加一个单独的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" . }}

答案 1 :(得分:0)

根据docs

  

预安装:在渲染模板之后但在Kubernetes中创建任何资源之前执行