Перезапустити стручки під час оновлення конфігурації в 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/isissue/22368 ).

Ви завжди можете написати користувальницький pid1, який помітить, що конфінамент змінився та перезапустить додаток.

Ви також можете: монтувати ту саму карту конфігурації у 2 контейнерах, піддавати http перевірку стану здоров'я у другому контейнері, що не вдалося змінити хеш вмісту конфігураційної карти, і перемістити це як зонд проживання першого контейнера (тому що контейнери в струк спільного простору імен мережі). Kubelet перезапустить ваш перший контейнер для вас, коли датчик вийде з ладу.

Звичайно, якщо вам не байдуже, на яких вузлах включені стручки, ви можете просто їх видалити, і контролер реплікації "перезапустить" їх для вас.


Під "видаленням стручків" ви маєте на увазі: зібрати всі назви стручків, видалити одне, дочекатися заміни, видалити друге, дочекатися заміни тощо. Правильно?
Торстен Бронгер

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

Якщо ви не хочете знайти всі стручки та не турбуєтесь про час простою - просто видаліть RC та знову створіть RC.
Дрю

1
Чи означає це, що гучність, на яку він встановлений, оновлюється, і вам просто потрібно перечитати файл на стручку, не перезавантажуючи весь струк?
Метт Вільямсон

@ NickH Швидкий і брудний, на щастя, простой був прийнятним у моєму випадку, і це спрацювало чудово, дякую!
ChocolateAndCeese

129

Найкращим поточним рішенням цієї проблеми (на яке посилається https://github.com/kubernetes/kubernetes/isissue/22368, пов’язаний у відповіді щодо брата) є використання розгортання та вважати ваші ConfigMaps незмінними.

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

Не так швидко, як просто редагування ConfigMap на місці, але набагато безпечніше.


2
Такий підхід ми також застосували
Йохан

5
Варто зазначити, що новий експериментальний інструмент kustomizeпідтримує автоматичне створення хеша детермінованої конфігурації, тобто не потрібно вручну створювати нову конфігураційну карту: github.com/kubernetes-sigs/kustomize/blob/…
Symmetric

Це те, що робить Spinnaker за лаштунками, так що якщо ви його використовуєте, вам не доведеться турбуватися про це.
Гас

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
...

Перевантажувач сумісний з кубернетами> = 1,9
джектрейд

31

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
Не застосовується до загального використання Кубернетів, стосується лише Хельм
Емі Хаос

2
Відповідь корисна, але, мабуть, не стосується цього питання
Ананд Сінгх Кунвар

helm3 вийшов нещодавно. Таким чином, посилання застаріло. Це вказує на masterгілку. Наступна URL-адреса призведе до (наразі) останніх helm2 документів: github.com/helm/helm/blob/release-2.16/docs/…
Marcel Hoyer

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

11

Ви можете оновити мітку метаданих, яка не стосується вашого розгортання. це запустить прокатне оновлення

наприклад:

metadata:
  labels:
    configmap-version: 1

Я шукаю документи про метадані: labels: configmap-version: 1
c4f4t0r

7
Зміни етикетки метаданих не викликають перезавантаження
дан

Ця відповідь підкреслює, тому мені потрібно запитати. Якщо ми оновимо метадані, чи спровокує кластер Kubernetes поступове оновлення? @ Maoz-Садок
Тит

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 ... Чи знаєте ви, що робить це можливим без перезавантаження оновлення конфігураційної карти?


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.