Как devops исчерпывает себя,
и что будет дальше
Кирилл Вечера
Следующее поколение моделей
управления программными
системами
51
Кирилл Вечера
Руководитель проекта jetware.org
Автоматизация управления программными систем
Сборка, конфигурация, тестирование, деплой, обновление
Ранее
Системное программирование: Solaris, FreeBSD, Linux
Администрирование серверов и сетей: Unix, OSPF, BGP
Разработка интернет-сервисов: C, Perl, Java, Python, Ruby
В докладе
Эволюция управления информационными
системами
Какие сейчас есть средства и какие появляются
Как мы этому способствуем
Почему девопс становится ненужным
Большая
100 — 100 000 серверов
Сложная
10 — 100 приложений
10 — 1000 связей
100 — 10 000 библиотек и программ
Растущая
0.1 — 100 обновлений в день
Современная система
Проблема
Управлять
Обновлять
Диагностировать
Оптимизировать
Чинить
Способы организации систем
Централизованная
система
Распределенная
жестко связанная
система
Распределенная
свободно связанная
система
Монолитная система
Фиксированная конфигурация
Все в одном экземпляре
Сервисы
Связи
Потеря сервиса или связи
нарушает работу всей системы
Мощность ограничена
Распределенная система
Связанные компоненты
Компонент
Один сервис или несколько разных
сервисов вместе
Сервисы
Один или несколько экземпляров
сервиса
Макроуровень
Микроуровень
Макроуровень
Типы компонентов —
сервисы
Топология — связи между
компонентами
Микроуровень
Внутреннее устройство
компонента
Программы, библиотеки,
настройки, данные
Связи между внутренними
сервисами
Компонент внутри —
монолитная подсистема
Распределенная жестко связанная система
Все предопределено
Связи между сервисами
Привязка к оборудованию
Добавление/удаление компонентов
Реакция на аварию
Управление
Централизованное
Связи планирует и назначает
администратор
Распределенная свободно связанная система
Все может меняться
Связи между сервисами
Привязка к оборудованию
Добавление/удаление
компонентов или связей
Управление
Постоянное
Автоматическое
Централизованное
Эволюция управления системами
1. Руки
2. Скрипты
3. Инструменты
Одинаково — и монолитные системы, и жестко
связанные распределенные системы
Дальше?
Переход на свободно связанные системы
Управление системой расслаивается
Нужно средство управления на макроуровне
Нужно средство управления на микроуровне
Свободно связанная система
Минимальные требования
Автоматическое управление
Привязка к оборудованию
Добавление/удаление
компонентов
Изменение связей
Минимальные требования к компоненту
Переносимость
Тиражируемость
Интерфейс
Изоляция от соседей
Абстракция от оборудования
Данные хранить отдельно
Связь для других сервисов
AWS сделали привычными
Разделение на сервисы
Неизменные образы виртуальных машин
Хранение данных отдельно
Несколько экземпляров сервиса
Docker
Среда для PaaS
Инструмент разработчика
Средство запуска сервиса
Docker-контейнер как компонент системы
Легковесная замена виртуальной машины
Изоляция приложений и зависимостей
Интерфейс — сеть и данные
Стимулирует использовать immutable image
Dockerfile
Быстрая сборка и тиражируемость
Выполнены все требования к компоненту
свободно связанной системы
Эволюция управления распределенными
системами – на макроуровне
1. Руки
2. Скрипты
3. Инструменты
4. Оркестрация
5. Самоорганизация
Управление распределенными системами
4. Оркестрация Процесс
Проектирование
Планирование
Тестирование
Воплощение
Арсенал
Kubernetes, Marathon, Docker Swarm
mode
Эволюция управления компонентами –
микроуровень, монолитная система
1. Руки
2. Скрипты
3. Инструменты
4. ???
5. Самоорганизация
Эволюция управления системами
Макроуровень
Оркестрация
Микроуровень
Docker ???
Сервис в Docker-контейнере
Можно подумать, что внутри...
На самом деле
Эволюция управления системами
Распределенной системой, макроуровень
Сервисным приложением, микроуровень
Docker
Kubernetes
Микроуровень, приложение-сервис
Часто обновляется
Много зависимостей (компонентов)
Программы, библиотеки, данные
Версии зависимостей
Интеграция компонентов
Настройки
Интерфейс на макроуровень
Docker для управления микроуровнем
Простой способ заготовки (provisioning)
Dockerfile: shell, deb/rpm, chef/puppet/salt
Быстрый способ обновления: слои
Интерфейс на макроуровень: руками
Интеграция компонентов
Микросервисы: отдельные контейнеры, руками
Начинающийся проект
Старт с чистого листа
Своего кода — 0
Выбрали окружение
Пишем код, встраиваемся в окружение
Оборудования мало, сервисов мало
Пользователей мало
Можем лежать, можем глючить
Подойдет Dockerfile с shell-командами
Начинающийся проект
Переусложнение
Docker
IaC
Оркестрация
Devops
Достаточны
rsync или git pull
Работающий проект
Много
своего кода
разработчиков и команд
чужих компонентов
настроек
оборудования
Разнообразно
Долгая история
Разные компоненты
И создаются в разное время
Постоянно обновляется
Нельзя
Лежать
Глючить
Проблемы
Несовместимость версий
баги и изменения API в новых версиях
баги и уязвимости в старых версиях
Человеческие ошибки
при обновлении
внутренних настроек
в информации для оркестрации
Беспечный ездок
Разработчик программ для корпоративных
клиентов
Непрерывное тестирование и сборка приложений
Беспечный ездок
Профиль работы
Кастомные программные решения
Business intelligence
Несколько сотен проектов
Общие компоненты
Кастомизация для заказчика
Влиты несколько компаний
Беспечный ездок
Основной софт
Oracle, SAP Hana, PostgreSQL, MySQL
Java, C++, Python, JavaScript, PHP
Еще
R, Excel, ImageMagick, по мелочи другого
ОС
RHEL/Oracle Linux + свои патчи для JRE, libc, OMP и другого
Windows (уменьшается)
Беспечный ездок
Поставка клиенту
SaaS
Виртуальные машины
.exe + jar
RPM-пакеты
Беспечный ездок
Было
Cистема
X build серверов
Разные ОС
Управление
Скрипты — make, shell, python
Jenkins
Puppet
Беспечный ездок
Проблемы
Плохое тестирование
Долго ждать результат редко тестируется→
Несовпадение тестового и рабочего окружения
Ошибки при работе софта у заказчика
Часто ломался процесс сборки
Много ручного труда
Беспечный ездок
Что нужно
Хорошо контролируемая среда
SaaS, Виртуальные машины
Качественная сборка и тестирование
Воспроизводимая сборка
Быстрая сборка
Минимальное ручное вмешательство
Похожее на Maven и Gradle
Беспечный ездок
Варианты
Juju Charms
Nix
Nix пакеты
Описание пакета
Имена пакетов-зависимостей
Правила сборки
Собранный пакет - чистая функция от
Правил сборки
Собранных зависимостей
Исходного кода
Конфигурационных значений
Nix
Все состоит из пакетов
Каждый пакет
Отдельный каталог
Read-only
Собирается по зависимостям
или устанавливается уже собранное из репозитория
Nix – пользовательское окружение
Точка объединения нескольких nix-пакетов
Каждое окружение — в отдельном read-only каталоге
Каждая комбинация пакетов — отдельное окружение
Установка или удаление пакета
Создание нового окружение копированием текущего
Добавление или удаление пакета
Переключение текущего окружения на новое (замена симлинка)
Nix – пользовательское окружение
Структура окружения повторяет FHS
Есть bin, etc, lib, include, share, libexec
Нет var - ведь read-only
Симлинки из окружения на файлы в пакетах
Nix: пользовательское окружение
~/.nix-profile
/nix/store/0123-user-env
bin
share man man8
mysqld
mysqld.8.gz
php
/nix/store/4567-mysql-5.5.50 bin mysqld
share man man8 mysqld.8.gz
share man man8 mysqld.8.gz
/nix/store/89ab-php-5.6.1 bin php
Беспечный ездок
Сейчас
Оборудование (SaaS & CI)
~ 180 машин у себя (поровну SaaS & CI)
< 200 машин в AWS (в основном CI)
500 — 2000 контейнеров
Управление
Nix + Docker + Kubernetes
Jenkins
Puppet
Беспечный ездок
Проблемы Nix
Нет версий
Пересборка всех потребителей при изменении зависимости
Долго ждать результата — бывает до 2 часов
Nix: пересборка при изменении аргументов
mysql: libc openssl
0123-libc 4567-openssl → 89ab-mysql
Пропатчили libc → cdef-libc
cdef-libc 4567-openssl → 3210-mysql
Беспечный ездок
Что искать
Имеет плюсы Nix
Автоматическая сборка
Зависимости
Изоляция
Воспроизводимость
Не трогает то, что работает
Версии, подпроекты
Беспечный ездок
Варианты
Habitat
Snappy
Gentoo
Jetware
Jetware vs Nix, что общего
Состоит из пакетов
Read-only
С версиями
С вариантами сборки
Пакеты с зависимостями
Автоматическое подключение
Автоматическая сборка
Конфигурационные переменные пакетов
Jetware vs Nix, чем отличается
Чем отличается
Пакеты — не чистые функции
Зависимости — пакеты, версии, условия версий, роли
Самоинтеграция пакетов
Пакеты инкапсулированы
экспортируют в окружение и другие пакеты минимум
Окружение хранит контекст
настройки, данные
Jetware: Рабочее окружения
Точка подключения пакетов
Хранение настроек и данных пакетов
Отвязано от операционной системы
работает непосредственно в любой ОС
libc — пакет
Jetware: Рабочее окружение
Пакеты — снаружи
Пакеты — неймспейсы
Все хранится в пакетах
Каталог пакета — read-only
Данные и конфигурация
— внутри
bin
lib
var log
etc
tmp run
libc
Конфигурация
окружения
Jetware: Экспорт в рабочее окружение
Неизменяемые данные
Только минимум
bin, lib
Симлинками
bin
lib
var log
etc
tmp run
libc
Jetware: Экспорт в рабочее окружение
Изменяемые данные
Копируются в окружение
Отдельные секции
Свой собственный FHS
bin
lib
var log
etc
tmp run
libc
Взаимодействие пакетов
Экспорт данных в другие пакеты
Отношение, данные, соглашение или API
Пример: пакеты экспортируют свои C-headers пакету cc
Значения переменных других пакетов
Пример: пакет mongodb_tuning указывает mongodb.port=22333
Роли пакетов
Пакет имеет роль
Идентификация пакета
Для файлов
Для связей пакетов
Для экспорта данных
Для переменных
Роль - класс
percona-mysqld
mariadb-mysqld
myrocks
mysqld
mysqld
Абстрактная роль
Общий аспект разных ролей
Частично реализованный интерфейс
Один API для разных ролей
Реализация для присутствующей роли
Одно отношение пакета для всех
реализаций
www
bitrix
apache
nginx
lighttpd
Беспечный ездок
Демонстрационная установка Jetware
Сборка по зависимостям и версиям
Собственных подпроектов
Компоненты третьих сторон (JRE, libc и другие библиотеки)
Репозитории testing staging→
Сборка и настройка Docker-контейнера
40 — 500 пакетов
1.5 — 20 секунд
Беспечный ездок
Ожидается
Оборудование (SaaS & CI)
~ 120 машин у себя (на CI - 30)
< ? машин в AWS
Управление
Jetware + Docker + Kubernetes
Jenkins
Puppet
Эволюция управления системами
Макроуровень
Оркестрация
Микроуровень
Самосборка
Что будет дальше?
Слияние управления на макроуровне и
микроуровне
~ 1 — 3 года
Жизненный цикл сервиса
Dev (разработчик)
Исходный код + библиотеки
Компиляция, сборка
Интеграция с зависимостями
Тестирование
Экспорт в образ
Разворачивание
Переключение нагрузки
???
Оркестрация
Нужна ли ОС программе?
Программе нужны
Ядро для выполнения syscall
Файловая система
Рабочее окружение
Библиотеки и исполняемые файлы
Другие данные-ресурсы
Окружение операционной системы — не нужно
Должна ли программа встраиваться в ОС?
Для обращения к программе нужно
Знать, где она находится
Передавать ей входные данные
Получить от нее выходные
Программа может быть где угодно — ОС не нужна
Тесная связь ОС и приложений
Историческое наследие
Влияние дистрибутивов Linux
Автономная программа
Программа
Не привязана к ОС
Описывает требования к рабочему окружению
Зависимости на пакеты и версии
Зависимости на ресурсы и сервисы
Рабочее окружение как процесс
Адресное пространство процесса
Каталог с рабочим окружением
Сегменты кода
read-only в каталогах пакета
Сегменты данных
в изменяемых каталогах рабочего окружения
Динамическая линковка библиотек
Подключение к нему всех пакетов-зависимостей
Пакет как shared библиотека
Библиотека
Файлы .so и .a
ELF сегменты кода и данных
Dynamic linking секции
Пакет
Read-only каталог
Файлы в каталоге
Зависимости пакета
Тогда что такое автономная программа?
Имя с версией
Зависимости для работы
Интерфейс
Какие ресурсы требует
Какие ресурсы предоставляет
Сценарий сборки (опционально)
Исходники
Зависимости для сборки
Управление на макроуровне
Объект диспетчеризации
Приложение: имя и версия
Запуск программы
Сборка пакета или получение из репозитория
Создание рабочего окружения
Деплой и запуск сервиса
Помещение данных интерфейса в service discovery
Эволюция управления системами
Макроуровень и микроуровень интегрируются
Роботы вытесняют девопсов
Разрабочики и администраторы возвращаются к
более интеллектуальному труду
Ну а потом?
Еще несколько лет и
Пятая ступень эволюции - самоорганизация
Как devops исчерпывает себя,
и что будет дальше
Кирилл Вечера
http://jetware.org
Skype: kirill.vechera
cv-c@jetware.org

Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)