Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)

Прим. прев.: Този обзорен материал от Weaveworks представя най-популярните стратегии за разгръщане на приложения и обсъжда възможността за реализиране на най-усъвършенстваните от тях с помощта на Kubernetes оператора Flagger. Той е написан на прост език и съдържа визуални схеми, които позволяват дори на начинаещи инженери да разберат въпроса.

Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)
Схемата е взета от друг обзор на стратегии за разгръщане, изготвен от Container Solutions

Една от най-големите проблеми при разработката на облачни приложения днес е ускорението на разгръщането. При микросервисния подход разработчиците вече работят с напълно модулни приложения и ги проектират, позволявайки на различни екипи да пишат код и да правят промени в приложението едновременно.

По-кратките и по-чести разгръщания имат следните предимства:

  • Скъсява се времето за достигане на пазара.
  • Новите функции по-бързо достигат до потребителите.
  • Отговорите на потребителите по-бързо достигат до екипа на разработчиците. Това означава, че екипът може да добавя функции и да поправя проблеми по-оперативно.
  • Подобрява се духът на разработчиците: с повече функции в разработка работата става по-интересна.


Но с увеличаването на честотата на версиите, също така нараства рискът от негативно влияние върху надеждността на приложението или потребителското изживяване. Затова на екипите по поддръжка и DevOps е важно да изградят процеси и да управляват стратегии за разгръщане, така че да минимизират риска за продукта и потребителите. (Научете повече за автоматизацията на CI/CD пайплайна можете тук.)

В тази публикация ще обсъдим различни стратегии за разгръщане в Kubernetes, включително rolling разгръщания и по-усъвършенствани методи, като канарени разгръщания и техните разновидности.

Стратегии за деплой

Съществуват няколко различни типа стратегии за разгръщане, които можете да използвате в зависимост от целта. Например, може да се наложи да направите промени в определена среда за допълнително тестване, или в подмножество от потребители/клиенти, или да проведете ограничено тестване на потребителите, преди да направите някоя функция обществено достъпна.

Rolling (постепенно, "накатващо" разгръщане)

Тази стратегия за разгръщане в Kubernetes е стандартна. Тя постепенно заменя pod-овете със стара версия на приложението с pod-ове с нова версия — без престой на клъстера.

Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)

Kubernetes изчаква новите pod-ове да са готови за работа (проверявайки ги с помощта на readiness тестове), преди да започне свиването на старите. Ако възникне проблем, подобно обновление може да бъде прекратено, без да се спира целият клъстер. В YAML файла с описанието на типа на разгръщането, новият образ заменя стария образ:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: awesomeapp
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: awesomeapp
    spec:
      containers:
        - name: awesomeapp
          image: imagerepo-user/awesomeapp:new
          ports:
            - containerPort: 8080

Параметрите на обновлението могат да бъдат уточнени в манифест файла:

spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
       maxSurge: 25%
       maxUnavailable: 25%
  template:
  ...

Recreate (повторно създаване)

При този най-прост тип разгръщане старите pod-ове се унищожават наведнъж и се заменят с нови:

Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)

Съответстващият манифест изглежда приблизително така:

spec:
  replicas: 3
  strategy:
    type: Recreate
  template:
  ...

Blue/Green (сини-зелени разгръщания)

Стратегията за сини-зелени разгръщания (понякога наричана червено/черно) предвижда едновременно разгръщане на старата (зелена) и новата (синя) версия на приложението. След разполагане на двете версии, обикновените потребители получават достъп до зелената, докато синята е достъпна за QA екипа за автоматизиране на тестовете чрез отделен сървис или директен проброс на портове:

Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: awesomeapp-02
spec:
  template:
    metadata:
      labels:
        app: awesomeapp
        version: "02"

След като синята (нова) версия е била тествана и нейното издание е одобрено, услугата се пренасочва към нея, а зелената (стара) версия се свива:

apiVersion: v1
kind: Service
metadata:
  name: awesomeapp
spec:
  selector:
    app: awesomeapp
    version: "02"
...

Canary (канарейкови разгръщания)

Канарейковите разгръщания наподобяват сини-зелени, но са по-добре управлявани и използват прогресивен поетапен подход. Този тип разгръщания включва различни стратегии, включително „скрити“ пускания и A/B тестване.

