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.

Linuxvirt seminar-csc-2015

494 views

Published on

CSCenter seminar slides april 2015

Published in: Software
  • Be the first to comment

  • Be the first to like this

Linuxvirt seminar-csc-2015

  1. 1. Основы контейнерной виртуализации в Linux Кирилл Кринкин
  2. 2. 2 Namespace vs CGroups ● Namespace – механизм изоляции и группировки структур данных ядра. ● Control groups – механизм изоляции ресурсов ядра
  3. 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. 4 Namespaces API ● clone() ● unshare() ● setns()
  5. 5. 5 clone / unshare VS.
  6. 6. 6 Namespaces ● Mount (_NEWNS) ● UTS (_NEWUTS) ● IPC (_NEWIPC) ● PID (_NEWPID) ● user (_NEWUSER)
  7. 7. 7 Mount namespace ● mount namespace – копия дерева файловой системы, ассоциированная с процессом ● Создание: ● Опции: – распространение событий монтирования – запрет перемонтирования
  8. 8. 8 Флаги mount – bind – смонтировать существующее дерево в другую точку (поддерево будет доступно в обоих местах) Распространение изменений: –make-shared –make-slave –make-private –make-unbindable Подробнее: Documentation/filesystems/sharedsubtree.txt
  9. 9. 9 Пример: приватное монтирование
  10. 10. 10 UTS namespace ● Изоляция имени хоста и доменного имени ● utsname ● Создание:
  11. 11. 11 Пример: создание UTS см: namespaces/demo_uts_namespaces.c
  12. 12. 12 Удержание пространства имен #touch ./uts #mount —bind /proc/6221/ns/uts ./uts см: namespaces/ns_exec.c # hostname – thinkpad #./ns_exec ./uts hostname – newhostname
  13. 13. 13 PID namespace ● Назначение: изоляция идентификаторов процессов ● Создание ● Возможности: – миграция контейнеров с сохранением PIDs – имитация init-процесса – могут быть вложенными
  14. 14. 14 Иерархия PIDNS 31 2 4 31 2 12 0 родитель потомок
  15. 15. 15 PIDs & TGIDs
  16. 16. 16 Пример: PID namespace ● см: pidns_init_sleep.c
  17. 17. 17 IPC namespace ● Изоляция ресурсов IPC (System V IPC) – очередей сообщений, разделяемая память... ● Создание:
  18. 18. 18 USER namespace ● Изоляция идентификаторов пользователей и групп ● Создание: ● Возможности: – Предоставление привилегированных операций непривилегированному пользователю внутри пространства имен – Отображение пользователей и групп ● /proc/sys/kernel/overflowuid
  19. 19. 19 Пример: user namespace ● см: demo_userns.c ./demo_userns
  20. 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. 21 Control groups ● Подсистемы Linux (немного истории) ● Иерархия ресурсов и контрольные группы ● Обзор контроллеров ● Примеры
  22. 22. 22 Подсистема и контрольная группа ● Подсистема (subsystem) – модуль предоставляющий возможности для группировки и управления (ограничение, подсчет использования,...) определенными ресурсами процессов. ● Контрольная группа (Control Group, cgroup) – множество параметров, ассоциированное с одной или более подсистем.
  23. 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. 24 Подсистемы = контроллеры ● blkio – управление вводом выводом блочных устройств ● cpu – управление доступом к процессору ● cpuacc – отчеты по использованию процессора ● cpuset – приязка к процессорам и банкам памяти ● devices – доступ к устройствам ● freezer – останов/возобновление работы группы ● memory – ограничения и учет использования памяти ● net_cls – маркировка пакетов для контроллера трафика
  25. 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. 26. 26 Подсистемы и точки монтирования
  27. 27. 27 cgcreate: cоздание группы ● cgcreate -t uid:gid – пользователи получающие права на перемещение заданий в(из) группу -a uid:gid – пользователи получающие права на управление параметрами группы -g список подсистем (контроллеров):путь ● Пример cgcreate -t kkv:kkv -g memory,cpu:/mycgroup
  28. 28. 28 cgdelete: удаление группы ● cgdelete -g список подсистем (контроллеров):путь ● Пример cgdelete -g memory,cpu:/mycgroup (*) при удалении группы, входящие в нее задачи перемещаются в родительскую группу
  29. 29. 29 Перемещение процессов в группу ● cgclassify -g список подсистем (контроллеров):путь PID [PID PID …] Примеры: $cgclassify -g cpu:/mycgroup 6433 3662 $echo 6433 >/sys/fs/cgroup/cpu/mucgroup/tasks
  30. 30. 30 Выполнение процесса в группе ● cgexec -g список подсистем (контроллеров):путь имя_приложения ● Пример cgexec -g memory:/mycgroup google-chrome
  31. 31. 31 Группы процесса
  32. 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. 33 cgset – установка параметров ● cgset -r параметр=значение Пример: $cgset -r cpu.shares=8 /mycgroup $echo 9 >/sys/fs/cgroup/cpu/mycgroup/cpu.shares
  34. 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. 35 cpuset.sched_relax_domain_level ● -1 – не менять внешние правила ● 0 – периодическая балансировка ● 1 – немедленная между потоками одного ядра ● 2 – немедленная между ядрами пакета ● 3 – немедленная в рамках узла ● 4 – немедленная между процессорами на NUMA системе ● 5 – немедленная по всей системе try: cat /proc/self/status
  36. 36. 36 Контроллер cpu ● Назначение: управление распределеним нагрузки на процессоры cpu.shares – доля использования процессора по отношению к другим группам cpu.rt_runtime_us – максимальноый период монопольного использования процессора в микросекундах cpu.rt_period_us – максимальное время ожидания процессора группой
  37. 37. 37 Контроллер cpuacct ● Назначение: сбор статистики по использованию процессора cpuacct.stat – число циклов процессора cpuacct.usage – суммарное время cpuacct.usage_percpu – число циклов процессора, включая задания подгрупп
  38. 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. 39 Контроллер freezer ● Назначение: заморозка/разморозка исполнения группы процессов ←/→freezer.state – состояние заморозки ● FROZEN — задания приостановлены ● FREEZING – в стадии приостановки (включая группы-потомки) ● THAWED – возобновление работы ● ←freezer.self_freezing собственное состояние заморозки ● ←freezer.parent_freezing родительское состояние состояние заморозки
  40. 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. 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. 42. Виртуальные машины и контейнеры
  43. 43. Миссия ● Docker: – простой и лекговесный путь от модели к реальности – минимизация риска падения приложений при переносе из окружения разработки в «боевые условия» – Ускорение code->test->deploy->use
  44. 44. Технические компоненты ● libcontainer format ● kernel namespaces – fs isolation – process isolation – network isolation ● CoW FS ● логирование STDOUT, STDIN,STDERR ● CLI ● GUI (сторонние разработки)
  45. 45. Базовые механизмы Linux
  46. 46. Контейнер Docker ● Формат образа ● Набор стандартных операций ● Исполнительная среда Метафора: контейнер содержит образ программного обеспечения – груз, и над ним возможны операции: создание, старт, останов...
  47. 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. 48. Hello world #1 #docker #docker version #docker search tutorial #docker pull learn/tutorial #docker run echo "Hello world"
  49. 49. run & start ● -t псевдотерминал ● -i оставить STDIN открытым ● имя образа ● команда (например /bin/bash)
  50. 50. Основные команды ● create ● run ● start ● stop ● inspect ● diff
  51. 51. Создание образа ● Действия в контейнере + commit ● Dockerfile + build – FROM – MAINTAINER – RUN – CMD – EXPOSE – VOLUME – ... ex: #docker build --rm -t repo:image .
  52. 52. Аналогия с git ● docker diff ● docker commit ● docker pull ● docker push
  53. 53. Хранилище образов
  54. 54. 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/

×