У меня есть рабочий кластер с одним мастером Kubernetes с 14 рабочими узлами.
На 4 из этих узлов размещено веб-приложение, а на 10 - серверное приложение.
Из-за того, как продумана наша архитектура, мне иногда нужно было обновить только несколько узлов с использованием последнего образа, а остальные узлы оставить в старом образе развертывания еще на несколько часов. (это связано с тем, что с некоторыми обновлениями более новое веб-приложение не может взаимодействовать со старым серверным приложением, поэтому мне нужно разделить инфраструктуру, чтобы поддерживать некоторые узлы в старой версии, обновляя другие). Я потратил много часов на поиск варианта в документации, но, похоже, нет простого способа сделать это с помощью Kubernetes.
Для обновления приложений я сейчас использую скользящие обновления, настроенные в файлах yaml:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
Чтобы применить обновления, я в основном запускаю две команды:
kubectl apply -f webapp.yaml
kubectl apply -f backendapp.yaml
Все это работает хорошо, но становится настоящей проблемой для сценария, который я описал выше. У кого-нибудь есть предложение, путь, по которому я мог бы пойти?
Спасибо
Если вы хотите, чтобы как старая, так и новая версии приложения обслуживали клиентов и общались с БД, а также плавно переводили трафик на новую версию, вы можете добиться этого с помощью Istio и Виртуальные услуги.
Это позволяет использовать взвешенные Назначение маршрута HTTP направлять трафик на подмножества контейнеров.
Более подробную информацию об управлении трафиком Istio можно найти в статье Вот.
Возможно, вы уже видели это, но вот довольно хорошая статья, в которой обсуждаются различные подходы к развертыванию обновлений в K8s: ссылка на сайт