Основы контейнерной
виртуализации в Linux
Кирилл Кринкин
2
Namespace vs CGroups
● Namespace –
механизм изоляции
и группировки
структур данных
ядра.
● Control groups –
механизм изоляции
ресурсов ядра
3
Представление процесса в linux
include/linux/sched.h, include/linux/nsproxy.h
http://lxr.free-electrons.com/source/include/linux/sched.h#L1273
http://lxr.free-electrons.com/source/include/linux/nsproxy.h#L29
4
Namespaces API
● clone()
● unshare()
● setns()
5
clone / unshare
VS.
6
Namespaces
● Mount (_NEWNS)
● UTS (_NEWUTS)
● IPC (_NEWIPC)
● PID (_NEWPID)
● user (_NEWUSER)
7
Mount namespace
● mount namespace – копия дерева файловой
системы, ассоциированная с процессом
● Создание:
● Опции:
– распространение событий монтирования
– запрет перемонтирования
8
Флаги mount
– bind – смонтировать существующее дерево
в другую точку (поддерево будет доступно в
обоих местах)
Распространение изменений:
–make-shared
–make-slave
–make-private
–make-unbindable
Подробнее:
Documentation/filesystems/sharedsubtree.txt
9
Пример: приватное монтирование
10
UTS namespace
● Изоляция имени хоста и доменного имени
● utsname
● Создание:
11
Пример: создание UTS
см: namespaces/demo_uts_namespaces.c
12
Удержание пространства имен
#touch ./uts
#mount —bind /proc/6221/ns/uts ./uts
см: namespaces/ns_exec.c
# hostname
– thinkpad
#./ns_exec ./uts hostname
– newhostname
13
PID namespace
● Назначение: изоляция идентификаторов процессов
● Создание
● Возможности:
– миграция контейнеров с сохранением PIDs
– имитация init-процесса
– могут быть вложенными
14
Иерархия PIDNS
31
2
4
31 2
12
0
родитель
потомок
15
PIDs & TGIDs
16
Пример: PID namespace
● см: pidns_init_sleep.c
17
IPC namespace
● Изоляция ресурсов IPC (System V IPC) –
очередей сообщений, разделяемая память...
● Создание:
18
USER namespace
● Изоляция идентификаторов пользователей и групп
● Создание:
● Возможности:
– Предоставление привилегированных операций
непривилегированному пользователю внутри пространства
имен
– Отображение пользователей и групп
● /proc/sys/kernel/overflowuid
19
Пример: user namespace
● см: demo_userns.c
./demo_userns
20
Network namespace
● Изоляция сетевой конфигурации, интерфейсов, правил
марштуризации
● Создание:
Примеры (через ip):
– ip netns add netns1
– ip netns exec netns1 ip link list
– ip netns delete netns1
– ip netns exec netns1 ip link set dev lo up
– ip netns exec netns1 ping 127.0.0.1
21
Control groups
● Подсистемы Linux (немного истории)
● Иерархия ресурсов и контрольные группы
● Обзор контроллеров
● Примеры
22
Подсистема и контрольная группа
● Подсистема (subsystem) – модуль
предоставляющий возможности для группировки и
управления (ограничение, подсчет использования,...)
определенными ресурсами процессов.
● Контрольная группа (Control Group, cgroup) –
множество параметров, ассоциированное с одной
или более подсистем.
23
Иерархии ресурсов
Процесс:
- память
- процессор
- устройства
- ввод-вывод
- ...
Память(100%):
- процессы пользователей (30%)
- работники
- QA (5%)
- разработчики (15%)
- гости
- системные (10%)
- архиватор
- анализаторы логов
- службы (50%)
- почта (10%)
- продуктовая БД (40%)
Устройства:
- /dev/*
-- /dev/sda
– /dev/snd
CPUs 0-15:
- продуктовые сервисы 0-8
- пользователи: 9-12
- службы: 13-15
Процесс:
- память
- процессор
- устройства
- ввод-вывод
- ...
Процесс:
- память
- процессор
- устройства
- ввод-вывод
- ...
24
Подсистемы = контроллеры
● blkio – управление вводом выводом блочных устройств
● cpu – управление доступом к процессору
● cpuacc – отчеты по использованию процессора
● cpuset – приязка к процессорам и банкам памяти
● devices – доступ к устройствам
● freezer – останов/возобновление работы группы
● memory – ограничения и учет использования памяти
● net_cls – маркировка пакетов для контроллера трафика
25
Файлы cgroup
● /proc/cgroups
● /proc/self/cgroup – группы процесса
● /sys/fs/cgroup/ (/cgroup) – корень иерархии
● */tasks – PIDs участников группы
● */cgroup.procs – список thread groups
● */notify_on_release – флаг вызова агента
разрушения (по-умолчанию 0)
● */release_agent – путь к агенту разрушения
26
Подсистемы и точки
монтирования
27
cgcreate: cоздание группы
● cgcreate
-t uid:gid – пользователи получающие права на
перемещение заданий в(из) группу
-a uid:gid – пользователи получающие права на
управление параметрами группы
-g список подсистем (контроллеров):путь
● Пример
cgcreate -t kkv:kkv -g memory,cpu:/mycgroup
28
cgdelete: удаление группы
● cgdelete
-g список подсистем (контроллеров):путь
● Пример
cgdelete -g memory,cpu:/mycgroup
(*) при удалении группы, входящие в нее задачи
перемещаются в родительскую группу
29
Перемещение процессов в группу
● cgclassify
-g список подсистем (контроллеров):путь
PID [PID PID …]
Примеры:
$cgclassify -g cpu:/mycgroup 6433 3662
$echo 6433 >/sys/fs/cgroup/cpu/mucgroup/tasks
30
Выполнение процесса в группе
● cgexec
-g список подсистем (контроллеров):путь
имя_приложения
● Пример
cgexec -g memory:/mycgroup google-chrome
31
Группы процесса
32
cgget – доступ к параметрам
● cgget
-r параметр группа
Пример:
$cgget -r cpu.shares /mycgroup
>/mycgroup:
>cpu.shares: 1024
cat /sys/fs/cgroup/cpu/mycgroup/cpu.shares
>1024
33
cgset – установка параметров
● cgset
-r параметр=значение
Пример:
$cgset -r cpu.shares=8 /mycgroup
$echo 9 >/sys/fs/cgroup/cpu/mycgroup/cpu.shares
34
Контроллер cpuset
● Назначение: управление привязкой процессоров и
памяти к процессам
● ←/→ cpuset. cpus – список привязанных процессоров
● ←/→ cpuset. mems – список привязанных процессоров
● ←/→ cpuset. cpu_exclusive – флаг эксклюзивного
использования процессора группой
● ←/→ cpuset.sched_load_balance +
cpuset.sched_relax_domain_level – управление
балансировкой нагрузки в группе
try: cat /proc/self/status
35
cpuset.sched_relax_domain_level
● -1 – не менять внешние правила
● 0 – периодическая балансировка
● 1 – немедленная между потоками одного ядра
● 2 – немедленная между ядрами пакета
● 3 – немедленная в рамках узла
● 4 – немедленная между процессорами на NUMA
системе
● 5 – немедленная по всей системе
try: cat /proc/self/status
36
Контроллер cpu
● Назначение: управление распределеним
нагрузки на процессоры
cpu.shares – доля использования процессора по
отношению к другим группам
cpu.rt_runtime_us – максимальноый период
монопольного использования процессора в
микросекундах
cpu.rt_period_us – максимальное время
ожидания процессора группой
37
Контроллер cpuacct
● Назначение: сбор статистики по
использованию процессора
cpuacct.stat – число циклов процессора
cpuacct.usage – суммарное время
cpuacct.usage_percpu – число циклов
процессора, включая задания подгрупп
38
Контроллер devices
● Назначение: управление доступом к устройствам
из группы
→devices.allow – устройства доступные группе
→devices.deny – запрещенные устройства в группе
←devices.list – просмотр устройств в whitelist
Примеры:
echo 'c 1:3 mr' > /sys/fs/cgroup/1/devices.allow
echo a > /sys/fs/cgroup/1/devices.deny
echo a > /sys/fs/cgroup/1/devices.allow
https://www.kernel.org/doc/Documentation/devices.txt
39
Контроллер freezer
● Назначение: заморозка/разморозка исполнения
группы процессов
←/→freezer.state – состояние заморозки
● FROZEN — задания приостановлены
● FREEZING – в стадии приостановки (включая группы-потомки)
● THAWED – возобновление работы
● ←freezer.self_freezing собственное состояние
заморозки
● ←freezer.parent_freezing родительское состояние
состояние заморозки
40
Контроллер memory
● Назначение: управление и мониторинг использования памяти
←memory.stat – получение статистики по использованию памяти
– total_ – текущая группа и подгруппы
←memory.[memsw.]usage_in_bytes – используемая память в байтах
(в подкачке)
←/→memory.[memsw.]limit_in_bytes
←memory.[memsw.].failcnt – счетчик числа достижений лимита
памяти
←/→memory.oom_control — флаг разрешения OOM-killer
(*) ←/→memory.soft_limit_in_bytes — флаг разрешения OOM-killer
см https://www.kernel.org/doc/Documentation/cgroups/memory.txt
41
Контроллер blkio
● → blkio.weight – [100-1000], относительный вес ввода вывода в
группе
● → blkio.weight – [100-1000], относительный вес ввода вывода в
группе для конкретного устройства
● ← blkio.time – время доступа ввода-вывода в группе
● ← blkio.sectors – количество перемещенных между устройствами
секторов в группе
● ← blkio.io_service_bytes – количество перемещенных между
устройствами байт в группе
● ← blkio.io_service_time – время между выдачей запроса и его
завершением
● ← blkio.io_queued – число запросов в очереди ввода вывода группы
Виртуальные машины и контейнеры
Миссия
● Docker:
– простой и лекговесный путь от модели к
реальности
– минимизация риска падения приложений при
переносе из окружения разработки в «боевые
условия»
– Ускорение code->test->deploy->use
Технические компоненты
● libcontainer format
● kernel namespaces
– fs isolation
– process isolation
– network isolation
● CoW FS
● логирование STDOUT, STDIN,STDERR
● CLI
● GUI (сторонние разработки)
Базовые механизмы Linux
Контейнер Docker
● Формат образа
● Набор стандартных операций
● Исполнительная среда
Метафора: контейнер содержит образ
программного обеспечения – груз, и над ним
возможны операции: создание, старт,
останов...
Установка
– ядро 3.8+
– x64
– Хранилище:
● Device Mapper
●
AUFS
● vfs
● btrfs
– curl
● sudo sh -c "echo deb https://get.docker.io/ubuntu docker main
>/etc/apt/sources.list.d/docker.list"
● curl -s https://get.docker.io/gpg | sudo apt-key add -
● sudo apt-get update && sudo apt-get install lxc-docker
● sudo docker info
Hello world #1
#docker
#docker version
#docker search tutorial
#docker pull learn/tutorial
#docker run echo "Hello world"
run & start
● -t псевдотерминал
● -i оставить STDIN открытым
● имя образа
● команда (например /bin/bash)
Основные команды
● create
● run
● start
● stop
● inspect
● diff
Создание образа
● Действия в контейнере + commit
●
Dockerfile + build
– FROM
– MAINTAINER
– RUN
– CMD
– EXPOSE
– VOLUME
– ...
ex:
#docker build --rm -t repo:image .
Аналогия с git
● docker diff
● docker commit
● docker pull
● docker push
Хранилище образов
54
Для чтения
● RHEL System resources management guide
● https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt
● https://www.kernel.org/doc/Documentation/cgroups/memory.txt
● https://www.docker.com/
● https://www.docker.com/tryit/
● http://hub.docker.com
● http://www.netpatch.ru/research/docker/2014/03.24-linux-docker-practica
l-guide.html
● James Turnbull «The Docker Book»
● http://www.ibm.com/developerworks/library/l-mount-namespaces/
● http://lwn.net/Articles/531114/
● https://github.com/krinkin/oslinux-seminars-2015/

