Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Docker в работе: взгляд на его использование в Badoo через год / Турецкий Антон (Badoo)

2,398 views

Published on

Мы в Badoo используем Docker больше года и на нашем примере попробуем поговорить о возможных моделях его применения.
+ 85% наших сервисов работают в контейнерах: для чего и почему мы перенесли свои сервисы в контейнеры.
+ Как мы подходим к сборке образов? Базовый образ: используем слои, следим за системными обновлениями.
+ Автоматизация процесса сборки образов с нашими сервисами: Jira flow, Teamcity и другие страшные для админа слова.
+ Лучшее ли место для тестирования production? Путь образа от сборки до Production.
+ baDocker: webUI своими руками: зачем и почему?
+ Как дать возможность управлять запущенными сервисами и их версиями разработчику.
+ Docker: мониторинг и анализ работающих контейнеров.

Published in: Engineering
  • Be the first to comment

Docker в работе: взгляд на его использование в Badoo через год / Турецкий Антон (Badoo)

  1. 1. Docker в работе: взгляд на использование в Badoo через год Антон Турецкий
  2. 2. Вопросы: год назад, а актуальны по сей день…
  3. 3. Docker: WTF?
  4. 4. Предыстория Docker VS Puppet: Заменит ли Docker Puppet?
  5. 5. Предыстория Virtualization VS Containerization: Docker – еще одна виртуализация?
  6. 6. Предыстория Docker: silver bullet? THERE WILL BE NO SILVER BULLET. RATHER IT WILL BE A COMBINATION OF TECHNOLOGIES. Andrew Gould(c)
  7. 7. Вопрос Docker: нужен ли?
  8. 8. #1: о наболевшем
  9. 9. #1: Сервис -> Сервер
  10. 10. #1: Миграция Сервиса
  11. 11. #1: Миграция Docker
  12. 12. #1: Миграция Docker #1: Отвязать Application от OS
  13. 13. ДЦ: подумай о железе!
  14. 14. #2: capacity planning • + Место в стойке
  15. 15. #2: capacity planning • + Место в стойке • + Порты на сетевом оборудовании
  16. 16. #2: capacity planning • + Место в стойке • + Порты на сетевом оборудовании • + Экономия электроэнергии
  17. 17. #2: capacity planning • + Место в стойке • + Порты на сетевом оборудовании • + Экономия электроэнергии • -/+ SPoF
  18. 18. #3: единое окружение
  19. 19. #4* $ cat ./Dockerfile FROM dockerio.badoo.com/itops/sles_12_base:latest COPY sle-12.puppet.repo /etc/zypp/repos.d/ RUN zypper -q -n in puppetdb COPY database.ini /etc/puppetlabs/puppetdb/conf.d/database.ini COPY jetty.ini /etc/puppetlabs/puppetdb/conf.d/jetty.ini COPY ssl/ /etc/puppetlabs/puppetdb/ssl/ #Service start/stop COPY run-puppetdb /etc/services.d/puppetserver/run COPY finish-puppetdb /etc/services.d/puppetserver/finish ENTRYPOINT ["/init"]
  20. 20. Грабли
  21. 21. Грабли: (r)?syslog(-ng)? syslog into container
  22. 22. Грабли: (r)?syslog(-ng)? syslog into container • “One container – One Service”
  23. 23. Грабли: (r)?syslog(-ng)? syslog into container • “One container – One Service” • Поддержка в работающем состоянии
  24. 24. Грабли: (r)?syslog(-ng)? syslog into container • “One container – One Service” • Поддержка в работающем состоянии • Нет времени объяснять – нужно сделать!
  25. 25. Грабли: (r)?syslog(-ng)? syslog into container • “One container – One Service” • Поддержка в работающем состоянии • Нет времени объяснять – нужно сделать! Решение: docker run -v /dev/log:/dev/log
  26. 26. Грабли: (r)?syslog(-ng)? docker run -v /dev/log:/dev/log • УРА!!! Всё работает, сообщения уходят!
  27. 27. Грабли: (r)?syslog(-ng)? docker run -v /dev/log:/dev/log • УРА!!! Всё работает, сообщения уходят! • … до первого изменения/перезапуска syslog на хост-системе…
  28. 28. Грабли: (r)?syslog(-ng)? docker run -v /dev/log:/dev/log • УРА!!! Всё работает, сообщения уходят! • … до первого изменения/перезапуска syslog на хост-системе… Решение: syslog into container
  29. 29. Грабли: mounts Прокинуть “что-то” с хост ОС
  30. 30. Грабли: mounts Прокинуть “что-то” с хост ОС • /proc/mounts в контейнере
  31. 31. Грабли: mounts Прокинуть “что-то” с хост ОС • /proc/mounts в контейнере • umount /dev/something (хост ОС)
  32. 32. Грабли: mounts Прокинуть “что-то” с хост ОС • /proc/mounts в контейнере • umount /dev/something (хост ОС) • umount /dev/something (container)
  33. 33. Грабли: mounts Прокинуть “что-то” с хост ОС • /proc/mounts в контейнере • umount /dev/something (хост ОС) • umount /dev/something (container) • container restart …
  34. 34. Грабли: mounts Решение: • docker run --privileged
  35. 35. Грабли: mounts Решение: • docker run --privileged • 100 раз подумать: так ли необходимо?
  36. 36. Грабли: mounts Решение: • docker run --privileged • 100 раз подумать: так ли необходимо? • избегать использование “динамических точек монтирования”
  37. 37. Грабли: NAT iptables, nf_conntrack
  38. 38. Грабли: NAT Как можно решать: • Увеличить таблицу conntrack
  39. 39. Грабли: NAT Как можно решать: • Увеличить таблицу conntrack • Увеличить hashsize ~ conntrack / 8
  40. 40. Грабли: NAT Как можно решать: • Увеличить таблицу conntrack • Увеличить hashsize ~ conntrack / 8 • Вспомнить про conntrack_generic_timeout = 600
  41. 41. Грабли: NAT Как можно решать: • Увеличить таблицу conntrack • Увеличить hashsize ~ conntrack / 8 • Вспомнить про conntrack_generic_timeout = 600 • Ждать когда “бомбанёт”
  42. 42. Грабли: NAT Решение: • Делать свой bridge, Open vSwitch, Weave etc
  43. 43. Грабли: NAT Решение: • Делать свой bridge, Open vSwitch, Weave etc • Использовать хост ОС docker run --net=host без использования conntrack
  44. 44. Грабли: Storage Driver AuFS Device Mapper (thinp) BTRFS и прочие вкусности и сладости…
  45. 45. Грабли: BTRFS • root of docker MUST be on a BTRFS
  46. 46. Грабли: BTRFS • root of docker MUST be on a BTRFS • Запись на диск сразу не идет, сначала – в журнал (Performance ~ native / 2)
  47. 47. Грабли: 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
  48. 48. Грабли: BTRFS BTRFS – это то немногое, что действительно нормально работает
  49. 49. Грабли: Storage Driver Решение: OverlayFS
  50. 50. Грабли: Storage Driver Решение: OverlayFS • Hardlink на одинаковые файлы
  51. 51. Грабли: Storage Driver Решение: OverlayFS • Hardlink на одинаковые файлы • Performance: RW ~ Native Speed
  52. 52. Грабли: Storage Driver Решение: OverlayFS • Hardlink на одинаковые файлы • Performance: RW ~ Native Speed • Space Usage – больше не загадка!
  53. 53. Грабли: Misc • Больше ОДНОГО сервиса в контейнере
  54. 54. Грабли: Misc • Больше ОДНОГО сервиса в контейнере - свой ENTRYPOINT
  55. 55. Грабли: Misc • Больше ОДНОГО сервиса в контейнере - свой ENTRYPOINT РЕШЕНИЕ: S6 http://skarnet.org/software/s6/
  56. 56. Грабли: Misc • Больше ОДНОГО сервиса в контейнере - свой ENTRYPOINT РЕШЕНИЕ: S6 http://skarnet.org/software/s6/ • несколько FROM в одном Dockerfile “FROM can appear multiple times within a single Dockerfile"
  57. 57. Грабли: Misc • Больше ОДНОГО сервиса в контейнере - свой ENTRYPOINT РЕШЕНИЕ: S6 http://skarnet.org/software/s6/ • несколько FROM в одном Dockerfile “FROM can appear multiple times within a single Dockerfile” • docker exec Version < 1.8
  58. 58. Важный совет… не забывать искать свою проблему тут: Changelog Issues GitHub
  59. 59. Сервис в контейнере
  60. 60. Docker Base Image • Обновления (Bug fixes, Security fixes, Patches etc)
  61. 61. Docker Base Image • Обновления (Bug fixes, Security fixes, Patches etc) docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a'
  62. 62. Docker Base Image • Обновления (Bug fixes, Security fixes, Patches etc) docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’ • “Требуется внимание оператора” => Jira Task
  63. 63. Docker Base Image • Обновления (Bug fixes, Security fixes, Patches etc) docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’ • “Требуется внимание оператора” => Jira Task • Обновление базового образа
  64. 64. Docker Base Image • Обновления (Bug fixes, Security fixes, Patches etc) docker run -it --rm sles_12_base:latest sh -c 'zypper lu -a’ • “Требуется внимание оператора” => Jira Task • Обновление базового образа(+контейнеры)
  65. 65. 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)
  66. 66. docker_build
  67. 67. docker_build • Сгенерировать структуру директорий, конфиги
  68. 68. docker_build • Сгенерировать структуру директорий, конфиги • Сгенерировать инструкцию(Dockerfile_source)
  69. 69. docker_build • Сгенерировать структуру директорий, конфиги • Сгенерировать инструкцию(Dockerfile_source) • Доставить исполняемые файлы
  70. 70. docker_build • Сгенерировать структуру директорий, конфиги • Сгенерировать инструкцию(Dockerfile_source) • Доставить исполняемые файлы • Выполнить сборку
  71. 71. docker_build • Сгенерировать структуру директорий, конфиги • Сгенерировать инструкцию(Dockerfile_source) • Доставить исполняемые файлы • Выполнить сборку • Отправить результат в Registry(y/n)
  72. 72. docker_build • Сгенерировать структуру директорий, конфиги • Сгенерировать инструкцию(Dockerfile_source) • Доставить исполняемые файлы • Выполнить сборку • Отправить результат в Registry(y/n) • Сообщить о результате * Обязательно: работать в режиме cli
  73. 73. docker_build
  74. 74. Мониторинг
  75. 75. Мониторинг: контейнер • Docker CLI внутри
  76. 76. Мониторинг: контейнер • Docker CLI внутри • Снимаем то же, что и docker stats: CPU/MEM
  77. 77. Мониторинг: контейнер • Docker CLI внутри • Снимаем то же, что и docker stats: CPU/MEM • SAR: $ sar -A -s %s 60 1 -f /var/log/sa/sa%s
  78. 78. Мониторинг: контейнер • Docker CLI внутри • Снимаем то же, что и docker stats: CPU/MEM • SAR: $ sar -A -s %s 60 1 -f /var/log/sa/sa%s • Отсылаем всё в Graphite
  79. 79. Мониторинг: контейнер • Docker CLI внутри • Снимаем то же, что и docker stats: CPU/MEM • SAR: $ sar -A -s %s 60 1 -f /var/log/sa/sa%s • Отсылаем всё в Graphite • Мониторим контейнер и его статус Zabbix’ом
  80. 80. Grafana: Host, Mem
  81. 81. Grafana: Host, CPU
  82. 82. Grafana: Host, Net
  83. 83. Grafana: Container, Mem
  84. 84. Grafana: Container, CPU
  85. 85. baDocker: webUI
  86. 86. baDocker: Требования • Clientless
  87. 87. baDocker: Требования • Clientless • Управление OpenRegistry (v1, v2)
  88. 88. baDocker: Требования • Clientless • Управление OpenRegistry (v1, v2) • Информация о - хостах - контейнерах - сервисах, версиях
  89. 89. baDocker: Требования • Clientless • Управление OpenRegistry (v1, v2) • Информация о - хостах - контейнерах - сервисах, версиях • Планировщик заданий
  90. 90. baDocker: Требования • Clientless • Управление OpenRegistry (v1, v2) • Информация о - хостах - контейнерах - сервисах, версиях • Планировщик заданий • Dashboard
  91. 91. baDocker: Hosts Summary
  92. 92. baDocker: Host Details
  93. 93. baDocker: Terminal
  94. 94. baDocker: Service
  95. 95. baDocker: Service HowTo
  96. 96. Postmortem Заключение • Искать свой подход – не наступать на наши грабли
  97. 97. Postmortem Заключение • Искать свой подход – не наступать на наши грабли • Велосипед – это отлично, если колеса круглые
  98. 98. Спасибо Антон Турецкий a.turetsky@corp.badoo.com @tyrchenok @BadooDev http://habrahabr.ru/company/badoo/ Вопросы?

×