Дмитрий Столяров
CTO & Co-founder
v1
Лучшие практики CI/CD
с Kubernetes и GitLab
Лучшие практики
Continuous Delivery
с Docker
RootConf 2016
Собираем Docker-
образы
быстро и удобно
Highload 2016
Наш опыт
с Kubernetes
в небольших проектах
RootConf 2017
Лучшие практики
CI/CD с Kubernetes
и GitLab
Highload 2017
ВЫ
ЗДЕСЬ
youtube.com/c/flant
Опыт
приложений уже
в production120
готово, скоро в
production+19
в работе+20
Опыт
до конца года+22
приложение!=181
по состоянию на 4 ноября 2017
проект
в kubernetes
приложений уже
в production 21
до конца
года+4
ждем
ваш проект+?
120
готово, скоро в
production+19
в работе+20
до конца года+22
приложение!=181
Опыт
по состоянию на 4 ноября 2017
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
по состоянию на 4 ноября 2017
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
Фреймворк
17 Yii
12 Rails
7 Django
7 Laravel
4 Socket.IO
4 .NET Core
3 Bitrix
2 Meteor.JS
6 Другие
по состоянию на 4 ноября 2017
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
Фреймворк
17 Yii
12 Rails
7 Django
7 Lavarel
4 Socket.IO
4 .NET Core
3 Bitrix
2 Meteor.JS
6 Другие
Package Manager
96 npm
32 Composer
27 Yarn
19 Bundler
7 pip
2 sbt
2 .NET Core
2 hex
2 Другие
по состоянию на 4 ноября 2017
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
Фреймворк
17 Yii
12 Rails
7 Django
7 Lavarel
4 Socket.IO
4 .NET Core
3 Bitrix
2 Meteor.JS
6 Другие
Package Manager
96 npm
32 Composer
27 Yarn
19 Bundler
7 pip
2 sbt
2 .NET Core
2 hex
2 Другие
по состоянию на 4 ноября 2017
DBMS
40 PostgreSQL
39 MySQL
27 MongoDB
2 Cassandra
3 Другие
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
Фреймворк
17 Yii
12 Rails
7 Django
7 Lavarel
4 Socket.IO
4 .NET Core
3 Bitrix
2 Meteor.JS
6 Другие
Package Manager
96 npm
32 Composer
27 Yarn
19 Bundler
7 pip
2 sbt
2 .NET Core
2 hex
2 Другие
по состоянию на 4 ноября 2017
DBMS
40 PostgreSQL
39 MySQL
27 MongoDB
2 Cassandra
3 Другие
In-memory store
43 Redis
24 Memcahed
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
Фреймворк
17 Yii
12 Rails
7 Django
7 Lavarel
4 Socket.IO
4 .NET Core
3 Bitrix
2 Meteor.JS
6 Другие
Package Manager
96 npm
32 Composer
27 Yarn
19 Bundler
7 pip
2 sbt
2 .NET Core
2 hex
2 Другие
по состоянию на 4 ноября 2017
DBMS
40 PostgreSQL
39 MySQL
27 MongoDB
2 Cassandra
3 Другие
In-memory store
43 Redis
24 Memcahed
Queue
37 RabbitMQ
15 Redis
8 Nats
2 PGQ
1 Kafka
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
Фреймворк
17 Yii
12 Rails
7 Django
7 Lavarel
4 Socket.IO
4 .NET Core
3 Bitrix
2 Meteor.JS
6 Другие
Package Manager
96 npm
32 Composer
27 Yarn
19 Bundler
7 pip
2 sbt
2 .NET Core
2 hex
2 Другие
по состоянию на 4 ноября 2017
DBMS
40 PostgreSQL
39 MySQL
27 MongoDB
2 Cassandra
3 Другие
In-memory store
43 Redis
24 Memcahed
Queue
37 RabbitMQ
15 Redis
8 Nats
2 PGQ
1 Kafka
Search
30 Elasticsearch
12 Sphinx
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
Фреймворк
17 Yii
12 Rails
7 Django
7 Lavarel
4 Socket.IO
4 .NET Core
3 Bitrix
2 Meteor.JS
6 Другие
Package Manager
96 npm
32 Composer
27 Yarn
19 Bundler
7 pip
2 sbt
2 .NET Core
2 hex
2 Другие
DBMS
40 PostgreSQL
39 MySQL
27 MongoDB
2 Cassandra
3 Другие
Queue
37 RabbitMQ
15 Redis
8 Nats
2 PGQ
1 Kafka
Search
30 Elasticsearch
12 Sphinx
In-memory store
43 Redis
24 Memcahed
по состоянию на 4 ноября 2017
Язык
100 Node.js
47 PHP
18 Ruby
10 Python
10 JavaScript
4 Go
4 C#
2 Scala
2 Elixir
1 Java
Фреймворк
17 Yii
12 Rails
7 Django
7 Lavarel
4 Socket.IO
4 .NET Core
3 Bitrix
2 Meteor.JS
6 Другие
Package Manager
96 npm
32 Composer
27 Yarn
19 Bundler
7 pip
2 sbt
2 .NET Core
2 hex
2 Другие
DBMS
40 PostgreSQL
39 MySQL
27 MongoDB
2 Cassandra
3 Другие
Queue
37 RabbitMQ
15 Redis
8 Nats
2 PGQ
1 Kafka
Search
30 Elasticsearch
12 Sphinx
In-memory store
43 Redis
24 Memcahed
по состоянию на 4 ноября 2017
команд30+ клиентов25приложение181
Что же такое CI/CD?
git
build
test
release
operate
Что же такое CI/CD?
git
build
test
release
operate
Continuous
Intergation?
Continuous
Deployment?
Continuous
Delivery?
Что же такое CI/CD?
git
build
test
release
operate
Continuous
Intergation?
ОНО РАБОТАЕТ
Continuous
Deployment?
Continuous
Delivery?
Что же такое CI/CD?
git
build
test
release
operate
Что же такое CI/CD?
git
build
test
release
operate
Какой CI/CD бывает?
Факторы, влияющие на сложность
Основной
процесс
Тестирование
Разделение
прав доступа
Архитектура
приложения
Какой CI/CD бывает?
Факторы / Основной процесс
Какой CI/CD бывает?
Факторы / Основной процесс
Одно окружение
Какой CI/CD бывает?
Факторы / Основной процесс
Одно окружение
Несколько окружений
Какой CI/CD бывает?
Факторы / Основной процесс
Одно окружение
Несколько окружений
Динамические окружения
Какой CI/CD бывает?
Факторы / Основной процесс
Одно окружение
Несколько окружений
Динамические окружения
Несколько площадок
Какой CI/CD бывает?
Факторы / Основной процесс
Одно окружение
Несколько окружений
Динамические окружения
Несколько площадок
Какой CI/CD бывает?
Факторы / Тестирование
Какой CI/CD бывает?
Факторы / Тестирование
Анализ кода
Какой CI/CD бывает?
Факторы / Тестирование
Анализ кода
Тесты без окружения Unit
Какой CI/CD бывает?
Факторы / Тестирование
Анализ кода
Тесты без окружения
Тесты в окружении
Unit
Functional,
Integration
Какой CI/CD бывает?
Факторы / Тестирование
Анализ кода
Тесты без окружения
Тесты в окружении
Тесты в «полном» окружении
Unit
Functional,
Integration
End-to-end,
Performance regression
Какой CI/CD бывает?
Факторы / Тестирование
Анализ кода
Тесты без окружения
Тесты в окружении
Тесты в «полном» окружении
Unit
Functional,
Integration
End-to-end,
Performance regression
Какой CI/CD бывает?
Факторы / Разделение прав доступа
Какой CI/CD бывает?
Факторы / Разделение прав доступа
Простое разделение прав доступа
Какой CI/CD бывает?
Факторы / Разделение прав доступа
Простое разделение прав доступа
Разные права на окружения
Какой CI/CD бывает?
Факторы / Разделение прав доступа
Простое разделение прав доступа
Разные права на окружения
Multi stage approval
Какой CI/CD бывает?
Факторы / Разделение прав доступа
Простое разделение прав доступа
Разные права на окружения
Multi stage approval
Quorum approval
Какой CI/CD бывает?
Факторы / Разделение прав доступа
Простое разделение прав доступа
Разные права на окружения
Multi stage approval
Quorum approval
Какой CI/CD бывает?
Факторы / Архитектура приложения
Какой CI/CD бывает?
Факторы / Архитектура приложения
Stateless приложение
Какой CI/CD бывает?
Факторы / Архитектура приложения
Stateless приложение
Stateful приложение
Какой CI/CD бывает?
Факторы / Архитектура приложения
Stateless приложение
Stateful приложение
Многокомпонентное приложение
Какой CI/CD бывает?
Факторы / Архитектура приложения
Stateless приложение
Stateful приложение
Многокомпонентное приложение
Микросервисная архитектура
Какой CI/CD бывает?
Факторы / Архитектура приложения
Stateless приложение
Stateful приложение
Многокомпонентное приложение
Микросервисная архитектура
git + shell
Docker
Kubernetes + Helm
Kubernetes + Helm
+ Gitlab
Kubernetes + Helm
+ Gitlab Enterprise
Какой CI/CD бывает?
Дополнительные требования
Какой CI/CD бывает?
Дополнительные требования
Быстро
Какой CI/CD бывает?
Дополнительные требования
Быстро
Надёжно
Какой CI/CD бывает?
Дополнительные требования
Быстро
Надёжно
Выкат и откат с гарантией и без простоя
Какой CI/CD бывает?
Дополнительные требования
Быстро
Надёжно
Выкат и откат с гарантией и без простоя
SLA 99.9%
Какой CI/CD бывает?
Дополнительные требования
Быстро
Надёжно
Дёшево
Выкат и откат с гарантией и без простоя
SLA 99.9%
Какой CI/CD бывает?
Дополнительные требования
Быстро
Надёжно
Дёшево
Выкат и откат с гарантией и без простоя
SLA 99.9%
Затраты на управление / администрирование
Какой CI/CD бывает?
Дополнительные требования
Быстро
Надёжно
Дёшево
Выкат и откат с гарантией и без простоя
SLA 99.9%
Затраты на управление / администрирование
Затраты на инфраструктуру
Какой CI/CD бывает?
Дополнительные требования
Быстро
Надёжно
Дёшево
Выкат и откат с гарантией и без простоя
SLA 99.9%
Затраты на управление / администрирование
Затраты на инфраструктуру
Какой CI/CD бывает?
Особые требования Флант
Какой CI/CD бывает?
Особые требования Флант
Open Source
Разномасштабность
Интероперабельность
Простота эксплуатации
Будущее
Инструменты
Инструменты
Kubernetes
Инструменты
Kubernetes
«Чёрный ящик»
YAML
Declarative DSL
N
Deployment StatefulSet
Service Ingress
Job CronJob
N
Инструменты
Стандарт для нас
Инструменты
Инструменты
Управление пакетами
Состоит из 2-х частей
helm (client), tiller (server)
Chart – название пакетов
метаописание, yaml-шаблоны
Наша утилита
Улучшает сборку
Улучшает deploy (чуть-чуть)
github.com/flant/dapp
git
build
test
release
operate
git operatebuild test release
git
build
test
release
operate
git operatebuild test release
git operatebuild test release
git operatebuild test release
git operatebuild test release
.gitlab-ci.yaml
git operatebuild test release
.gitlab-ci.yaml
git operatebuild test release
.gitlab-ci.yaml
Dockerfile
git operatebuild test release
.gitlab-ci.yaml
Dockerfile
dockerbuild
Docker-
image
git operatebuild test release
.gitlab-ci.yaml
Dockerfile
dockerbuild
Docker-
image
Docker
registry
git operatebuild test release
.gitlab-ci.yaml
Dockerfile
dockerbuild
Docker-
image
Docker
registry
git operatebuild test release
.gitlab-ci.yaml
Dockerfile
dockerbuild
Docker-
image
Docker-
image
+
tests
Docker
registry
git operatebuild test release
.gitlab-ci.yaml
Dockerfile
dockerbuild
Docker-
image
Docker-
image
+
tests
Docker
registry
.helm
backend.yaml
frontend.yaml
cron.yaml
git operatebuild test release
.gitlab-ci.yaml
Dockerfile
dockerbuild
Docker-
image
Docker-
image
+
tests
Docker
registry
.helm
backend.yaml
frontend.yaml
cron.yaml
helm install
git operatebuild test release
.gitlab-ci.yaml
Dockerfile
dockerbuild
Docker-
image
Docker-
image
+
tests
Docker
registry
.helm
backend.yaml
frontend.yaml
cron.yaml
helm install
git operate
Dockerfile
.helm
backend.yaml
frontend.yaml
cron.yaml
dockerbuild
Docker-
image
Docker-
image
+
.gitlab-ci.yaml
tests
Docker
registry
build test release
helm install
.helm
git operate
backend.yaml
frontend.yaml
cron.yaml
Docker-
image
Docker-
image
+
.gitlab-ci.yaml
tests
Docker
registry
build test release
Dockerfile
dockerbuild
helm install
.helm
git operate
backend.yaml
frontend.yaml
cron.yaml
Docker-
image
Docker-
image
+
.gitlab-ci.yaml
tests
Docker
registry
build test release
dockerbuild
helm install
Dappfile
.helm
git operate
backend.yaml
frontend.yaml
cron.yaml
Docker-
image
Docker-
image
+
.gitlab-ci.yaml
tests
Docker
registry
build test release
Dappfile
dappbuild
helm install
.helm
git operate
backend.yaml
frontend.yaml
cron.yaml
Docker-
image
Docker-
image
+
.gitlab-ci.yaml
tests
Docker
registry
build test release
Dappfile
dappbuild
dapp kube deploy
.helm
git operate
backend.yaml
frontend.yaml
cron.yaml
Docker-
image
Docker-
image
+
.gitlab-ci.yaml
tests
Docker
registry
build test release
Dappfile
dappbuild
dapp kube deploy
Демо на нашем стенде
Приходите в любое время,
мы будем показывать, как
вся эта связка работает в
деталях и с примерами. И
будем отвечать на любые
ваши вопросы.
CI/CD с Kubernetes и Gitlab
tips & tricks
Что должно быть
в Docker образе?
1/8
Что должно быть в Docker образе?
Всё, что нужно для
работы приложения!
Что должно быть в Docker образе?
Системные компоненты
# apt-get install php-fpm
Что должно быть в Docker образе?
Системные компоненты
# apt-get install php-fpm
Package manager
Что должно быть в Docker образе?
Системные компоненты
# apt-get install php-fpm
Package manager Dependencies
Что должно быть в Docker образе?
Системные компоненты
# apt-get install php-fpm
Системные библиотеки
# apt-get install libxml2
Package manager Dependencies
Что должно быть в Docker образе?
Системные компоненты
# apt-get install php-fpm
Системные библиотеки
# apt-get install libxml2
Package manager Dependencies
Исходный код
Что должно быть в Docker образе?
Системные компоненты
# apt-get install php-fpm
Системные библиотеки
# apt-get install libxml2
Package manager Dependencies
Исходный код Собранные ассеты
Что должно быть в Docker образе?
Системные компоненты
# apt-get install php-fpm
Системные библиотеки
# apt-get install libxml2
Package manager Dependencies
Готовые конфигиИсходный код Собранные ассеты
One image to rule them all
2/8
One image to rule them all
git
One image to rule them all
dockerfile
composer.json
***.php
master
git
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
Всё ок!
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
Всё ок!
dockerfile
composer.json
***.php
production
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
dockerfile
composer.json
***.php
production
Всё ок!
Docker
образ
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
dockerfile
composer.json
***.php
production
Всё ок!
Docker
образ
:production
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
dockerfile
composer.json
***.php
production
Всё ок!
Docker
образ
:production
=
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
dockerfile
composer.json
***.php
production
Всё ок!
Docker
образ
:production
=
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
dockerfile
composer.json
***.php
production
Всё ок!
Docker
образ
:production
=
:v0.7.23
:v0.7.23
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
dockerfile
composer.json
***.php
production
Всё ок!
Docker
образ
:production
=
:v0.7.23
:v0.7.23
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
dockerfile
composer.json
***.php
production
Всё ок!
Docker
образ
:production
=
:v0.7.23
:v0.7.23
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
QA
dockerfile
composer.json
***.php
production
Всё ок!
Docker
образ
:production
=
:v0.7.23
:v0.7.23
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
dockerfile
composer.json
***.php
production
Docker
образ
:production
=
:v0.7.23
:v0.7.23
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
dockerfile
composer.json
***.php
production
Docker
образ
:production
=
:v0.7.23
:v0.7.23
QA
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
dockerfile
composer.json
***.php
production
Docker
образ
:production
=
:v0.7.23
:v0.7.23
QA
Всё ок!
One image to rule them all
dockerfile
composer.json
***.php
master
git
Docker
образ
:master
dockerfile
composer.json
***.php
production
Docker
образ
:production
=
:v0.7.23
:v0.7.23
QA
Всё ок!
One image to rule them all
Какие бранчи собирать? Как тегировать образы?
One image to rule them all
git branch
Какие бранчи собирать? Как тегировать образы?
git tag
One image to rule them all
git branch
Какие бранчи собирать? Как тегировать образы?
временные образы
git tag
One image to rule them all
git branch
Какие бранчи собирать? Как тегировать образы?
временные образы
git tag релизные образы
One image to rule them all
git branch
Какие бранчи собирать? Как тегировать образы?
временные образы
git tag релизные образы
devreview
integration
dem
o
One image to rule them all
git branch
Какие бранчи собирать? Как тегировать образы?
временные образы
git tag релизные образы
devreview
integration
dem
o
staging
qa
production
Порядок выката
и миграции
3/8
Кейс #1
Backend
Порядок выката и миграции
Кейс #1
Backend
1
DBПорядок выката и миграции
:v0.7.14
Кейс #1
Backend
1
DBПорядок выката и миграции
:v0.7.14
BackendDB
1
Кейс #1
Порядок выката и миграции
Deploy
Кейс #1
BackendDB
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.8.15
Deploy
:v0.7.14
->
0.8.15
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.8.15
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.8.15
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.8.15
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.8.15
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
Кейс #1
BackendDB
:v0.8.15
Migrations1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.7.14
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.7.14
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.8.15
:v0.7.14
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.8.15
:v0.7.14
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.7.14
->
0.8.15
:v0.8.15
:v0.8.15
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
Порядок выката и миграции
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
:v0.8.15
:v0.8.15
:v0.8.15
Порядок выката и миграции
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
:v0.8.15
:v0.8.15
:v0.8.15
Порядок выката и миграции
Ура!
Выкатилось!
Ура!
Выкатилось!
:v0.8.15
Кейс #1
Backend
:v0.8.15
Migrations
DB
1
:v0.8.15
:v0.8.15
:v0.8.15
Порядок выката и миграции
backend
3
migrationsDB
1
Порядок выката и миграции
Кейс #1
backend
3
migrationsDB
1
использует
использует
Порядок выката и миграции
Кейс #1
backend
3
migrationsDB
1
использует
использует
косвенно
зависит
Порядок выката и миграции
Кейс #1
Кейс #2
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
:v0.8.15
1
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
:v0.8.15
1
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
:v0.8.15
Порядок выката и миграции
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
Порядок выката и миграции
:v0.8.15
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
Порядок выката и миграции
:v0.8.15
Кейс #2
Backend
Migrations
DB
:v0.8.15
1
Порядок выката и миграции
:v0.8.15
backend
3
migrationsDB
1
использует
использует
косвенно
зависит
Резюме
Порядок выката и миграции
Bootstrap базы
4/8
Dump
Bootstrap базы
Seed
Dump
Bootstrap базы
Seed
DB
Dump
Bootstrap базы
Seed
DB load dump
Dump
Bootstrap базы
Seed
DB load dump
migrations
Dump
Bootstrap базы
Seed
DB load dump
migrations
Dump
Bootstrap базы
Seed
DB load dump
Backend migrations
Dump
Bootstrap базы
Seed
DB load dump
Backend migrations
Dump
Bootstrap базы
Backend
DB load dump
migrations
DB
Seed
Dump
Bootstrap базы
Backend
DB load dump
migrations
DB migrations
Seed
Dump
Bootstrap базы
Backend
DB load dump
migrations
DB migrations
seed
Seed
Dump
Bootstrap базы
Backend
DB load dump
migrations
DB migrations
seed
Seed
Dump
Bootstrap базы
Backend
DB load dump
migrations Backend
DB migrations
seed
Seed
Dump
Bootstrap базы
Backend
DB load dump
migrations Backend
DB migrations
seed
Seed
Скорость
bootstrap’а
Занимаемое
место
Полезность
Сложность
реализации
Пустая база
только структура 5 sec
Seed/fixtures
из текущего бранча 1 min
Ночной дамп
с seeds/fixtures из master 10 sec
Дамп
“для staging” 1 hour
Ночной дамп
“для staging” 30 sec
Дамп
с production 30 min
Ночной дамп
с production 1 min
Скорость
bootstrap’а
Занимаемое
место
Полезность
Сложность
реализации
Пустая база
только структура
Seed/fixtures
из текущего бранча
Ночной дамп
с seeds/fixtures из master 10 sec
Дамп
“для staging”
Ночной дамп
“для staging” 30 sec
Дамп
с production
Ночной дамп
с production
Deploy
Bootstrap базы
Load: Seeds
Load: Nightly staging dump
Build
Build Deploy
Load: Nightly seeds (from master)
Выкат действительно
без простоя
5/8
Выкат действительно без простоя
Выкат действительно без простоя
example.com
Выкат действительно без простоя
example.com
Выкат действительно без простоя
example.com
Выкат действительно без простоя
example.com
Graceful shutdown
Выкат действительно без простоя
Graceful shutdownexample.com
Выкат действительно без простоя
Graceful shutdownexample.com
Выкат действительно без простоя
Graceful shutdownexample.com
Выкат действительно без простоя
Graceful shutdownexample.com
Выкат действительно без простоя
Graceful shutdownexample.com
Readiness probe
Выкат действительно без простоя
Graceful shutdownexample.com
Readiness probe
Проверьте (чем угодно)
Выкат действительно без простоя
Graceful shutdownexample.com
Readiness probe
Проверьте (чем угодно)
Правильный размер pod-а
и политика обновления
Атомарность выката
6/8
Атомарность выката
Атомарность выката
Environments
production = v0.7.14
Атомарность выката
Environments
production = v0.7.14
backend
3
memcached
3
cron-foo
cron-bar
cron-baz
Redis
3
Background
Jobs
3
Sphinx
2
DB
3
Атомарность выката
Environments
production = v0.7.14
backend
3
memcached
3
cron-foo
cron-bar
cron-baz
Redis
3
Background
Jobs
3
Sphinx
2
DB
3
:v0.7.14
:v0.7.14
:v0.7.14
:v0.7.14
Атомарность выката
backend
3
memcached
3
cron-foo
cron-bar
cron-baz
Redis
3
Background
Jobs
3
Sphinx
2
DB
3
Environments
Pipelines
v0.8.15
:v0.7.14
:v0.7.14
:v0.7.14
:v0.7.14
production = v0.7.14
Атомарность выката
Deploy
backend
3
memcached
3
cron-foo
cron-bar
cron-baz
Redis
3
Background
Jobs
3
Sphinx
2
DB
3
Environments
Pipelines
v0.8.15
:v0.7.14
:v0.7.14
:v0.7.14
:v0.7.14
production = v0.7.14
Атомарность выката
Deploy
backend
3
memcached
3
cron-foo
cron-bar
cron-baz
Redis
3
Background
Jobs
3
Sphinx
2
DB
3
Environments
Pipelines
v0.8.15
:v0.7.14
:v0.7.14
:v0.7.14
:v0.7.14
production = v0.7.14
Атомарность выката
Deploy
backend
3
memcached
3
cron-foo
cron-bar
cron-baz
Redis
3
Background
Jobs
3
Sphinx
2
DB
3
Environments
Pipelines
v0.8.15
:v0.7.14
:v0.7.14
:v0.7.14
:v0.7.14
production = v0.7.14
Атомарность выката
Deploy
backend
3
memcached
3
cron-foo
cron-bar
cron-baz
Redis
3
Background
Jobs
3
Sphinx
2
DB
3
Environments
Pipelines
v0.8.15
:v0.7.14
:v0.7.14
:v0.7.14
:v0.7.14
production = v0.7.14
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.7.14
:v0.7.14
:v0.7.14
:v0.7.14
Атомарность выката
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.7.14
:v0.7.14
:v0.7.14
Атомарность выката
:v0.8.15
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.7.14 -> 0.8.15
:v0.7.14 -> 0.8.15
:v0.7.14 -> 0.8.15
:v0.8.15
Атомарность выката
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.8.15
Атомарность выката
:v0.7.14 -> 0.8.15
:v0.8.15
:v0.8.15
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.7.14 -> 0.8.15
:v0.8.15
Атомарность выката
:v0.8.15
:v0.8.15
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.7.14 -> 0.8.15
:v0.8.15
Атомарность выката
ошибка
:v0.8.15
:v0.8.15
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.7.14 -> 0.8.15
:v0.8.15
Атомарность выката
ошибка
:v0.8.15
:v0.8.15
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.7.14 -> 0.8.15
:v0.8.15
Атомарность выката
ошибка
:v0.8.15
:v0.8.15
✖
Deploy
ошибка
:v0.7.15
memcached
3
Redis
3
DB
3
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
Pipelines
v0.8.15 ✖
Environments
3
Атомарность выката
production = v0.7.14
:v0.7.14 -> 0.8.15
:v0.8.15
:v0.8.15
:v0.8.15
:v0.7.15
Deploy
memcached
3
Redis
3
DB
3
Environments
Pipelines
v0.8.15
production = v0.7.14
cron-foo
cron-bar
cron-baz
Background
Jobs
3
Sphinx
2
backend
3
:v0.7.14 -> 0.8.15
:v0.8.15
Атомарность выката
ошибка
:v0.8.15
:v0.8.15
✖
Динамические
окружения
7/8
Динамические окружения
Ingress Controller
Динамические окружения
*.review.example.com
Ingress Controller
Динамические окружения
*.review.example.com
Ingress Controller
git
Динамические окружения
*.review.example.com
Ingress Controller
git
feature-x
***.php
Динамические окружения
*.review.example.com
Ingress Controller
git
feature-x
***.php
namespace: feature-x
Динамические окружения
*.review.example.com
Ingress Controller
git
feature-x
***.php
namespace: feature-x
feature-x.review.example.com
Динамические окружения
*.review.example.com
Ingress Controller
git
feature-x
***.php
namespace: feature-x
feature-x.review.example.com
abc
***.php
Динамические окружения
*.review.example.com
Ingress Controller
git
feature-x
***.php
namespace: feature-x
feature-x.review.example.com
abc
***.php
abc.review.example.com
namespace: abc
Динамические окружения
*.review.example.com
Ingress Controller
git
feature-x
***.php
namespace: feature-x
feature-x.review.example.com
abc
***.php
abc.review.example.com
namespace: abc
feature-foo
***.php
Динамические окружения
*.review.example.com
Ingress Controller
feature-x.review.example.com
namespace: feature-x
abc.review.example.com
namespace: abc
feature-foo.review.example.com
namespace: feature-foo
git
feature-xabcfeature-foo
***.php
***.php
***.php
Динамические окружения
*.review.example.com
Ingress Controller
feature-x.review.example.com
namespace: feature-x
feature-foo.review.example.com
namespace: feature-foo
git
feature-xfeature-foo
***.php
***.php
abc.review.example.com
namespace: abc
Динамические окружения
*.review.example.com
Ingress Controller
feature-x.review.example.com
namespace: feature-x
feature-foo.review.example.com
namespace: feature-foo
git
feature-xfeature-foo
***.php
***.php
Динамические окружения
*.review.example.com
Ingress Controller
feature-x.review.example.com
namespace: feature-x
feature-foo.review.example.com
namespace: feature-foo
git
feature-foo
***.php
Динамические окружения
*.review.example.com
Ingress Controller
feature-foo.review.example.com
namespace: feature-foo
git
feature-foo
***.php
Отображение
branch: new-interface
Динамические окруженияодинпроект
Отображение
branch: new-interface
Динамические окруженияодинпроект
namespace: new-interface
new-interface.review.example.com
Отображение
branch: new-interface
Динамические окруженияодинпроект
namespace: new-interface
new-interface.review.example.com
branch: feature/LLLL___#1342
одинпроект
+SLUG
Отображение
branch: new-interface
Динамические окруженияодинпроект
namespace: new-interface
new-interface.review.example.com
branch: feature/LLLL___#1342
одинпроект
+SLUG
namespace: feature-llll-dfjre3
feature-llll-dfjre3.review.example.com
Отображение
branch: new-interface
Динамические окруженияодинпроект
namespace: new-interface
new-interface.review.example.com
branch: feature/LLLL___#1342
одинпроект
+SLUG
namespace: feature-llll-dfjre3
feature-llll-dfjre3.review.example.com
несколько
проектов
Отображение
branch: new-interface
Динамические окруженияодинпроект
namespace: new-interface
new-interface.review.example.com
branch: feature/LLLL___#1342
одинпроект
+SLUG
namespace: feature-llll-dfjre3
feature-llll-dfjre3.review.example.com
несколько
проектов
project: gimli
branch: bar
Отображение
branch: new-interface
Динамические окруженияодинпроект
namespace: new-interface
new-interface.review.example.com
branch: feature/LLLL___#1342
одинпроект
+SLUG
namespace: feature-llll-dfjre3
feature-llll-dfjre3.review.example.com
несколько
проектов
namespace: gimli-barproject: gimli
gimli-bar.review.example.combranch: bar
Отображение
branch: new-interface
Динамические окруженияодинпроект
namespace: new-interface
new-interface.review.example.com
branch: feature/LLLL___#1342
одинпроект
+SLUG
namespace: feature-llll-dfjre3
feature-llll-dfjre3.review.example.com
несколько
проектов
namespace: gimli-barproject: gimli
gimli-bar.review.example.combranch: bar
Несколько советов
Динамические окружения
Минимизировать
использование ресурсов
Несколько советов
Динамические окружения
Минимизировать
использование ресурсов
Целиком в Kubernetes
(включая все СУБД)
Несколько советов
Динамические окружения
Минимизировать
использование ресурсов
Целиком в Kubernetes
(включая все СУБД)
Ограничить
публичный доступ
Несколько советов
Динамические окружения
Минимизировать
использование ресурсов
Целиком в Kubernetes
(включая все СУБД)
Ограничить
публичный доступ
Как-то ограничивать
разработчиков
Несколько советов
Динамические окружения
Минимизировать
использование ресурсов
Целиком в Kubernetes
(включая все СУБД)
Ограничить
публичный доступ
Как-то ограничивать
разработчиков
Deploy (auto)
Load: Seeds
Load: Nightly staging dump
Build
Build Deploy
Load: Nightly seeds (from master)
Динамические окружения
Deploy (auto)
Load: Seeds
Load: Nightly staging dump
Build
Build Deploy
Load: Nightly seeds (from master)
Stop environment
Динамические окружения
Тесты
8/8
Тесты / Анализ кода
build test
Тесты / Анализ кода
build test
run tests
Тесты / Тесты без окружения (Unit)
build test
Тесты / Тесты без окружения (Unit)
build test
Dockerfile
dockerbuild
Docker-
image
Тесты / Тесты без окружения (Unit)
build test
dockerbuild
Docker-
imageDockerfile
docker run
Docker-
image
+
Тесты / В окружении (Function, Integration)
build test
Тесты / В окружении (Function, Integration)
build test
Dockerfile
Тесты / В окружении (Function, Integration)
build test
Dockerfile
dockerbuild
Docker-
image
Тесты / В окружении (Function, Integration)
build test
Dockerfile
dockerbuild
Docker-
image
Docker
registry
Тесты / В окружении (Function, Integration)
build test
Dockerfile
dockerbuild
Docker-
image
Docker
registry
.helm
Тесты / В окружении (Function, Integration)
build test
Dockerfile
dockerbuild
Docker-
image
Docker
registry
.helm
helm install
Тесты / В окружении (Function, Integration)
build test
helm install
dockerbuild
Docker-
image
Job
Docker
registry
namespace: test-abc
Dockerfile
.helm
Тесты / В окружении (Function, Integration)
build test
helm install
dockerbuild
Docker-
image
helm delete --purge
Job
Docker
registry
namespace: test-abc
Dockerfile
.helm
Конец
Kubernetes + Helm
+ Gitlab
Kubernetes + Helm
+ Gitlab
Флант
24×7×365 L1/L2/L3/+ DevOps SLA
30+
24×7×365 L1/L2/L3/+ DevOps SLA
30+
… и по доступной цене
Наши Docker-проекты
github.com/flant/dapp
github.com/flant/loghouse
Дмитрий Столяров
dmitry.stolyarov@flant.ru
linkedin.com/in/distol
github.com/distol
Всем спасибо!
Наш блог на Хабрахабре
habrahabr.ru/company/flant/
Наш youtube-канал
youtube.com/c/flant
git operate
Dockerfile
.helm
backend.yaml
frontend.yaml
cron.yaml
dockerbuild
Docker-
image
Docker-
image
+
.gitlab-ci.yaml
tests
Docker
registry
build test release
helm install

Лучшие практики CI/CD с Kubernetes и GitLab / Дмитрий Столяров (Флант)