Как мне автоматически перезапустить модули Kubernetes и модули, связанные с развертываниями, когда их конфигурационная карта изменяется / обновляется?
Я знаю, что были разговоры о возможности автоматического перезапуска модулей при изменении карты конфигурации, но, насколько мне известно, это еще не доступно в Kubernetes 1.2.
Итак, что (я думаю) я хотел бы сделать, это «скользящий перезапуск» ресурса развертывания, связанного с модулями, использующими карту конфигурации. Возможно ли, и если да, то как принудительно выполнить непрерывный перезапуск развертывания в Kubernetes без изменения чего-либо в фактическом шаблоне? На данный момент это лучший способ сделать это или есть лучший вариант?
$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...
сделай работу за меняОтветы:
Сигнализация модуля об обновлении карты конфигурации - это функция, которая находится в разработке ( https://github.com/kubernetes/kubernetes/issues/22368 ).
Вы всегда можете написать собственный pid1, который замечает, что конфигурационная карта изменилась, и перезапускает ваше приложение.
Вы также можете, например, смонтировать одну и ту же карту конфигурации в 2 контейнерах, выставить проверку работоспособности http во втором контейнере, которая завершится ошибкой, если хэш содержимого карты конфигурации изменится, и засунуть ее в качестве проверки жизнеспособности первого контейнера (поскольку контейнеры в pod совместно используют одно и то же сетевое пространство имен). Кубелет перезапустит ваш первый контейнер для вас, когда зонд выйдет из строя.
Конечно, если вас не волнует, на каких узлах находятся модули, вы можете просто удалить их, и контроллер репликации «перезапустит» их за вас.
источник
kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Текущее лучшее решение этой проблемы (указанное глубоко в https://github.com/kubernetes/kubernetes/issues/22368, указанном в ответе на то же самое) - использовать Deployments и считать ваши ConfigMaps неизменными.
Если вы хотите изменить свою конфигурацию, создайте новую ConfigMap с изменениями, которые вы хотите внести, и укажите свое развертывание на новой ConfigMap. Если новая конфигурация не работает, Deployment откажется от масштабирования вашего рабочего ReplicaSet. Если новая конфигурация работает, тогда ваш старый ReplicaSet будет масштабирован до 0 реплик и удален, а новые поды будут запущены с новой конфигурацией.
Не так быстро, как просто редактировать ConfigMap на месте, но намного безопаснее.
источник
kustomize
поддерживает автоматическое создание детерминированного хэша configmap, что означает, что вам не нужно вручную создавать новую configmap: github.com/kubernetes-sigs/kustomize/blob/…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
функцией , чтобы обеспечить развертывание шаблона раздел обновляется , если другая спецификация изменения:В моем случае по некоторым причинам
$.Template.BasePath
не сработало, но$.Chart.Name
работает:источник
helm
3 был выпущен недавно. Таким образом, ссылка устарела. Он указывает наmaster
ветку. Следующий URL-адрес ведет к (в настоящее время)helm
Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters
. Альтернатива была бы| trunc 63
, но sha1sum должен быть "более уникальным".Лучший способ, который я нашел, - запустить Reloader.
Он позволяет вам определять карты конфигурации или секреты, за которыми нужно следить, когда они обновляются, выполняется скользящее обновление вашего развертывания. Вот пример:
У вас есть развертывание
foo
и вызывается ConfigMapfoo-configmap
. Вы хотите сворачивать модули развертывания каждый раз, когда изменяется карта конфигурации. Вам нужно запустить Reloader с:Затем укажите эту аннотацию в своем развертывании:
источник
Вы можете обновить метку метаданных, которая не имеет отношения к вашему развертыванию. это вызовет скользящее обновление
например:
источник
template.spec
Была эта проблема, когда развертывание находилось на дополнительной диаграмме, а значения, управляющие им, были в файле значений родительской диаграммы. Вот что мы использовали для запуска перезапуска:
Очевидно, это вызовет перезапуск при любом изменении значения, но в нашей ситуации это работает. То, что изначально было в дочерней диаграмме, будет работать только в случае изменения config.yaml в самой дочерней диаграмме:
источник
Я делаю решение квантов, и оно работает отлично. Но я не понимаю, что модуль на самом деле не перезагружается ... Модуль все тот же, но есть изменения!
Например: Pod работает с 50 минут, и я что-то меняю, и изменения в сети. Я вижу это в своем браузере, а модуль все еще работает + 50 минут !! Я использую Helm3 ... Вы знаете, что делает это возможным без перезапуска обновления configmap?
источник
Другой способ - вставить его в раздел команд развертывания:
В качестве альтернативы, чтобы сделать его более похожим на ConfigMap, используйте дополнительное развертывание, которое просто разместит эту конфигурацию в
command
разделе и выполнитkubectl create
ее, добавляя уникальную `` версию '' к ее имени (например, вычисляя хэш содержимого) и изменяя все развертывания, использующие эту конфигурацию:Я, наверное, опубликую,
kubectl-apply-config.sh
если это сработает.(не делай этого, это выглядит очень плохо)
источник