По умолчанию Kubernetes не перезапускает Deployment автоматически, если меняется ConfigMap. В итоге поды могут продолжать работать со старыми настройками, пока администратор вручную не сделает kubectl rollout restart
. К счастью, есть проверенные практики.
Почему так происходит
ConfigMap монтируется в поды как файлы или переменные окружения, но контроллер Deployment не отслеживает изменения содержимого ConfigMap. Поэтому изменений «на лету» не происходит.
Решение
Хэш-аннотации: добавить хэш от ConfigMap в аннотацию pod template в Deployment Example in Helm:
annotations:
configmap-hash: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
Изменение ConfigMap меняет аннотацию → Deployment пересоздаёт поды.
В качестве альтернативы можно использовать специальные контролеры для рестарта деплоймента. Например этот - Reloader. Но этот способ также требует добавления анотаций в Deployment или Statefulset, чтобы рестарт происходил автоматически. Минус этого способа что нужно разворачивать дополнительный компонент в кластере.
Вывод
Наиболее распространённый и гибкий способ — использовать аннотации с хэшем ConfigMap. Тогда любое изменение автоматически вызывает новый rollout, и поды запускаются уже с актуальной конфигурацией.