Linuxvirt seminar-csc-2015

  • 1.
  • 2.
    2 Namespace vs CGroups ●Namespace – механизм изоляции и группировки структур данных ядра. ● Control groups – механизм изоляции ресурсов ядра
  • 3.
    3 Представление процесса вlinux include/linux/sched.h, include/linux/nsproxy.h http://lxr.free-electrons.com/source/include/linux/sched.h#L1273 http://lxr.free-electrons.com/source/include/linux/nsproxy.h#L29
  • 4.
    4 Namespaces API ● clone() ●unshare() ● setns()
  • 5.
  • 6.
    6 Namespaces ● Mount (_NEWNS) ●UTS (_NEWUTS) ● IPC (_NEWIPC) ● PID (_NEWPID) ● user (_NEWUSER)
  • 7.
    7 Mount namespace ● mountnamespace – копия дерева файловой системы, ассоциированная с процессом ● Создание: ● Опции: – распространение событий монтирования – запрет перемонтирования
  • 8.
    8 Флаги mount – bind– смонтировать существующее дерево в другую точку (поддерево будет доступно в обоих местах) Распространение изменений: –make-shared –make-slave –make-private –make-unbindable Подробнее: Documentation/filesystems/sharedsubtree.txt
  • 9.
  • 10.
    10 UTS namespace ● Изоляцияимени хоста и доменного имени ● utsname ● Создание:
  • 11.
    11 Пример: создание UTS см:namespaces/demo_uts_namespaces.c
  • 12.
    12 Удержание пространства имен #touch./uts #mount —bind /proc/6221/ns/uts ./uts см: namespaces/ns_exec.c # hostname – thinkpad #./ns_exec ./uts hostname – newhostname
  • 13.
    13 PID namespace ● Назначение:изоляция идентификаторов процессов ● Создание ● Возможности: – миграция контейнеров с сохранением PIDs – имитация init-процесса – могут быть вложенными
  • 14.
  • 15.
  • 16.
    16 Пример: PID namespace ●см: pidns_init_sleep.c
  • 17.
    17 IPC namespace ● Изоляцияресурсов IPC (System V IPC) – очередей сообщений, разделяемая память... ● Создание:
  • 18.
    18 USER namespace ● Изоляцияидентификаторов пользователей и групп ● Создание: ● Возможности: – Предоставление привилегированных операций непривилегированному пользователю внутри пространства имен – Отображение пользователей и групп ● /proc/sys/kernel/overflowuid
  • 19.
    19 Пример: user namespace ●см: demo_userns.c ./demo_userns
  • 20.
    20 Network namespace ● Изоляциясетевой конфигурации, интерфейсов, правил марштуризации ● Создание: Примеры (через ip): – ip netns add netns1 – ip netns exec netns1 ip link list – ip netns delete netns1 – ip netns exec netns1 ip link set dev lo up – ip netns exec netns1 ping 127.0.0.1
  • 21.
    21 Control groups ● ПодсистемыLinux (немного истории) ● Иерархия ресурсов и контрольные группы ● Обзор контроллеров ● Примеры
  • 22.
    22 Подсистема и контрольнаягруппа ● Подсистема (subsystem) – модуль предоставляющий возможности для группировки и управления (ограничение, подсчет использования,...) определенными ресурсами процессов. ● Контрольная группа (Control Group, cgroup) – множество параметров, ассоциированное с одной или более подсистем.
  • 23.
    23 Иерархии ресурсов Процесс: - память -процессор - устройства - ввод-вывод - ... Память(100%): - процессы пользователей (30%) - работники - QA (5%) - разработчики (15%) - гости - системные (10%) - архиватор - анализаторы логов - службы (50%) - почта (10%) - продуктовая БД (40%) Устройства: - /dev/* -- /dev/sda – /dev/snd CPUs 0-15: - продуктовые сервисы 0-8 - пользователи: 9-12 - службы: 13-15 Процесс: - память - процессор - устройства - ввод-вывод - ... Процесс: - память - процессор - устройства - ввод-вывод - ...
  • 24.
    24 Подсистемы = контроллеры ●blkio – управление вводом выводом блочных устройств ● cpu – управление доступом к процессору ● cpuacc – отчеты по использованию процессора ● cpuset – приязка к процессорам и банкам памяти ● devices – доступ к устройствам ● freezer – останов/возобновление работы группы ● memory – ограничения и учет использования памяти ● net_cls – маркировка пакетов для контроллера трафика
  • 25.
    25 Файлы cgroup ● /proc/cgroups ●/proc/self/cgroup – группы процесса ● /sys/fs/cgroup/ (/cgroup) – корень иерархии ● */tasks – PIDs участников группы ● */cgroup.procs – список thread groups ● */notify_on_release – флаг вызова агента разрушения (по-умолчанию 0) ● */release_agent – путь к агенту разрушения
  • 26.
  • 27.
    27 cgcreate: cоздание группы ●cgcreate -t uid:gid – пользователи получающие права на перемещение заданий в(из) группу -a uid:gid – пользователи получающие права на управление параметрами группы -g список подсистем (контроллеров):путь ● Пример cgcreate -t kkv:kkv -g memory,cpu:/mycgroup
  • 28.
    28 cgdelete: удаление группы ●cgdelete -g список подсистем (контроллеров):путь ● Пример cgdelete -g memory,cpu:/mycgroup (*) при удалении группы, входящие в нее задачи перемещаются в родительскую группу
  • 29.
    29 Перемещение процессов вгруппу ● cgclassify -g список подсистем (контроллеров):путь PID [PID PID …] Примеры: $cgclassify -g cpu:/mycgroup 6433 3662 $echo 6433 >/sys/fs/cgroup/cpu/mucgroup/tasks
  • 30.
    30 Выполнение процесса вгруппе ● cgexec -g список подсистем (контроллеров):путь имя_приложения ● Пример cgexec -g memory:/mycgroup google-chrome
  • 31.
  • 32.
    32 cgget – доступк параметрам ● cgget -r параметр группа Пример: $cgget -r cpu.shares /mycgroup >/mycgroup: >cpu.shares: 1024 cat /sys/fs/cgroup/cpu/mycgroup/cpu.shares >1024
  • 33.
    33 cgset – установкапараметров ● cgset -r параметр=значение Пример: $cgset -r cpu.shares=8 /mycgroup $echo 9 >/sys/fs/cgroup/cpu/mycgroup/cpu.shares
  • 34.
    34 Контроллер cpuset ● Назначение:управление привязкой процессоров и памяти к процессам ● ←/→ cpuset. cpus – список привязанных процессоров ● ←/→ cpuset. mems – список привязанных процессоров ● ←/→ cpuset. cpu_exclusive – флаг эксклюзивного использования процессора группой ● ←/→ cpuset.sched_load_balance + cpuset.sched_relax_domain_level – управление балансировкой нагрузки в группе try: cat /proc/self/status
  • 35.
    35 cpuset.sched_relax_domain_level ● -1 –не менять внешние правила ● 0 – периодическая балансировка ● 1 – немедленная между потоками одного ядра ● 2 – немедленная между ядрами пакета ● 3 – немедленная в рамках узла ● 4 – немедленная между процессорами на NUMA системе ● 5 – немедленная по всей системе try: cat /proc/self/status
  • 36.
    36 Контроллер cpu ● Назначение:управление распределеним нагрузки на процессоры cpu.shares – доля использования процессора по отношению к другим группам cpu.rt_runtime_us – максимальноый период монопольного использования процессора в микросекундах cpu.rt_period_us – максимальное время ожидания процессора группой
  • 37.
    37 Контроллер cpuacct ● Назначение:сбор статистики по использованию процессора cpuacct.stat – число циклов процессора cpuacct.usage – суммарное время cpuacct.usage_percpu – число циклов процессора, включая задания подгрупп
  • 38.
    38 Контроллер devices ● Назначение:управление доступом к устройствам из группы →devices.allow – устройства доступные группе →devices.deny – запрещенные устройства в группе ←devices.list – просмотр устройств в whitelist Примеры: echo 'c 1:3 mr' > /sys/fs/cgroup/1/devices.allow echo a > /sys/fs/cgroup/1/devices.deny echo a > /sys/fs/cgroup/1/devices.allow https://www.kernel.org/doc/Documentation/devices.txt
  • 39.
    39 Контроллер freezer ● Назначение:заморозка/разморозка исполнения группы процессов ←/→freezer.state – состояние заморозки ● FROZEN — задания приостановлены ● FREEZING – в стадии приостановки (включая группы-потомки) ● THAWED – возобновление работы ● ←freezer.self_freezing собственное состояние заморозки ● ←freezer.parent_freezing родительское состояние состояние заморозки
  • 40.
    40 Контроллер memory ● Назначение:управление и мониторинг использования памяти ←memory.stat – получение статистики по использованию памяти – total_ – текущая группа и подгруппы ←memory.[memsw.]usage_in_bytes – используемая память в байтах (в подкачке) ←/→memory.[memsw.]limit_in_bytes ←memory.[memsw.].failcnt – счетчик числа достижений лимита памяти ←/→memory.oom_control — флаг разрешения OOM-killer (*) ←/→memory.soft_limit_in_bytes — флаг разрешения OOM-killer см https://www.kernel.org/doc/Documentation/cgroups/memory.txt
  • 41.
    41 Контроллер blkio ● →blkio.weight – [100-1000], относительный вес ввода вывода в группе ● → blkio.weight – [100-1000], относительный вес ввода вывода в группе для конкретного устройства ● ← blkio.time – время доступа ввода-вывода в группе ● ← blkio.sectors – количество перемещенных между устройствами секторов в группе ● ← blkio.io_service_bytes – количество перемещенных между устройствами байт в группе ● ← blkio.io_service_time – время между выдачей запроса и его завершением ● ← blkio.io_queued – число запросов в очереди ввода вывода группы
  • 42.
  • 43.
    Миссия ● Docker: – простойи лекговесный путь от модели к реальности – минимизация риска падения приложений при переносе из окружения разработки в «боевые условия» – Ускорение code->test->deploy->use
  • 44.
    Технические компоненты ● libcontainerformat ● kernel namespaces – fs isolation – process isolation – network isolation ● CoW FS ● логирование STDOUT, STDIN,STDERR ● CLI ● GUI (сторонние разработки)
  • 45.
  • 46.
    Контейнер Docker ● Форматобраза ● Набор стандартных операций ● Исполнительная среда Метафора: контейнер содержит образ программного обеспечения – груз, и над ним возможны операции: создание, старт, останов...
  • 47.
    Установка – ядро 3.8+ –x64 – Хранилище: ● Device Mapper ● AUFS ● vfs ● btrfs – curl ● sudo sh -c "echo deb https://get.docker.io/ubuntu docker main >/etc/apt/sources.list.d/docker.list" ● curl -s https://get.docker.io/gpg | sudo apt-key add - ● sudo apt-get update && sudo apt-get install lxc-docker ● sudo docker info
  • 48.
    Hello world #1 #docker #dockerversion #docker search tutorial #docker pull learn/tutorial #docker run echo "Hello world"
  • 49.
    run & start ●-t псевдотерминал ● -i оставить STDIN открытым ● имя образа ● команда (например /bin/bash)
  • 50.
    Основные команды ● create ●run ● start ● stop ● inspect ● diff
  • 51.
    Создание образа ● Действияв контейнере + commit ● Dockerfile + build – FROM – MAINTAINER – RUN – CMD – EXPOSE – VOLUME – ... ex: #docker build --rm -t repo:image .
  • 52.
    Аналогия с git ●docker diff ● docker commit ● docker pull ● docker push
  • 53.
  • 54.
    54 Для чтения ● RHELSystem resources management guide ● https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt ● https://www.kernel.org/doc/Documentation/cgroups/memory.txt ● https://www.docker.com/ ● https://www.docker.com/tryit/ ● http://hub.docker.com ● http://www.netpatch.ru/research/docker/2014/03.24-linux-docker-practica l-guide.html ● James Turnbull «The Docker Book» ● http://www.ibm.com/developerworks/library/l-mount-namespaces/ ● http://lwn.net/Articles/531114/ ● https://github.com/krinkin/oslinux-seminars-2015/