Удалить секрет Kubernetes при удалении Helm

Я создаю секреты, когда helm install выполняется через pre-install хуки.

Все отлично работает. Однако при выполнении helm delete созданные секреты не удаляются. Это связано с тем, что любой ресурс, установленный с использованием pre-install, считается самоуправляемым. Итак, я прочитал, что это можно сделать с помощью post-delete крючков.

Итак, вопросы:

  1. Как удалить секреты при удалении поста?

  2. Если мы удалим pre-install ловушек, тогда удаление будет работать нормально. Но как тогда гарантировать, что секреты будут созданы еще до создания модулей, когда мы выполняем helm install?


person Dheeraj Joshi    schedule 30.05.2018    source источник


Ответы (3)


Tiller создает ресурсы в определенном порядке (его можно найти в исходном коде здесь: https://github.com/kubernetes/helm/blob/master/pkg/tiller/kind_sorter.go#L26)

Так что для этого конкретного пользовательского случая нет необходимости в хуках или каком-либо другом механизме, просто укажите свой секрет, и ваши стручки и волшебство произойдут;)

Тем не менее, проблема с предустановленными объектами все еще существует. В документации указано, что это желаемое поведение:

На практике это означает, что если вы создаете ресурсы в ловушке, вы не можете полагаться на helm delete для удаления ресурсов. Чтобы уничтожить такие ресурсы, вам нужно либо написать код для выполнения этой операции в ловушке до или после удаления, либо добавить аннотацию "helm.sh/hook-delete-policy" в файл шаблона ловушки.

Единственное решение - добавить задание на диаграмму с помощью ловушки post-delete, которая удаляет эти ресурсы.

person Ignacio Millán    schedule 30.05.2018
comment
Значит, для удаления задания необходимо использовать команду kubectl delete secret {{name}}? - person Dheeraj Joshi; 30.05.2018
comment
Да! Вы можете использовать любой общедоступный образ с kubectl, например hub.docker.com/r/lachlanevenson/ k8s-kubectl. Не забудьте убедиться, что у задания есть разрешения на удаление этого секрета. - person Ignacio Millán; 30.05.2018
comment
Я обновил штурвал ресурса, но это не удалось из-за no configmap with the name "" found. После того, как я снова запустил обновление Helm, все прошло успешно. helm upgrade также соблюдает этот приказ? - person Andy Aldo; 27.04.2019

Вы можете использовать любое изображение с установленным kubectl, чтобы удалить его с помощью хука предварительного удаления, например, @ ignacio-millán. Для этого вам также понадобится роль для запуска этого задания с привилегиями, чтобы оно могло удалять секреты.

Или вы можете просто использовать REST API K8s и скрутить его так:

apiVersion: batch/v1
kind: Job
metadata:
  labels:
  annotations:
    "helm.sh/hook": pre-delete # << run before delete (we still need the role)
...
spec:
  template:
    spec:
      serviceAccountName: your-privileged-serviceaccount
      automountServiceAccountToken: true 
    # this will mount var/run/secrets/kubernetes.io/serviceaccount/token
    containers:
        - name: pre-delete
          image: "appropriate/curl" # alpine + curl (3 MB)
          env:
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          command: 
            - "/bin/sh"
            - "-ec"
            - |
              curl -s -X DELETE -k https://kubernetes.default.svc/api/v1/namespaces/${NAMESPACE}/secrets/your-secret-name-nere \
                -H "Authorization: Bearer $( cat /var/run/secrets/kubernetes.io/serviceaccount/token )" \
                -H "Content-Type: application/json" \
                -H "Accept: application/json" \
                -d "{ \"kind\": \"Secret\", \"apiVersion\": \"v1\", \"metadata\": { \"name\": \"your-secret-name-nere\", \"namespace\": \"${NAMESPACE}\" } }"  > /dev/null
{{- end }}

Нам нужно «RoleBind» ServiceAccount с ролью (или clusterRole). Используйте helm.sh/hook-weight для заказа всего этого. у роли должно быть что-то вроде этого:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role # Roles works only in namespace vs ClusterRole works in all the cluster (warning!)
metadata:
   namespace: {{ .Release.Namespace }}
  annotations:
    "helm.sh/hook": pre-install
    "helm.sh/hook-weight": "20"
    "helm.sh/hook-delete-policy": before-hook-creation
  labels:
     ....
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list", "create", "update"]

Обратите внимание, что мы пересылаем вывод curl в null с помощью> / dev / null, мы не хотим, чтобы это было в журналах. ;) прокомментируйте это и "helm.sh/hook-delete-policy" для отладки.

Здесь ведется работа, и здесь применяется что-то вроде этого:

https://github.com/Flag5/consul-helm/tree/tls-encryption/templates см. файлы tls - *. yaml.

Надеюсь, это поможет :)

person NicoKowe    schedule 02.08.2019

Вы можете добавить эту строку.

"helm.sh/hook-delete-policy": "hook-succeeded"
person Darshil Shah    schedule 14.11.2019