Перезапускать модули при обновлении карты конфигурации в Kubernetes?


121

Как мне автоматически перезапустить модули Kubernetes и модули, связанные с развертываниями, когда их конфигурационная карта изменяется / обновляется?


Я знаю, что были разговоры о возможности автоматического перезапуска модулей при изменении карты конфигурации, но, насколько мне известно, это еще не доступно в Kubernetes 1.2.

Итак, что (я думаю) я хотел бы сделать, это «скользящий перезапуск» ресурса развертывания, связанного с модулями, использующими карту конфигурации. Возможно ли, и если да, то как принудительно выполнить непрерывный перезапуск развертывания в Kubernetes без изменения чего-либо в фактическом шаблоне? На данный момент это лучший способ сделать это или есть лучший вариант?


$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...сделай работу за меня
Maciek

Ответы:


60

Сигнализация модуля об обновлении карты конфигурации - это функция, которая находится в разработке ( https://github.com/kubernetes/kubernetes/issues/22368 ).

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

Вы также можете, например, смонтировать одну и ту же карту конфигурации в 2 контейнерах, выставить проверку работоспособности http во втором контейнере, которая завершится ошибкой, если хэш содержимого карты конфигурации изменится, и засунуть ее в качестве проверки жизнеспособности первого контейнера (поскольку контейнеры в pod совместно используют одно и то же сетевое пространство имен). Кубелет перезапустит ваш первый контейнер для вас, когда зонд выйдет из строя.

Конечно, если вас не волнует, на каких узлах находятся модули, вы можете просто удалить их, и контроллер репликации «перезапустит» их за вас.


Под «удалением модулей» вы имеете в виду: сбор всех имен модулей, удаление одного, ожидание замены, удаление второго, ожидание замены и т. Д. Верно?
Торстен Бронгер

6
используя развертывание, я бы уменьшил его, а затем увеличил. Тем не менее, у вас все равно будет небольшое количество простоев. Вы можете сделать это в одну строчку, чтобы уменьшить это ... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Ник Х

Если вы не хотите находить все модули и не заботитесь о простоях, просто удалите RC, а затем заново создайте RC.
Дрю

1
Означает ли это, что том, на котором он установлен, обновлен, и вам просто нужно перечитать файл в модуле без перезапуска всего модуля?
Мэтт Уильямсон

@NickH Быстро и грязно, к счастью, в моем случае простои были приемлемыми, и это отлично сработало, спасибо!
ChocolateAndCheese

129

Текущее лучшее решение этой проблемы (указанное глубоко в https://github.com/kubernetes/kubernetes/issues/22368, указанном в ответе на то же самое) - использовать Deployments и считать ваши ConfigMaps неизменными.

Если вы хотите изменить свою конфигурацию, создайте новую ConfigMap с изменениями, которые вы хотите внести, и укажите свое развертывание на новой ConfigMap. Если новая конфигурация не работает, Deployment откажется от масштабирования вашего рабочего ReplicaSet. Если новая конфигурация работает, тогда ваш старый ReplicaSet будет масштабирован до 0 реплик и удален, а новые поды будут запущены с новой конфигурацией.

Не так быстро, как просто редактировать ConfigMap на месте, но намного безопаснее.


2
Это тот же подход, который мы использовали
Йохан

5
Стоит упомянуть, что новый экспериментальный инструмент kustomizeподдерживает автоматическое создание детерминированного хэша configmap, что означает, что вам не нужно вручную создавать новую configmap: github.com/kubernetes-sigs/kustomize/blob/…
Symmetric

Это то, что Spinnaker делает за кулисами, поэтому, если вы его используете, вам не придется об этом беспокоиться.
Гас

32

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

Часто файлы конфигурации или секреты вводятся в виде файлов конфигурации в контейнерах. В зависимости от приложения может потребоваться перезапуск, если они будут обновлены с последующим helm upgrade, но если сама спецификация развертывания не изменилась, приложение продолжит работу со старой конфигурацией, что приведет к несогласованному развертыванию.

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

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

В моем случае по некоторым причинам $.Template.BasePathне сработало, но $.Chart.Nameработает:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}

8
Не применимо к общему использованию Kubernetes, применимо только к Helm
Emii Khaos

2
Ответ полезен, но, вероятно, не имеет отношения к этому вопросу
Ананд Сингх Кунвар

helm3 был выпущен недавно. Таким образом, ссылка устарела. Он указывает на masterветку. Следующий URL-адрес ведет к (в настоящее время) helm
Марсель Хойер,

Классный раствор. Я изменил на sha1sum, так как в моем случае sha256sum имел 65 символов, что привело к Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters. Альтернатива была бы | trunc 63, но sha1sum должен быть "более уникальным".
iptizer

32

Лучший способ, который я нашел, - запустить Reloader.

Он позволяет вам определять карты конфигурации или секреты, за которыми нужно следить, когда они обновляются, выполняется скользящее обновление вашего развертывания. Вот пример:

У вас есть развертывание fooи вызывается ConfigMap foo-configmap. Вы хотите сворачивать модули развертывания каждый раз, когда изменяется карта конфигурации. Вам нужно запустить Reloader с:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

Затем укажите эту аннотацию в своем развертывании:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...

Reloader совместим с kubernetes> = 1.9
jacktrade

11

Вы можете обновить метку метаданных, которая не имеет отношения к вашему развертыванию. это вызовет скользящее обновление

например:

metadata:
  labels:
    configmap-version: 1

Я ищу документы о метаданных: label: configmap-version: 1
c4f4t0r

7
изменения метаданных метаданных не приводят к перезапуску модулей,
дан картер,

У этого ответа есть апвоты, поэтому мне нужно спросить. Если мы обновим метаданные, запустит ли кластер Kubernetes последовательное обновление? @ maoz-zadok
titus

1
Я считаю, что это работает, пока метка метаданных находится подtemplate.spec
Сайкиран Йеррам

1

Была эта проблема, когда развертывание находилось на дополнительной диаграмме, а значения, управляющие им, были в файле значений родительской диаграммы. Вот что мы использовали для запуска перезапуска:

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

Очевидно, это вызовет перезапуск при любом изменении значения, но в нашей ситуации это работает. То, что изначально было в дочерней диаграмме, будет работать только в случае изменения config.yaml в самой дочерней диаграмме:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}

