docker swarm - Обновление/откат конфигов и секретов

Thank you for reading this post, don't forget to subscribe!

Есть несколь­ко вари­ан­тов обнов­ле­ния кон­фи­гов в docker swarm. Рас­смот­рим про­стой стек где будет запу­щен nginx

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

 

=============================================================================

Все вари­ан­ты осно­ва­ны на изме­не­нии име­ни конфига

 

1, 2 и 3 вари­ан­ты осо­бо не отличаются:
1 вари­ант - мы пра­вим имя в стеке
configs:

- source: nginx_config2                                  #Наш кон­фиг кото­рый мы будем обновлять

target: /etc/nginx/conf.d/new.conf        #Путь куда необ­хо­ди­мо дан­ный кон­фиг положить

И

configs:                                                                # здесь опи­сы­ва­ем наш конфиг

nginx_config2:                                                    # название

file: /root/docker-nginx/new.conf              # путь до конфига

 

После чего зано­во деп­ло­им стек:

docker stack deploy -c nginx-stack.yml nginx
2 вари­ант мы пред­ва­ри­тель­но созда­ём конфиг:
docker config create nginx_config2 new.conf
Пра­вим имя в стеке:

configs:

- source: nginx_config2                                  #Наш кон­фиг кото­рый мы будем обновлять

target: /etc/nginx/conf.d/new.conf        #Путь куда необ­хо­ди­мо дан­ный кон­фиг положить

И

configs:                                                                # здесь опи­сы­ва­ем наш конфиг

nginx_config2:                                                    # название

external: true                                                    # будет под­тя­ги­вать зара­нее создан­ный конфиг

 

После чего зано­во деп­ло­им стек:

docker stack deploy -c nginx-stack.yml nginx

 

3 вари­ант если мы исполь­зу­ем ci/cd то добав­ля­ем пере­мен­ную в наш стек:

 

Остав­ля­ем без изме­не­ний эту часть:

configs:

- source: nginx_config                                  #Наш кон­фиг кото­рый мы будем обновлять

target: /etc/nginx/conf.d/new.conf        #Путь куда необ­хо­ди­мо дан­ный кон­фиг положить

И вно­сим изме­не­ния сюда:
configs:                                                                # здесь опи­сы­ва­ем наш конфиг

nginx_config:                                                    # название

name: new.conf-${CI_JOB_ID}

file: /root/docker-nginx/new.conf               # путь до конфига

 

Недо­стат­ком исполь­зо­ва­ния номе­ра зада­ния явля­ет­ся то, что вы буде­те обнов­лять кон­фи­ги и сек­ре­ты и их зави­си­мые сер­ви­сы при каж­дом запус­ке задания

 

4 вари­ант обнов­ле­ние кон­фи­гов и сер­ви­сов без деп­лоя все­го стека.

Смот­рим как в систе­ме назы­ва­ют­ся конфиги(при деп­лое добав­ля­ет­ся имя стека)

docker config ls | grep nginx

9v608868r8ov6b9qlvpr0mz52   nginx_nginx_config   5 hours ago         5 hours ago

l1300aj6g60jlqpo0ze2qjx8h   nginx_nginx_config2   4 hours ago         4 hours ago

 

смот­рим какой кон­фиг исполь­зу­ет­ся сервисом:
docker service inspect nginx_test-nginx | grep -i configname

"ConfigName": "nginx_nginx_config2"

обнов­ля­ем сер­вис уда­ляя ста­рый кон­фиг и добав­ляя новый:

docker service update --config-rm nginx_nginx_config2 --config-add src=nginx_nginx_config3,target=new.conf nginx_test-nginx

target - ука­зы­ва­ет путь в файлу
nginx_test-nginx - имя сервиса.

=========================================================================================

Docker Secrets

Мы можем запу­стить коман­ду, что­бы создать Decker-«секрет»:

date |md5sum|awk '{print $1}' | docker secret create my_secret -

