Click here to load reader
Upload
ontico
View
1.837
Download
5
Embed Size (px)
Citation preview
Docker в работе: взгляд на использование в Badoo через годАнтон Турецкий
Вопросы: год назад, а актуальны по сей день…
Docker: WTF?
ПредысторияDocker VS Puppet: Заменит ли Docker Puppet?
ПредысторияVirtualization VS Containerization:Docker – еще одна виртуализация?
ПредысторияDocker: silver bullet?
THERE WILL BE NO SILVER BULLET.RATHER IT WILL BE A COMBINATION OF TECHNOLOGIES.
Andrew Gould(c)
ВопросDocker: нужен ли?
#1: о наболевшем
#1: Сервис -> Сервер
#1: Миграция Сервиса
#1: Миграция Docker
#1: Миграция Docker
#1: Отвязать Application от OS
ДЦ: подумай о железе!
#2: capacity planning• + Место в стойке
#2: capacity planning• + Место в стойке• + Порты на сетевом оборудовании
#2: capacity planning• + Место в стойке• + Порты на сетевом оборудовании• + Экономия электроэнергии
#2: capacity planning• + Место в стойке• + Порты на сетевом оборудовании• + Экономия электроэнергии• -/+ SPoF
#3: единое окружение
#4* $ cat ./DockerfileFROM dockerio.badoo.com/itops/sles_12_base:latest
COPY sle-12.puppet.repo /etc/zypp/repos.d/RUN zypper -q -n in puppetdbCOPY database.ini /etc/puppetlabs/puppetdb/conf.d/database.iniCOPY jetty.ini /etc/puppetlabs/puppetdb/conf.d/jetty.iniCOPY ssl/ /etc/puppetlabs/puppetdb/ssl/#Service start/stopCOPY run-puppetdb /etc/services.d/puppetserver/runCOPY finish-puppetdb /etc/services.d/puppetserver/finish
ENTRYPOINT ["/init"]
Грабли
Грабли: (r)?syslog(-ng)?syslog into container
Грабли: (r)?syslog(-ng)?syslog into container• “One container – One Service”
Грабли: (r)?syslog(-ng)?syslog into container• “One container – One Service”• Поддержка в работающем состоянии
Грабли: (r)?syslog(-ng)?syslog into container• “One container – One Service”• Поддержка в работающем состоянии• Нет времени объяснять – нужно сделать!
Грабли: (r)?syslog(-ng)?syslog into container• “One container – One Service”• Поддержка в работающем состоянии• Нет времени объяснять – нужно сделать!
Решение:docker run -v /dev/log:/dev/log
Грабли: (r)?syslog(-ng)?docker run -v /dev/log:/dev/log• УРА!!! Всё работает, сообщения уходят!
Грабли: (r)?syslog(-ng)?docker run -v /dev/log:/dev/log• УРА!!! Всё работает, сообщения уходят!• … до первого изменения/перезапуска
syslog на хост-системе…
Грабли: (r)?syslog(-ng)?docker run -v /dev/log:/dev/log• УРА!!! Всё работает, сообщения уходят!• … до первого изменения/перезапуска
syslog на хост-системе…
Решение:syslog into container
Грабли: mountsПрокинуть “что-то” с хост ОС
Грабли: mountsПрокинуть “что-то” с хост ОС• /proc/mounts в контейнере
Грабли: mountsПрокинуть “что-то” с хост ОС• /proc/mounts в контейнере• umount /dev/something (хост ОС)
Грабли: mountsПрокинуть “что-то” с хост ОС• /proc/mounts в контейнере• umount /dev/something (хост ОС)• umount /dev/something (container)
Грабли: mountsПрокинуть “что-то” с хост ОС• /proc/mounts в контейнере• umount /dev/something (хост ОС)• umount /dev/something (container)• container restart …
Грабли: mountsРешение:• docker run --privileged
Грабли: mountsРешение:• docker run --privileged• 100 раз подумать: так ли необходимо?
Грабли: mountsРешение:• docker run --privileged• 100 раз подумать: так ли необходимо?• избегать использование
“динамических точек монтирования”
Грабли: NATiptables, nf_conntrack
Грабли: NATКак можно решать:• Увеличить таблицу conntrack
Грабли: NATКак можно решать:• Увеличить таблицу conntrack• Увеличить hashsize ~ conntrack / 8
Грабли: NATКак можно решать:• Увеличить таблицу conntrack• Увеличить hashsize ~ conntrack / 8• Вспомнить про
conntrack_generic_timeout = 600
Грабли: NATКак можно решать:• Увеличить таблицу conntrack• Увеличить hashsize ~ conntrack / 8• Вспомнить про
conntrack_generic_timeout = 600• Ждать когда “бомбанёт”
Грабли: NATРешение:• Делать свой bridge, Open vSwitch, Weave etc
Грабли: NATРешение:• Делать свой bridge, Open vSwitch, Weave etc• Использовать хост ОС
docker run --net=host
без использования conntrack
Грабли: Storage DriverAuFS
Device Mapper (thinp)
BTRFS
и прочие вкусности и сладости…
Грабли: BTRFS• root of docker MUST be on a BTRFS
Грабли: BTRFS• root of docker MUST be on a BTRFS• Запись на диск сразу не идет, сначала – в журнал
(Performance ~ native / 2)
Грабли: BTRFS• root of docker MUST be on a BTRFS• Запись на диск сразу не идет, сначала – в журнал
(Performance ~ native / 2)• “No space left on device”
# btrfs fi show /var/lib/docker# btrfs fi balance start /var/lib/docker
Грабли: BTRFS
BTRFS – это то немногое, что действительно нормально работает
Грабли: Storage DriverРешение: OverlayFS
Грабли: Storage DriverРешение: OverlayFS
• Hardlink на одинаковые файлы
Грабли: Storage DriverРешение: OverlayFS
• Hardlink на одинаковые файлы• Performance: RW ~ Native Speed
Грабли: Storage DriverРешение: OverlayFS
• Hardlink на одинаковые файлы• Performance: RW ~ Native Speed• Space Usage – больше не загадка!
Грабли: Misc• Больше ОДНОГО сервиса в контейнере
Грабли: Misc• Больше ОДНОГО сервиса в контейнере
- свой ENTRYPOINT
Грабли: Misc• Больше ОДНОГО сервиса в контейнере
- свой ENTRYPOINTРЕШЕНИЕ: S6 http://skarnet.org/software/s6/
Грабли: Misc• Больше ОДНОГО сервиса в контейнере
- свой ENTRYPOINTРЕШЕНИЕ: S6 http://skarnet.org/software/s6/
• несколько FROM в одном Dockerfile“FROM can appear multiple times within a single Dockerfile"
Грабли: Misc• Больше ОДНОГО сервиса в контейнере
- свой ENTRYPOINTРЕШЕНИЕ: S6 http://skarnet.org/software/s6/
• несколько FROM в одном Dockerfile“FROM can appear multiple times within a single Dockerfile”
• docker exec Version < 1.8
Важный совет…не забывать искать свою проблему тут:
Changelog
Issues
GitHub
Сервис в контейнере
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)
docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a'
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’
• “Требуется внимание оператора” => Jira Task
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’
• “Требуется внимание оператора” => Jira Task• Обновление базового образа
Docker Base Image
• Обновления (Bug fixes, Security fixes, Patches etc)docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’
• “Требуется внимание оператора” => Jira Task• Обновление базового образа(+контейнеры)
Docker Images
• Обновления (Bug fixes, Security fixes, Patches etc)docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’
• “Требуется внимание оператора” => Jira Task• Обновление базового образа(+контейнеры)• Следить за “свежестью пакетов” перед выкладкой
сервиса/образа (RPM based)
docker_build
docker_build• Сгенерировать структуру директорий, конфиги
docker_build• Сгенерировать структуру директорий, конфиги• Сгенерировать инструкцию(Dockerfile_source)
docker_build• Сгенерировать структуру директорий, конфиги• Сгенерировать инструкцию(Dockerfile_source)• Доставить исполняемые файлы
docker_build• Сгенерировать структуру директорий, конфиги• Сгенерировать инструкцию(Dockerfile_source)• Доставить исполняемые файлы• Выполнить сборку
docker_build• Сгенерировать структуру директорий, конфиги• Сгенерировать инструкцию(Dockerfile_source)• Доставить исполняемые файлы• Выполнить сборку• Отправить результат в Registry(y/n)
docker_build• Сгенерировать структуру директорий, конфиги• Сгенерировать инструкцию(Dockerfile_source)• Доставить исполняемые файлы• Выполнить сборку• Отправить результат в Registry(y/n)• Сообщить о результате
* Обязательно: работать в режиме cli
docker_build
Мониторинг
Мониторинг: контейнер• Docker CLI внутри
Мониторинг: контейнер• Docker CLI внутри• Снимаем то же, что и docker stats: CPU/MEM
Мониторинг: контейнер• Docker CLI внутри• Снимаем то же, что и docker stats: CPU/MEM• SAR:
$ sar -A -s %s 60 1 -f /var/log/sa/sa%s
Мониторинг: контейнер• Docker CLI внутри• Снимаем то же, что и docker stats: CPU/MEM• SAR:
$ sar -A -s %s 60 1 -f /var/log/sa/sa%s• Отсылаем всё в Graphite
Мониторинг: контейнер• Docker CLI внутри• Снимаем то же, что и docker stats: CPU/MEM• SAR:
$ sar -A -s %s 60 1 -f /var/log/sa/sa%s• Отсылаем всё в Graphite• Мониторим контейнер и его статус Zabbix’ом
Grafana: Host, Mem
Grafana: Host, CPU
Grafana: Host, Net
Grafana: Container, Mem
Grafana: Container, CPU
baDocker: webUI
baDocker: Требования• Clientless
baDocker: Требования• Clientless• Управление OpenRegistry (v1, v2)
baDocker: Требования• Clientless• Управление OpenRegistry (v1, v2)• Информация о
- хостах- контейнерах- сервисах, версиях
baDocker: Требования• Clientless• Управление OpenRegistry (v1, v2)• Информация о
- хостах- контейнерах- сервисах, версиях
• Планировщик заданий
baDocker: Требования• Clientless• Управление OpenRegistry (v1, v2)• Информация о
- хостах- контейнерах- сервисах, версиях
• Планировщик заданий• Dashboard
baDocker: Hosts Summary
baDocker: Host Details
baDocker: Terminal
baDocker: Service
baDocker: Service HowTo
Postmortem Заключение• Искать свой подход – не наступать на наши грабли
Postmortem Заключение• Искать свой подход – не наступать на наши грабли• Велосипед – это отлично, если колеса круглые
Спасибо
Антон Турецкий[email protected]
@tyrchenok@BadooDev
http://habrahabr.ru/company/badoo/
Вопросы?