linuxvirt seminar-csc-2015

54
Основы контейнерной виртуализации в Linux Кирилл Кринкин

Upload: kirill-krinkin

Post on 06-Aug-2015

66 views

Category:

Software


0 download

TRANSCRIPT

Основы контейнерной виртуализации в 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#L1273http://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/