Restart pods podczas aktualizacji configmap w Kubernetes?

Jak Automatycznie uruchomić ponownie Pody i Pody Kubernetes związane z wdrożeniami, gdy ich configmap jest zmieniany / aktualizowany?


Wiem, że mówiono o możliwości automatycznego restartu pods, gdy zmieni się konfiguracja map, ale z mojej wiedzy nie jest to jeszcze dostępne w Kubernetes 1.2.

Więc co (myślę) chciałbym zrobić jest "rolling restart" wdrożenia zasobów związanych z pods zużywających mapę config. Czy to możliwe, a jeśli tak, to w jaki sposób wymusić toczący się restart wdrożenia w Kubernetes bez zmiany czegokolwiek w rzeczywistym szablonie? Czy jest to obecnie najlepszy sposób, aby to zrobić, czy istnieje lepsza opcja?

Author: Highway of Life, 2016-05-19

8 answers

Sygnalizacja pod przy aktualizacji Mapy config jest funkcją w pracy ( https://github.com/kubernetes/kubernetes/issues/22368).

Zawsze możesz napisać niestandardowy pid1, który zauważy, że konfiguracja się zmieniła i uruchomi ponownie aplikację.

Możesz także np: zamontować tę samą mapę config w 2 kontenerach, wystawić http health check w drugim kontenerze, który nie powiedzie się, jeśli zmieni się hash zawartości config map, i wsadzić to jako sondę żywotności pierwszego kontenera (ponieważ kontenery w pod mają tę samą przestrzeń nazw sieci). Kubelet uruchomi twój pierwszy pojemnik, gdy sonda zawiedzie.

Oczywiście, jeśli nie zależy ci na tym, na których węzłach znajdują się strąki, możesz je po prostu usunąć, a kontroler replikacji uruchomi je ponownie za Ciebie.

 66
Author: Prashanth B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 18:27:55

Obecnie najlepsze rozwiązanie tego problemu (odwołuje się głęboko w https://github.com/kubernetes/kubernetes/issues/22368 linked in the sibling answer) is to use Deployments, and consider your ConfigMaps to be immutable.

Jeśli chcesz zmienić konfigurację, Utwórz nową Configmapę ze zmianami, które chcesz wprowadzić, i skieruj wdrożenie na nową Configmapę. Jeśli nowa konfiguracja zostanie złamana, wdrożenie odmówi skalowania działającego zestawu replik. Jeśli nowa konfiguracja działa, wtedy twój stary zestaw replik zostanie skalowany do 0 replik i usunięty, a nowe pods zostaną uruchomione z nowym config.

Nie tak szybko jak edytowanie ConfigMap w miejscu, ale znacznie bezpieczniej.

 143
Author: Symmetric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-16 04:20:14

Najlepszy sposób jaki znalazłem to uruchomić Reloader

Pozwala zdefiniować configmapy lub tajemnice do obejrzenia, gdy zostaną zaktualizowane, wykonywana jest rolling update twojego wdrożenia. Oto przykład:

Masz deployment foo i ConfigMap o nazwie foo-configmap. Za każdym razem, gdy configmap jest zmieniany, należy przetoczyć strąki wdrożenia. Musisz uruchomić Reloader z:

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

Następnie określ tę adnotację w swoim wdrożeniu:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...
 44
Author: George Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-11 13:32:08

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

Często configmapy lub tajemnice są wstrzykiwane jako pliki konfiguracyjne w kontenerach. W zależności od aplikacji może być wymagane ponowne uruchomienie, jeśli zostaną one zaktualizowane za pomocą kolejnej helm upgrade, ale jeśli sama Specyfikacja wdrożenia nie zmieniła, aplikacja będzie działać ze starą konfiguracją, co spowoduje niespójne rozmieszczenie.

Funkcja sha256sum może być używana razem z funkcją include, Aby upewnić się, że sekcja szablonu wdrożeń jest aktualizowana, jeśli zmieni się inna specyfikacja:

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

W moim przypadku z jakichś powodów $.Template.BasePath nie zadziałało, ale $.Chart.Name działa:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}
 37
Author: quanta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-27 12:03:41

Można zaktualizować adnotację metadanych, która nie jest istotna dla wdrożenia. to uruchomi rolling-update

Na przykład:

    spec:
      template:
        metadata:
          annotations:
            configmap-version: 1
 11
Author: Maoz Zadok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-29 21:24:33

Wystąpił problem, w którym wdrożenie znajdowało się na pod-wykresie, a kontrolujące go wartości znajdowały się w pliku wartości wykresu nadrzędnego. To jest to, czego użyliśmy do uruchomienia restartu:

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

Oczywiście spowoduje to restart przy każdej zmianie wartości, ale to działa na naszą sytuację. To, co pierwotnie było na wykresie potomnym, będzie działać tylko wtedy, gdy config.yaml w samej karcie dziecka zmienił się:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
 3
Author: Bryji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-13 20:17:49

Przez jakiś czas też waliłem głową w ten problem i chciałem rozwiązać go w elegancki, ale szybki sposób.

Oto moje 20 centów :

Rozwiązanie

Robię to w jednym z operatorów Kubernetes, gdzie w jednej pętli uzgadniania wykonywane jest tylko jedno zadanie.

  • Oblicz hash danych mapy konfiguracji. Say it comes as v2.
  • Utwórz ConfigMap cm-v2 z etykietami: version: v2 i product: prime Jeśli nie istnieje i zwróć. Jeśli istnieje, przejdź poniżej.
  • Znajdź wszystkie wdrożenia, które mają etykietę product: prime, ale nie mają version: v2, jeśli takie wdrożenia zostaną znalezione, usuń je i zwróć. JESZCZE NIŻEJ.
  • Usuń wszystkie Configmapy, które mają etykietę product: prime, ale nie mają version: v2.
  • Utwórz Deployment deployment-v2 z etykietami product: prime i version: v2 i mając dołączoną mapę config jako cm-v2 I RETURN, w przeciwnym razie nic nie rób.

To jest to! Wygląda na długi, ale może to być najszybsza implementacja i jest w zasadzie traktowaniem infrastruktury jako bydła {[22]]} (niezmienność).

Powyższe rozwiązanie działa również wtedy, gdy wdrożenie Kubernetes zawiera strategię aktualizacji Recreate. Logika może wymagać niewielkich poprawek w innych scenariuszach.

 0
Author: Alok Kumar Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-29 19:51:00

Innym sposobem jest umieszczenie go w sekcji poleceń rozmieszczenia:

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

Alternatywnie, aby uczynić go bardziej podobnym do ConfigMap, użyj dodatkowego wdrożenia, które będzie hostować tę konfigurację w sekcji command i wykonaj na niej kubectl create, dodając unikalną 'wersję' do jej nazwy (jak obliczanie skrótu zawartości) i modyfikując wszystkie wdrożenia, które używają tej konfiguracji:

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

Prawdopodobnie napiszę kubectl-apply-config.sh jeśli to się skończy.

(nie rób tego; wygląda też bad)

 -1
Author: Velkan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 12:47:46