В мире разработки программного обеспечения внедрение нового кода в производство может оказаться непростой задачей. Один из подходов к снижению рисков и обеспечению плавного перехода — использование канареечных развертываний. Развертывания Canary позволяют контролируемым образом тестировать новые изменения кода, постепенно распространяя их на подмножество пользователей или серверов. В этой статье мы рассмотрим, что такое канареечное развертывание, и обсудим несколько методов с примерами кода для их эффективной реализации.
Что такое Canary-развертывание?
Canary-развертывание — это метод, при котором новые изменения кода выпускаются в производственную среду контролируемым и поэтапным образом. Он предполагает перенаправление небольшого процента пользовательского трафика или рабочей нагрузки на новый код, при этом большая часть трафика или рабочей нагрузки остается в существующей стабильной версии. Благодаря этому любые потенциальные проблемы или ошибки в новом коде можно будет выявить и устранить до того, как они повлияют на всю базу пользователей.
Методы реализации Canary-развертываний:
-
Развертывание Canary на основе балансировщика нагрузки.
Одним из распространенных методов является использование балансировщика нагрузки для распределения трафика между несколькими экземплярами приложения. Вы можете настроить балансировщик нагрузки так, чтобы небольшой процент трафика направлялся на новый код, а остальная часть — на стабильную версию. Вот пример использования Nginx в качестве балансировщика нагрузки:http { upstream backend { server stable_app:8000; server new_app:8000 weight=10; } server { listen 80; location / { proxy_pass http://backend; } } } -
Развертывание Canary на основе флагов функций.
Другой подход — использовать флаги функций для управления доступностью новых функций. Включив флаг функции для подмножества пользователей, вы можете постепенно предоставлять им новый код. Вот пример использования Python и пакетаfeature-flags:import featureflags featureflags.init("your_api_key") @featureflags.flag("new_feature", percentage=10) def new_feature_handler(): # Handle the new feature logic # Main application logic if featureflags.is_enabled("new_feature"): new_feature_handler() else: # Handle the stable version logic -
Canary-развертывание на основе контейнеров.
Если вы используете технологии контейнеризации, такие как Docker, вы можете использовать платформы оркестрации контейнеров, такие как Kubernetes, для выполнения Canary-развертываний. Создав несколько реплик вашего приложения с разными версиями, вы сможете постепенно масштабировать новую версию и отслеживать ее производительность. Вот пример манифеста развертывания Kubernetes:apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 10 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: stable_app:latest ports: - containerPort: 8000
Развертывания Canary обеспечивают безопасный и контролируемый подход к выпуску новых изменений кода в производственную среду. Постепенное ознакомление с новым кодом подмножества пользователей или серверов позволяет выявить проблемы и ошибки на ранней стадии, предотвращая широкомасштабное воздействие. В этой статье мы рассмотрели различные методы реализации канареечных развертываний, включая подходы на основе балансировщика нагрузки, флагов функций и контейнеров.