Внедрение Kubernetes для динамического создания тестовых окружений

1.

В production за 60 секунд
Внедрение kubernetes для динамического создания
тестовых окружений

2.

2
Об авторе
Свиридов Алексей
teamlead/senior java developer
backend-разработки
https://t.me/sviridov_alexey
О проекте
сервер онлайн-касс
язык разработки - Kotlin
15 сервисов
~ 35 000 торговых точек
(~1500-2000 RPS)

3.

3
Что обсудим?
1.
2.
3.
4.
5.
Зачем нужно создавать тестовые окружения
Проблемы динамического создания окружений существующим стеком
Использование Kubernetes, плюсы и минусы
Установка и настройка Kubernetes
Итоги

4.

4
Предыдущая модель разработки

5.

5
Проблемы
Для бизнеса
1. Мелкие фичи долго ждут в RC
2. Неудобно смотреть превью фич

6.

6
Проблемы
Для QA
1. Неизолированное тестирование функционала
2. Проблемы тестирования при появлении новых изменений

7.

7
Проблемы
Для разработчиков
1. Конфликты при merge в staging
2. Несовместимость структур в автотестах
3. Помнить о merge из feature-branch в staging

8.

8
Идеальная модель

9.

9
Компромиссная модель

10.

10
Что нужно для тестирования feature branch
1.
2.
3.
4.
5.
6.
Отдельный домен (mk-1010.dev.modulkassa.local)
Сборка сервисов из feature branch
Заменить внешние интеграции моками
Создание изолированной инфраструктуры для сервисов
Развертывание сервисов
Удалить сервисы и инфраструктуру после тестирования

11.

11
Что имеем на момент внедрения
1.
2.
3.
4.
Сборка в docker image
Деплой ansible’ом
Несколько серверов
nginx как LB

12.

12

13.

13
Трудности создания окружения в ansible
1. Как развернуть сервисы на
несколько серверов
2. Как избежать конфликта портов
на одном сервере
3. Как заводить внешний трафик в
окружение
4. Как конфигурировать окружения

14.

14
Kubernetes
1.
2.
3.
4.
5.
Автоматически распределит сервисы по серверам
Namespace’ы чтобы избежать конфликта портов
Делает LB для сервисов
Не запрещает ходить вовне
Можно задавать конфигурацию в namespace’ах
Проблемы kubernetes на bare metal
1. Где хранить данные
2. Как заводить внешний трафик

15.

15
Установка
1. apt install kubelet kubeadm kubectl && kubeadm init
2. Сетевой plugin, маска сети pod’ов --pod-network-cidr=10.244.0.0/16
На что обратить внимание
1.
2.
3.
4.
5.
Отключить swap
Достаточно места на дисках
Уникальные hostname (Ubuntu-1804-bionic-64-minimal)
kubeadm reset
Записать вывод kubeadm init для добавления серверов

16.

16
Настройка
1. Установить сетевой plugin
2. Добавить в кластер сервера (kubeadm join)
3. Доступ извне
a. NodePort
b. MetalLB
4. Маршрутизация трафика внутри кластера
a. Ingress (nginx, traefik, kong, envoy ...)
b. ambassador

17.

17
MetalLB

18.

18
MetalLB

19.

19

20.

20
Ingress?

21.

21
Ingress? Ambassador!

22.

22
Запускаем трафик в кластер

23.

23

24.

24
Отличие деплоя ansible и k8s
ansible
k8s

25.

25
Удаляем окружение
1. Удалить namespace k8s
2. Удалить созданные данные
3. Удалить домен

26.

26
Результаты и выводы
1.
2.
3.
4.
Значительно сократилось количество конфликтов
Сократилось время вывода мелких фич/фиксов в production
Более надежные результаты тестирования
Технология доступная, практические результаты достигаются
очень быстро

27.

27
Q&A
https://t.me/sviridov_alexey
English     Русский Правила