В kubernetes helm как заменить под с новыми значениями конфигурации

Я использую диаграммы управления для развертывания модулей с помощью «ConfigMap», управляющего конфигурациями.

Я редактирую ConfigMap напрямую, чтобы внести изменения в файлы конфигурации, а затем удаляю модули с помощью kubectl delete, чтобы новая конфигурация вступила в силу.

Есть ли простой способ с помощью helm заменить работающий модуль новой конфигурацией без выполнения команды «kubectl delete»


person user227321    schedule 30.05.2017    source источник


Ответы (4)


Мы обнаружили, что использование --recreate-pods немедленно завершает работу всех работающих модулей этого развертывания, что означает некоторое время простоя для вашей службы. Другими словами, непрерывного обновления ваших модулей не будет.

Проблема для решения этой проблемы в Helm все еще открыта: https://github.com/kubernetes/helm/issues/1702

Вместо этого helm предлагает добавить контрольную сумму ваших файлов конфигурации к развертыванию в аннотации. Таким образом, развертывание будет иметь другой хэш и, по сути, будет выглядеть «новым» для Helm, что приведет к правильному обновлению.

Функцию sha256sum можно использовать для обеспечения обновления раздела аннотации развертывания при изменении другого файла:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
[...]

Из документов здесь: https://helm.sh/docs/charts_tips_and_tricks/#automatically-roll-deployments-when-configmaps-or-secrets-change

person Oliver Nicolaas Ponder    schedule 12.06.2018
comment
Работает ли это для диаграмм Helm, хранящихся в репозиториях? Я думаю, что это нарушает предназначение репозиториев, все диаграммы придется вытаскивать локально. - person AFP_555; 18.10.2018
comment
Хм, не понимаю, что ты имеешь в виду. Если этот фрагмент кода находится в диаграмме управления, а эта диаграмма находится в репозитории, тогда она должна работать нормально. - person Oliver Nicolaas Ponder; 24.10.2018
comment
Это подойдет для репозитория кода, такого как Git. Но будет ли это работать для репозитория артефактов Helm, такого как S3, в котором файлы хранятся в формате mychart-0.1.0.tgz? - person AFP_555; 24.10.2018
comment
Насколько я знаю, разницы нет. Тиллер просматривает график и выводит то же самое. Если моя ментальная модель где-то не ошибочна, нет никакой разницы между диаграммой, хранящейся в git, и диаграммой, хранящейся где-то еще. - person Oliver Nicolaas Ponder; 26.10.2018
comment
Здесь не сработало. Я мог видеть новые метаданные аннотаций, описывая развертывание, но модули не были воссозданы. - person Eduardo; 07.09.2019

Если вам нужно непрерывное обновление вместо немедленного завершения модулей, добавьте

date: "{{ .Release.Time.Seconds }}"

в файл spec / template / metadata / labels.

Затем в выпуске будет изменение конфигурации, которое запускает скользящее обновление, если установлено как spec / stategy / type.

Если вы только что изменили ConfigMap или Secret, посмотрите https://helm.sh/docs/developing_charts/#automatically-roll-deployments-when-configmaps-or-secrets-change

person Dagger87    schedule 27.03.2019

Вы можете запустить

обновление руля --recreate-pods

сделать это.

person Oliver    schedule 30.05.2017
comment
Я бы не рекомендовал этот подход, если вам нужны развертывания с нулевым временем простоя. Флаг --recreate-pods немедленно завершает работу всех запущенных модулей развертывания. - person Oliver Nicolaas Ponder; 12.06.2018

Решение @Oliver у меня не сработало, потому что модули не были воссозданы путем обновления аннотаций развертывания.

Решение состоит в том, чтобы использовать имена динамических карт конфигурации на основе вашего файла values.yaml.

В values.yaml:

configVersion: # Change those numbers to force recreating pods
  myApp: 1

На вашей карте конфигурации:

metadata:
  name: {{ .Release.Name }}-my-config-v{{ .Values.configVersion.myApp}}

В вашем развертывании:

- configMapRef:
  name: {{ .Release.Name }}-my-config-v{{ .Values.configVersion.myApp}}
person Eduardo    schedule 07.09.2019
comment
Возможно, вы совершили ту же ошибку, что и я, я случайно поместил аннотацию к развертыванию (spec.metadata.annotations), и модули не были перезапущены. Они говорят вам поместить аннотации в шаблон (spec.template.metadata.annotations), и это сработало, когда я переместил аннотацию туда. - person Mumrah; 26.09.2019