Тази стратегия се прилага, когато е необходимо да се тества нова функционалност, обикновено в бекенда на приложението. Същността на подхода е да се създадат два практически идентични сървъра: един, който обслужва почти всички потребители, и друг, с новите функции, който обслужва само малка подгрупа от потребители, след което резултатите от тяхната работа се сравняват. Ако всичко протече без грешки, новата версия постепенно се въвежда в цялата инфраструктура.

Въпреки че тази стратегия може да бъде реализирана изключително със средства от Kubernetes, което заменя старите pod-ове с нови, значително по-удобно и лесно е да се използва сервисен мрежа като Istio.

Например, можете да имате два различни манифеста в Git: обикновен с етикет 0.1.0 и „канарейчен“ с етикет 0.2.0. Чрез промяна на теглата в манифеста на виртуалния шлюз на Istio можете да управлявате разпределението на трафика между тези две разгръщания:

Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)

Стъпка по стъпка ръководство за реализиране на канарейни разгръщания с помощта на Istio можете да намерите в материала GitOps работни потоци с Istio. (Прим. прев.: Ние също така преведохме материал относно канарейните разгръщания в Istio тук.)

Канарейни разгръщания с Weaveworks Flagger

Weaveworks Flagger позволява лесно и ефективно управление на канарейни разгръщания.

Flagger автоматизира работата с тях. Той използва Istio или AWS App Mesh за маршрутизиране и превключване на трафика, както и метрики от Prometheus за анализ на резултатите. Освен това, анализът на канарейните разгръщания може да бъде допълнен с уебхукове за провеждане на приемам тестове, натоварващи тестове и всякакви други видове проверки.

На базата на разгръщането на Kubernetes и, при необходимост, хоризонталното мащабиране на pod-овете (HPA), Flagger създава набори от обекти (разгръщания на Kubernetes, услуги ClusterIP и виртуални услуги на Istio или App Mesh) за провеждане на анализ и реализиране на канарейни разгръщания:

Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)

Реализирайки контур на управление (контролен цикъл), Flagger постепенно превключва трафика към канарейния сървър, като паралелно измерва ключовите показатели за производителност, като процент на успешни HTTP заявки, средна продължителност на заявките и здравословното състояние на pod-овете. На базата на анализа на KPI (ключови показатели за ефективност), канарейната част или нараства, или намалява, а резултатите от анализа се публикуват в Slack. Описание и демонстрация на този процес можете да намерите в материала Прогресивно доставяне за App Mesh.

Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)

Тъмен (прикрит) или A/B-разгръщания

Прикритото разгръщане е друга вариация на канарейната стратегия (с която, между другото, Flagger също може да работи). Разликата между прикритото и канарейното разгръщане е, че прикритите разгръщания се отнасят до фронтенда, а не до бекенда, както е при канарейните.

Друго название на тези разгръщания е A/B-тестиране. Вместо да открие достъп до нова функция за всички потребители, тя се предлага само на ограничена част от тях. Обикновено тези потребители не знаят, че са тестери-пионери (оттук и терминът „прикрито разгръщане“).

С помощта на функционални превключватели (feature toggles) и други инструменти можете да следите как потребителите взаимодействат с новата функция, ангажира ли ги тя или смятат новия потребителски интерфейс за объркващ, и други видове метрики.

Стратегии за разгръщане в Kubernetes: rolling, recreate, blue/green, canary, dark (A/B тестиране)

Flagger и A/B-разгръщания

Освен маршрутизиране с оглед на теглата, Flagger също може да насочва трафика към канарейния сървър в зависимост от HTTP параметри. При A/B-тестиране могат да се използват HTTP заглавки или бисквитки за пренасочване на определен сегмент от потребителите. Това е особено ефективно при frontend-приложения, които изискват привързаност на сесията към сървъра (session affinity). Допълнителна информация можете да намерите в документацията на Flagger.

Авторът изразява благодарност Stefan Prodan, инженер на Weaveworks (и създател на Flagger), за всички тези удивителни схеми на деплой.

P.S. от преводача

Прочетете също в нашия блог:

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster