Миграция с
Docker Swarm на Kubernetes
Денис Катаев

О себе
А что за проект?
История проекта
- Альберт делает типичный ML проект
- Проект начинает рости очень быстро
- Альберт постоянно помогает всем подряд
Docker Swarm?
Неизвестно почему был выбран именно он
Дано:
- 5 виртуальных серверов
- Банковская NFS шара
- Банковский PostgreSQL
- Банковский TeamCity

Архитектурные мины

:latest
Только тут оно :test и :prod
Простые сервисы имеют state
Сервису нужна модель с NFS
Балансировщика нет
И большинство проблем из-за этого
Homemade
porno^W balancer
Типичное расследование
- Есть путь урла /kek/lol
- Идешь в одну репку ищешь в nginx location и на какой порт он проксирует
- Идешь в swarm и смотришь что за сервис за этим портом
- Гадаешь по image name что это за репозиторий в stash
- Идешь читаешь код сервиса что понять что происходит

Я
Portainer
Docker swarm GUI на основе docker rest api




Результат
Надо чистить вилкой:
docker system prune
Страшно медленный
Логи?
Несколько контейнеров?
Получи логи со случайного контейнера!
Поведение кластера
Нет логов поведения кластера
Replacate: 4 — Runned: 0
- Контейнер умер или убит? А почему?
- Контейнер не стартует
- Restart: always? А мне пофиг!
- Почему не запускаются сервисы?
Open terminal
Контейнер живет если закрыть вкладку без disconnect
Named volumes

Выводы
Анти CI/CD
Медленные сборки
- Нет кеша сборок т.к собирается на разных машинах кластера teamcity
- Привет от alpine и python: нет прекомпиленных образов (python wheels)
- Меняем 1 строку = 15-30 минут сборки
- ...
- Fail
Прямой push в registry
Прямо с машины разработчика
Вишенка на торте
Деплой через ssh + git pull + docker stask deply
Вторая вишенка
Deploy через update service + pull image (спасибо :latest)
Как это чинить?
Ускоряем сборку

Базовый образ

По сути это просто cache
Нормальные теги
image:{DATE}-{branch}-{git-hash}
Нормальный кластер
Два стула
- Банковский rancher v1.4.*
- Банковский kubernetes

Всё готовенькое
Чем же он так хорош?
И зачем он вам нужен?
Предметная область
Оркестрация разложена на сущности

Пример с автобусами
Что то вроде 3 нормальной формы базы данных
Наш зоопарк
- Deployment
- Service
- Ingress
Весь statefull пометили как legacy
Что получили
- пустой кластер
- балансировщики
- стабильную работу
- логи о работе кластера (replicaset)
- ...
- ждем DevOps'а чтоб настроил деплой из CI
Что еще?

...
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: rss-reader
...

- Пакетный менеджер
- Шаблонизатор

HELM
HELM
YAML программист

{{- range $service := .Values.services }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ $service.name }}
labels:
app: {{ $service.name }}
release: {{ $.Release.Name }}
spec:
replicas: {{ $.Values.service.replicas }}
selector:
matchLabels:
app: {{ $service.name }}
release: {{ $.Release.Name }}
template:
metadata:
labels:
app: {{ $service.name }}
release: {{ $.Release.Name }}
spec:
containers:
- name: {{ $service.name }}
image: {{ $service.image | default $.Values.service.image }}:{{ $service.tag | default $.Values.service.tag | default "latest"}}
pullPolicy: {{ $.Values.service.pullPolicy }}
command:
...
Произвольная структура
services:
- name: kek
port: 5000
args: ['/bin/kek']
- name: dialog-platform
port: 5000
args: ['/bin/admin']
service:
image: registry.url.ru:5050/some/dialog-platform
tag: '2019-08-01-admin-ee7c649'
env:
- name: KEK_URL
value: "http://1.1.1.1:5000/some/shit"
- name: LOL_URL
value: "http://qwerty.url.ru:7899"
- name: KEKLOL_URL
value: "https://other.url.ru"
- name: LOLKEK_URL
value: "http://some-qa.url.ru:8087"
secret_env:
- name: DB_URL
from: db_url

Templates
Values
Обновление сервисов
Где попробывать
Что почитать
Заключение
Спасибо
kataev
mr_apt

denis.a.kataev@gmail.com

Swarm or Kubernetes?
By Denis Kataev
Swarm or Kubernetes?
- 1,096