Docker в работе: взгляд на его использование в Badoo через...

Preview:

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 Заключение• Искать свой подход – не наступать на наши грабли• Велосипед – это отлично, если колеса круглые

Спасибо

Антон Турецкийa.turetsky@corp.badoo.com

@tyrchenok@BadooDev

http://habrahabr.ru/company/badoo/

Вопросы?

Recommended