Post on 13-Apr-2017
Docker & Badoo: никогда не останавливайся на
достигнутом
Антон ТурецкийСистемный инженер, Badoo
@tyrchenok
Citius, altius, fortius!
• 300 000 000 пользователей• ~ 3000 серверов• 200 из 250 Docker хостов• 1046 запущенных
контейнеров
Docker: Why..?
Single Environment
Docker: Why..?
Single EnvironmentMonolithic
Docker: Why..?
Single EnvironmentMonolithicRollback guarantee
Docker: Why..?
Single EnvironmentMonolithicRollback guaranteeResource utilisation
Docker main thing
Docker storage driver
AuFSOut of kernelShare memory
Docker storage driver
AuFSOut of kernelShare memory
DevicemapperIn mainline kernelKnows everyone
Docker storage driver
AuFSOut of kernelShare memory
DevicemapperIn mainline kernelKnows everyone
BTRFSIn mainline kernel
Docker storage driver
AuFSOut of kernelShare memory
DevicemapperIn mainline kernelKnows everyone
BTRFSIn mainline kernel
ZFSKernel moduleStability
Docker storage driver
AuFSOut of kernelShare memory
DevicemapperIn mainline kernelKnows everyone
BTRFSIn mainline kernel
ZFSKernel moduleStability
OverlayFSKernel >= 3.18Fast
Device Mapper(theory)
• CoW on block level
Device Mapper(theory)
• CoW on block level• Each container/image gets its own block device
Device Mapper(theory)
• CoW on block level• Each container/image gets its own block device• Snapshot at any given time
Device Mapper(in practice)
• Mountpoint is only mounted when the container is running
Device Mapper(in practice)
• Mountpoint is only mounted when the container is running
• The data is stored in two files: data & metadata
Device Mapper(in practice)
• Mountpoint is only mounted when the container is running
• The data is stored in two files: data & metadata• Docker puts data and metadata on a loop device backed by a
sparse file
Device Mapper(in practice)
• Mountpoint is only mounted when the container is running
• The data is stored in two files: data & metadata• Docker puts data and metadata on a loop device backed
by a sparse file
Example about performance
Device Mapper(на деле)
Device Mapper(на деле)
• Развалилось довольно быстро
Device Mapper(на деле)
• Развалилось довольно быстро• Идём дальше!
BTRFS
BTRFS(theory)
• CoW at the filesystem level
BTRFS(theory)
• CoW at the filesystem level• Create subvolume like mkdir :)
BTRFS(theory)
• CoW at the filesystem level• Create subvolume like mkdir :)• Docker root must be BTRFS filesystem
BTRFS(theory)
• CoW at the filesystem level• Create subvolume like mkdir :)• Docker root must be BTRFS filesystem• Snapshot at any given time
BTRFS(in practice)
• Mountpoint should be present even if the container is not running
BTRFS(in practice)
• Mountpoint should be present even if the container is not running
• Performance ~ native/2 (data goes to the journal first)
BTRFS(на деле)
Неподготовленному пользователю крайне не рекомендуется трогать
btrfs tools
“Наши руки не для скуки!”
BTRFS(на деле)
• Единственное нормально работающее (~ 1.5 года назад)
BTRFS(на деле)
• Единственное нормально работающее
• Мы живём с этим уже 2+ года!
OverlayFS(in practice)
• Performance ~ native
OverlayFS(in practice)
• Performance ~ native• Use the same EXT partition
OverlayFS(in practice)
• Performance ~ native• Use the same EXT partition• Native tools for manage
OverlayFS(keep in mind)
• high inode usage
• module called “overlay”
Грабли: docker pull
Грабли: docker pull(результат)
• Падение docker демона
Грабли: docker pull(результат)
• Падение docker демона
• “Радость”Operations Team
Грабли: docker pull(результат)
Лучший патч, что я видел!
Misc
EXT4 hardlink limit
65 534
Error response from daemon: could not find image: no such id: b33b714e8dd29b3d9d5ffde6568fc2e90b86ab9fe5aaea33fb057487df
Что мы еще сделали?
Monitoring container, который шлёт статистику в Graphite
Что мы еще сделали?
docker_build
для сборки образов в (полу-)автоматическом режиме
Что мы еще сделали?
Docker для сборки RPM (мы знаем про OBS, да)
Что мы еще сделали?
Docker для сборки RPM (мы знаем про OBS, да)
- запуск “свежего” образа- установка зависимостей- сборка по spec файлу- получили пакет
Что мы еще сделали?
**baDocker – оркестрация (в вечной разработке)
baDockerЧто у нас есть/было? Что хотели?
baDockerЧто у нас есть/было?
• Сервисы и их типы• Версии• Серверы
Что хотели?
baDockerЧто у нас есть/было?
• Сервисы и их типы• Версии• Серверы
Что хотели?
Стоп/СтартОбновлениеВсякое разное и WebUI
• Client Less
• Client Less• Get/Set data
viadocker API
• Client Less• Get/Set data
viadocker API
• Монстр!
baDocker #2
• Что изменилось?• Почему так?
baDocker #2
• Docker socket: упрощаем взаимодействие
baDocker #2
• Docker socket: упрощаем взаимодействие
• Puppet Facts: они уже есть
baDocker #2
• Docker socket: упрощаем взаимодействие
• Puppet Facts: они уже есть
• Как это теперь работает?
Зачем всё это было?
• Видим цель – идём к ней!
Зачем всё это было?
• Видим цель – идём к ней!• Чужой опыт – это полезно!
Зачем всё это было?
• Видим цель – идём к ней!• Чужой опыт – это полезно!• Можешь лучше – сделай!
Вопросы?Антон Турецкий
a.turetsky@corp.badoo.com@tyrchenok@BadooDev
http://habrahabr.ru/company/badoo/https://tech.badoo.com/
предыдущие доклады про Docker: https://goo.gl/KcIhwG