Назад | Перейти на главную страницу

Kubernetes: как развернуть новую версию контейнера через Deployment с сохранением монтирования хранилища?

Я запускаю небольшой кластер Kubernetes в Azure, поэтому могу использовать абстракты, предоставленные Azure (например, хранилище и т. Д.).

На нем у меня есть объект развертывания, определенный в файле, который включает в себя один модуль и несколько контейнеров в нем: контейнер приложения, контейнер mongodb и некоторые другие. Приложение 1 запускается из своего образа, который также включает в себя весь двоичный файл, поэтому для него требуется только база данных mongo (во втором cntainer). MongoDB хранит свои данные на постоянном томе.

Теперь представим, что мне нужно изменить изображение для контейнера приложения. Я меняю файл определения развертывания и делаю kubectl apply -f deplyment.yml, и я вижу, как Kubernetes пытаются реализовать это изменение.

Но проблема в том, что он пытается запустить новый модуль вместо старого и изящно перенаправить на него загрузку, но новый модуль не запускается, так как тома монтируются в старом модуле, и он не может смонтировать его, пока старый контейнер не выйдет из строя.

Так вот в чем проблема. Не могу понять, как делать такие апгрейды без перебоев. Приложение не может быть сбалансировано по нагрузке, поэтому нет возможности запускать несколько копий и обновлять их по одной. И я также боюсь, что если я удалю развертывание (которое попытается эффективно удалить все, к чему подключено), то тома также могут быть удалены.

Есть ли хороший подход?

Отделите вашу базу данных от вашего приложения.

Контейнеры приложений получают собственное развертывание, и им не требуется постоянное хранилище. Теперь вы можете обновить и реплицировать это развертывание.

Другое развертывание (или StatefulSet) содержит mongoDB. Это действительно использует хранилище. Но вам очень редко нужно обновлять mongodb, поэтому прерывания будут редкими.