0

Я делаю решение квантов, и оно работает отлично. Но я не понимаю, что модуль на самом деле не перезагружается ... Модуль все тот же, но есть изменения!

Например: Pod работает с 50 минут, и я что-то меняю, и изменения в сети. Я вижу это в своем браузере, а модуль все еще работает + 50 минут !! Я использую Helm3 ... Вы знаете, что делает это возможным без перезапуска обновления configmap?


1
Хорошо! Я выяснил ... Потому что мы смонтировали нашу конфигурационную карту как том и обновили динамически ... Вот почему, когда я делаю эту «контрольную сумму», мой модуль не перезагружается, но изменения есть! Я предлагаю как хорошее решение :)
Ибрагим Ешилай

-1

Другой способ - вставить его в раздел команд развертывания:

...
command: [ "echo", "
  option = value\n
  other_option = value\n
" ]
...

В качестве альтернативы, чтобы сделать его более похожим на ConfigMap, используйте дополнительное развертывание, которое просто разместит эту конфигурацию в commandразделе и выполнит kubectl createее, добавляя уникальную `` версию '' к ее имени (например, вычисляя хэш содержимого) и изменяя все развертывания, использующие эту конфигурацию:

...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
  option = value\n
  other_option = value\n
" ]
...

Я, наверное, опубликую, kubectl-apply-config.shесли это сработает.

(не делай этого, это выглядит очень плохо)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.