Kubernetes - Используйте секреты при работе перед установкой

На моей диаграмме управления у меня есть работа с хук pre-install, где мне нужно использовать свойство из моих секретов. Однако, когда я пытаюсь установить свою схему управления, я получаю следующую ошибку в моем pre-install задании:

Ошибка: секрет "SecretsFileName" не найден

Секреты не создаются перед выполнением подов? В чем проблема? Как я могу это решить?

Примечания:

  • Я хочу использовать секреты для шифрования свойств. Я не хочу использовать расшифрованное значение непосредственно в моем модуле;
  • Я уже прочитал установку Helm в определенном порядке, но все еще не понимаю причину этой ошибки ;
  • Я уже пробовал использовать "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==

person Ninita    schedule 20.12.2019    source источник


Ответы (2)


Хотя крючки Helm обычно являются рабочими местами, они не требуются, а Helm не проведите любой анализ содержимого объекта-перехватчика, чтобы увидеть, от чего еще он может зависеть. Если вы прочитали описанную там последовательность установки, это: (7) установка вещей, помеченных как хуки, (8) ожидание их готовности, затем (9) установка всего остального; он ожидает завершения задания, прежде чем установить секрет, от которого он зависит.

Итак, первый ответ заключается в том, что вам также необходимо пометить свой секрет как крючок для его установки на этапе предварительной установки с измененным весом, чтобы он устанавливался перед основным заданием (меньшие значения веса появляются раньше). :

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

Следующий вопрос: когда этот Секрет будет удален. Документация примечания что helm uninstall не удаляет ресурсы перехвата; вам необходимо добавить отдельную helm.sh/hook-delete-policy аннотацию, иначе она будет оставайтесь там до следующего запланированного запуска хука. Для меня это означает, что если вы измените Секрет (или значения, которые его составляют) и обновите (не удалите и не переустановите) диаграмму, Секрет не будет обновлен.

Я бы, вероятно, просто создал две копии 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" . }}
person David Maze    schedule 20.12.2019
comment
Есть ли объяснение того, почему job / helm / k8s имеет тенденцию удалять секрет так же, как и задание? В настоящее время я сталкиваюсь с этой проблемой, и дополнительный секрет, похоже, заключается в взломе, хотя он сработает. - person John; 21.09.2020
comment
Это очень хорошо, я применил шаблонный подход! Однако я хочу отметить одну вещь - и, возможно, это проблема только новых версий K8 - это то, что вам нужно поместить вес крючка в кавычки, поскольку он должен быть указан в виде строки. (helm.sh/docs/topics/charts_hooks/#writing-a-hook) - person robbash; 12.04.2021
comment
Спасибо @robbash, я исправил. (Синтаксически ключи и значения аннотации всегда должны быть строками и не должны быть специфичными для версий Kubernetes или Helm.) - person David Maze; 12.04.2021
comment
Меня немного смущает "helm.sh/hook-delete-policy": hook-succeeded часть. Если я устанавливаю секрет, разве я не хочу, чтобы он остался после установки? Для меня секрет, который я пытался установить, был установлен первым, как я хотел, но затем он был автоматически удален. Пришлось добавить helm.sh/resource-policy: keep. Это штурвал 3.4.1. - person slevin; 28.05.2021

Согласно документам:

pre-install: выполняется после рендеринга шаблонов, но до создания каких-либо ресурсов в Kubernetes.

person prometherion    schedule 20.12.2019
comment
Я это уже читал. А Secret это ресурс? И какое решение? Все используют секреты на стручках ... - person Ninita; 20.12.2019