> qk4k9adgri6b3ubjua9nca5fp

Создан­ный «сек­рет» назван my_secret.

При вво­де docker secret ls вы полу­ча­е­те инфор­ма­цию об используемых«секретах» :

> ID                                               NAME                CREATED              UPDATED

 

> qk4k9adgri6b3ubjua9nca5fp   my_secret           About a minute ago   About a minute ago

Qk4k9adgri6b3ubjua9nca5fp –

слу­чай­ный и уни­каль­ный иден­ти­фи­ка­тор недав­но создан­но­го «сек­ре­та».

«Сек­рет» сохра­ня­ет­ся во вре­мен­ную фай­ло­вую систе­му (tmpfs) под /run/secrets/my_secret.

Tmpfs — вре­мен­ное хра­ни­ли­ще во мно­гих Unix-подоб­ных опе­ра­ци­он­ных систе­мах. Фай­лы хра­нят­ся в энер­го­за­ви­си­мой памя­ти вме­сто внеш­не­го устрой­ства хра­не­ния данных.

Нач­нем с созда­ния «сек­ре­та»:

date |md5sum|awk '{print $1}' | docker secret create my_new_secret -

После это­го ста­рый «сек­рет» дол­жен быть уда­лен и заме­нен. Все это дела­ет­ся одной командой:

docker service update --secret-rm my_secret --secret-add source=my_new_secret,target=my_secret my_test_app

========================================================================================

ROLLBACK
Откат обра­за, конфига.

Рас­смот­рим настрой­ку сте­ка когда необ­хо­дим откат кон­фи­га (обра­за) в слу­чае некор­рект­но­го апдей­та, отме­тим, что вер­сия долж­на быть 3,7 так как рол бек добав­лен в ней: version: '3.7'
Ниже предо­став­лен стек для примера
[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

 

Под­тя­ги­ва­е­мый конфиг:
cat new.conf

Запус­ка­ем:
docker stack deploy -c nginx-stack.yml nginx

Про­ве­ря­ем

docker service ps nginx_test-nginx

Для это­го же сте­ка меня­ем образ с nginx на httpd (соот­вет­ствен­но healthcheck не смо­жет нор­маль­но про­ве­рить ста­тус nginx и будет воз­вра­щать ошибку)
cat nginx-stack.yml | grep image

image: httpd

Апдей­тим:
docker stack deploy -c nginx-stack.yml nginx

Про­ве­ря­ем:
docker service ps nginx_test-nginx

Как мы видим, на одной из реплик образ попы­тал­ся запу­стить­ся, хел­счек не про­шёл и образ вер­нул­ся на nginx, такой про­цесс про­шёл толь­ко на одной репли­ке пото­му что мы ука­за­ли в update_config:  parallelism: 1

Вер­нём пра­виль­ный образ на nginx и испор­тим кон­фиг файл nginx что­бы он не смог запуститься:

cat nginx-stack.yml | grep -E 'conf|image' | grep -vE 'update_|rollback_'

image: nginx

configs:

- source: nginx_config2

target: /etc/nginx/conf.d/new.conf

configs:

nginx_config2:

file: /root/docker-nginx/fail.conf

В кон­фи­ге nginx мы убра­ли закры­ва­ю­щу­ю­ся скобку:
cat fail.conf

Запус­ка­ем апдейт:
docker stack deploy -c nginx-stack.yml nginx

Creating config nginx_nginx_config2

Updating service nginx_test-nginx (id: 4u7fvnd65mkg0hmvwqw5rrf2a)

Про­ве­ря­ем:
docker service ps nginx_test-nginx

 

Как видим, кон­тей­нер попы­тал­ся про апдей­тить­ся но не вышло и он отка­тил ста­рый кон­фиг, осталь­ные кон­тей­не­ры так же не были затро­ну­ты  пото­му, что мы ука­за­ли в update_config:  parallelism: 1