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

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

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

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

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

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


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

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

Стратегии за разгръщане

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

Rolling (постепенен, 'накатван' деплой)

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

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

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

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 (сини-зелени разгръщания)

Стратегията за сини-зелени разгръщания (понякога известна и като red/black, т.е. червено/черно) включва едновременно разгръщане на старата (зелена) и новата (синя) версия на приложението. След разположението на двете версии обикновените потребители имат достъп до зелената, докато синята е достъпна за 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'ове с нови, много по-удобно и лесно е да се използва service mesh като Istio.

Например, можете да имате два различни манифеста в Git: обичаен с етикет 0.1.0 и "канареечен" с етикет 0.2.0. Чрез променяне на тежестите в манифеста на виртуалния шлюз Istio можете да управлявате разпределението на трафика между тези два deployment'а:

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

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

Канареечни развертки с Weaveworks Flagger

Weaveworks Flagger позволява лесно и ефективно управление на канареечните развертки.

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

На базата на deployment'a на Kubernetes и, при необходимост, хоризонталното мащабиране на pod'овете (HPA), Flagger създава набори от обекти (Kubernetes deployment'и, ClusterIP услуги и виртуални услуги Istio или App Mesh) за извършване на анализ и реализация на канареечни развертки:

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

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

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

Тъмно (скрити) или А/В разгръщания

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

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

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

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

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

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

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

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

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

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

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