При обновлении helm выполняется задание после установки, даже если обновление файла values.yaml отсутствует? - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть сценарии, которые подключены к общему постоянному тому. Частью основной диаграммы развертывания является запуск некоторых bash сценариев в initContainers, которые клонируют хранилище сценариев и копируют / монтируют его на общий постоянный том. Моя проблема в том, что в основном приложении не будет никаких изменений или обновления файла values.yaml, поэтому обновление шлема на самом деле не произойдет. Я думаю, что это нормально, но я хочу выполнить задачу, которая все равно будет клонировать репозиторий сценариев и скопировать / смонтировать его на постоянный том.

Я читаю о k8s Job (пост-установочный хук), но я не уверен, что это выполнит sh то, что мне нужно.

1 Ответ

1 голос
/ 21 февраля 2020

Поскольку вы не изменили ничего на стороне HELM, например, значения или спецификации / шаблоны, HELM не будет выполнять никаких изменений. В этом случае ваш код является внешним источником и выглядит с точки зрения HELM, это правильно.

Я могу предложить несколько альтернатив для достижения того, что вы хотите:

  1. Используйте HELM с Флаг FORCE Используйте helm upgrade --force для обновления своего развертывания. Хелм документы :

    - принудительно - принудительное обновление ресурсов с помощью стратегии замены

В этом case Helm воссоздаст все ресурсы вашей диаграммы, следовательно, стручки, а затем повторно запустит initContainers, снова выполняя ваш скрипт.

Использование Kubernetes CronJob В этом случае вы создадите модуль, который смонтирует ваш том и запустит необходимый скрипт / команду.

Пример Kubernetes CronJob :

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: nice-count
spec:
  schedule: "*/2 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: nice-job
            image: alpine
            command: ['sh', '-c', 'echo "HelloWorld" > /usr/share/nginx/html/index.html']
            volumeMounts:
              - mountPath: "/usr/share/nginx/html"
                name: task-pv-storage
          volumes:
            - name: task-pv-storage
              persistentVolumeClaim:
                claimName: task-pv-claim
          restartPolicy: Never

В этом примере CronJob будет запускаться каждые 2 часа , монтировать том task-pv-storage в /usr/share/nginx/html и выполнять команду echo "HelloWorld" > /usr/share/nginx/html/index.html .

Вы должны вызвать CronJob, вручную создавая задание, с помощью команды:

kubectl create job --from=cronjob/<CRON_JOB_NAME> <JOB_NAME>

В приведенном выше примере команда выглядит следующим образом:

kubectl create job --from=cronjob/nice-count nice-count-job

Выполнить задание вручную или с помощью CI / CD Вы можете выполнить задание напрямую или, если у вас есть решение CI / CD, вы можете создать задание для однократного запуска вместо использования CronJob, в этом случае вы следует использовать этот шаблон:
apiVersion: batch/v1
kind: Job
metadata:
  name: nice-count-job
spec:
  template:
    spec:
      containers:
      - image: alpine
        name: my-job
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: task-pv-storage
        command:
        - sh
        - -c
        - echo "hello" > /usr/share/nginx/html/index.html
      restartPolicy: Never
      volumes:
      - name: task-pv-storage
        persistentVolumeClaim:
          claimName: task-pv-claim

Я протестировал этот пример и работает в обоих случаях.

Пожалуйста, дайте мне знать, если это помогло!

...