Деплой сервиса на docker без downtime
Всем привет. У меня есть сервис на php, в качестве окружения используются два docker-контейнера (c php-fpm и nginx). Мне необходимо организовать деплой на единственный хост, и при этом не должно быть downtime. Здесь https://medium.com/better-programming/zero-downtime-deployment-with-docker-swarm-d84d8d9d9a14 например описано как сделать такой деплой через docker swarm, но в примерах указано несколько хостов как я понимаю, мне же нужно это сделать только на одном хосте. Как это сделать проще всего?
Ответы (2 шт):
К сожалению при использовании голого Docker практически невозможно обновлять контейнеры без downtime. Вы можете использовать, например, kubernetes single node. При настройке deployment в k8s необходимо указать:
...
spec:
replicas: 1
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
...
Главное в репликах указать не больше 1. В этом случае контейнеры не будут удалены, пока новые контейнеры не поднимутся.
Обновление контейнеров можно выполнять этой командой (если, например, таг контейнера не меняется, но меняется сам контейнер):
kubectl rollout restart deploy my_deploy
Так же подробнее можете прочитать в документации kubernetes.
К сожалению сделать сервис доступный всегда невозможно.
Хотя бы потому, что сеть до сервиса не доступна всегда.
Поэтому, если нужна надежность, перепосылать запросы должен клиент, а сервис обеспечивать идемпотентность.
kubernetes -- хороший конструктор, но сложный, и его применение влечет за собой как дополнительные затраты ресурсов, так и усложнение операций (обслуживания) системы.
Как вариант, можно разделить систему на части, которые деплоятся часто и редко. Например nginx можно деплоить редко, и он всегда сможет отдать статику, а сервис с логикой часто, но это будет не сильно заметно, т. к. клиент сделает перепосылку.
Еще можно сделать простой сервис, который кладет запрос в очередь (message broker), a основной сервис берет сообщения из очереди, когда будет готов.
Вообще сервис на php обычно не должен иметь существенный downtime.