Docker 17.03: новая схема версий, CE vs EE и что это значит для наших плейбуков
Docker сменил схему версионирования на YY.MM и разделил дистрибутив на CE и EE. Разбираем что это меняет в Ansible-ролях и как выбрать правильную версию для закрепления.
Docker объявил смену версионирования на YY.MM и разделение на Community Edition и Enterprise Edition - первый релиз по новой схеме выйдет как 17.03
На этой неделе Docker Inc. объявила о двух вещах сразу: смене схемы версионирования и разделении на два продукта - Community Edition и Enterprise Edition. Следующий релиз выйдет как 17.03, а не 1.14. Для большинства команд это административная новость, но у нас сразу возник конкретный вопрос: что делать с docker_version: "1.13.1" в Ansible-роли?
Что именно изменилось
Версионирование. Вместо 1.x теперь YY.MM - как у Ubuntu LTS, только без «long-term» в самом номере. Первый релиз по новой схеме - 17.03, выйдет в марте. Следующий через месяц - 17.04, и так далее ежемесячно. Раз в квартал один из месячных релизов будет объявлен «стабильным» - с более длинным окном поддержки.
Community Edition vs Enterprise Edition. CE - бесплатный, доступен как раньше через apt/yum. EE - платный, добавляет встроенный оркестратор (Swarm с UI), сканирование образов на уязвимости, support от Docker Inc. и сертификацию на конкретных ОС. По сути EE это то, что раньше продавалось как Docker Datacenter.
Поддержка. CE в стабильном квартальном цикле получает патчи два месяца после следующего квартального релиза. CE в месячном цикле - только до следующего месячного. EE поддерживается год.
Почему это создаёт головную боль
Мы закрепляем версию Docker в Ansible-роли явно. Не latest, а конкретный тег - это базовая гигиена для воспроизводимости. С 1.12, 1.13 это работало понятно: цифра в переменной, плюс проверка через docker --version.
Теперь логика установки из репозитория изменится. Сейчас репозиторий Docker на Ubuntu выглядит как deb https://apt.dockerproject.org/repo .... С выходом 17.03 они переезжают на новые адреса - отдельные для CE и EE. Официальная инструкция уже показывает download.docker.com/linux/ubuntu. Это значит - переписывать роль в любом случае, не только менять переменную.
Конкретно наша роль делает примерно следующее:
- name: install docker
apt:
name: "docker-engine={{ docker_version }}"
state: present
После перехода пакет называется docker-ce, не docker-engine. Если просто поменять переменную и оставить старый репозиторий - сломается. Если поменять репозиторий и оставить старый пакет - тоже сломается. Нужно обновлять синхронно.
Что мы решили делать
Разобрали варианты:
-
Закреплять месячный CE. Обновлять чаще, но каждый месяц есть свежие патчи. Проблема - надо успевать тестировать роль и выкатывать на объекты между релизами, иначе всегда будешь на N-1 без понимания что упускаешь.
-
Закреплять квартальный CE. Два месяца поддержки после следующего квартального выпуска - примерно пять месяцев на версию. Это ближе к нашему темпу. Обновления раз в квартал мы осилим без аврала.
-
EE. Год поддержки выглядит привлекательно. Но цена и необходимость договора с Docker Inc. для большинства наших объектов избыточны - мы управляем небольшими инсталляциями без нужды в Datacenter-фичах.
Выбрали квартальный CE. 17.03 станет первым кандидатом - подождём неделю-две после выхода, посмотрим на первые issue, потом обновим роль и прогоним на тестовом стенде.
Что конкретно меняем в роли
Переменная переедет с docker_version типа 1.13.1 на формат 17.03.0~ce-0~ubuntu-xenial - именно такой формат имени пакета в новом репозитории. Некрасиво, но это реальное имя в apt-cache show.
Репозиторий - новый URL, новый GPG-ключ, задача на удаление старого docker-engine перед установкой docker-ce. Плюс проверка через assert что установленная версия совпадает с ожидаемой - лучше упасть явно, чем молча поехать не на той версии.
- name: assert docker version matches
command: docker --version
register: docker_ver_out
failed_when: docker_version not in docker_ver_out.stdout
changed_when: false
Это не изменение архитектуры роли, просто обязательная переработка под новую реальность.
Про EE честно
Идея «Docker с поддержкой год» для продакшена звучит хорошо. Но в текущем виде EE это платформа вокруг Swarm, а на нескольких наших объектах мы смотрим в сторону Kubernetes. Платить за встроенный Swarm-оркестратор когда планируешь уходить на k8s - сомнительно. Посмотрим как Docker разведёт позиционирование этих двух вещей в ближайшие кварталы.
На сопровождении у нас семь объектов с Docker. Роль обновим до выхода 17.03 - с новым репозиторием и структурой, чтобы в день релиза была просто замена переменной с версией, а не авральный рефакторинг.
- Terraform 0.8: модули, S3-бекенд и первый HCL-репозиторий в продакшене · 9 февраля 2017
- Ansible 2.2: переписываем библиотеку ролей под стабильный include_role · 17 января 2017