введение
PouchContainer — это продукт среды выполнения контейнеров с открытым исходным кодом от Alibaba. Последняя версия — 0.3.0. Кодовый адрес:GitHub.com/Alibaba/Анатомия…. PouchContainer поддерживает LXCFS с самого начала, чтобы обеспечить надежную изоляцию контейнеров. Linux использует технологию cgroup для достижения изоляции ресурсов.Однако файловая система хоста /proc по-прежнему смонтирована в контейнере.Когда пользователь читает /proc/meminfo и другие файлы в контейнере, получается информация о хосте. отсутствует в контейнере/proc 视图隔离
Это принесет ряд проблем, которые замедлят или препятствуют контейнеризации корпоративного бизнеса. LXCFS (github.com/lxc/lxcfs) — это файловая система FUSE с открытым исходным кодом для разрешения/proc 视图隔离
Проблема заставляет контейнеры вести себя как традиционные виртуальные машины на уровне представления. В этой статье сначала представлены применимые бизнес-сценарии LXCFS, затем анализируется принцип LXCFS и, наконец, кратко рассказывается об интеграции LXCFS в PouchContainer.
Бизнес-сценарии LXCFS
В эпоху физических и виртуальных машин компания постепенно сформировала собственный набор цепочек инструментов, таких как компиляция и упаковка, развертывание приложений, унифицированный мониторинг и т. д. Эти инструменты обеспечили стабильные услуги для приложений, развернутых на физических и виртуальных машинах. машины. . Далее будет подробно объяснена роль LXCFS в вышеупомянутом процессе бизнес-контейнеризации с точки зрения инструментов мониторинга, эксплуатации и обслуживания, а также развертывания приложений.
Инструменты мониторинга и эксплуатации
Большинство инструментов мониторинга полагаются на файловую систему /proc для системной информации. Взяв в качестве примера Alibaba, некоторые из основных инструментов мониторинга Alibaba реализуются через tsar (GitHub.com/Alibaba/TSA…) Собирать информацию. Сбор информации о памяти и ЦП с помощью tsar зависит от файловой системы /proc. Мы можем загрузить исходный код tsar и посмотреть, как tsar использует некоторые файлы в каталоге /proc:
$ git remote -v
origin https://github.com/alibaba/tsar.git (fetch)
origin https://github.com/alibaba/tsar.git (push)
$ grep -r cpuinfo .
./modules/mod_cpu.c: if ((ncpufp = fopen("/proc/cpuinfo", "r")) == NULL) {
:tsar letty$ grep -r meminfo .
./include/define.h:#define MEMINFO "/proc/meminfo"
./include/public.h:#define MEMINFO "/proc/meminfo"
./info.md:内存的计数器在/proc/meminfo,里面有一些关键项
./modules/mod_proc.c: /* read total mem from /proc/meminfo */
./modules/mod_proc.c: fp = fopen("/proc/meminfo", "r");
./modules/mod_swap.c: * Read swapping statistics from /proc/vmstat & /proc/meminfo.
./modules/mod_swap.c: /* read /proc/meminfo */
$ grep -r diskstats .
./include/public.h:#define DISKSTATS "/proc/diskstats"
./info.md:IO的计数器文件是:/proc/diskstats,比如:
./modules/mod_io.c:#define IO_FILE "/proc/diskstats"
./modules/mod_io.c:FILE *iofp; /* /proc/diskstats*/
./modules/mod_io.c: handle_error("Can't open /proc/diskstats", !iofp);
Как видите, tsar полагается на файловую систему /proc для мониторинга процессов, операций ввода-вывода и ЦП.
Когда файловая система /proc в контейнере предоставляет информацию о ресурсах хоста, этот тип мониторинга не может отслеживать информацию в контейнере. Чтобы удовлетворить потребности бизнеса, необходимо адаптировать мониторинг контейнеров или даже разработать другой набор инструментов мониторинга для мониторинга внутри контейнера. Такого рода изменения неизбежно замедлят или даже затормозят темпы контейнеризации существующего бизнеса предприятия.Контейнерная технология должна быть максимально совместима с исходной цепочкой инструментов компании с учетом привычек использования инженерами.
PouchContainer поддерживает LXCFS для решения вышеуказанных проблем. Он опирается на инструменты мониторинга, эксплуатации и обслуживания файловой системы /proc. Он прозрачен для инструментов при развертывании в контейнере или на хосте. Существующие инструменты мониторинга, эксплуатации и обслуживания может быть плавно разработан без адаптации или перепланировки Миграция в контейнер для реализации мониторинга, эксплуатации и обслуживания в контейнере.
Далее давайте получим интуитивное чувство из примера, установите PoughContainer 0.3.0 в виртуальной машине Ubuntu:
# uname -a
Linux p4 4.13.0-36-generic #40~16.04.1-Ubuntu SMP Fri Feb 16 23:25:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Когда systemd запускает pouchd, LXCFS по умолчанию не включается. Контейнер, созданный в это время, не может использовать функцию LXCFS. Давайте посмотрим на содержимое соответствующего файла /proc в контейнере:
# systemctl start pouch
# head -n 5 /proc/meminfo
MemTotal: 2039520 kB
MemFree: 203028 kB
MemAvailable: 777268 kB
Buffers: 239960 kB
Cached: 430972 kB
root@p4:~# cat /proc/uptime
2594341.81 2208722.33
# pouch run -m 50m -it registry.hub.docker.com/library/busybox:1.28
/ # head -n 5 /proc/meminfo
MemTotal: 2039520 kB
MemFree: 189096 kB
MemAvailable: 764116 kB
Buffers: 240240 kB
Cached: 433928 kB
/ # cat /proc/uptime
2594376.56 2208749.32
Видно, что вывод файлов /proc/meminfo и uptime в контейнере соответствует хост-компьютеру.Хотя при запуске контейнера указывается объем памяти 50M, файл /proc/meminfo не отражает лимит памяти в контейнере.
Запустите службу LXCFS на хосте, вручную запустите процесс pouchd и укажите соответствующие параметры, связанные с LXCFS:
# systemctl start lxcfs
# pouchd -D --enable-lxcfs --lxcfs /usr/bin/lxcfs >/tmp/1 2>&1 &
[1] 32707
# ps -ef |grep lxcfs
root 698 1 0 11:08 ? 00:00:00 /usr/bin/lxcfs /var/lib/lxcfs/
root 724 32144 0 11:08 pts/22 00:00:00 grep --color=auto lxcfs
root 32707 32144 0 11:05 pts/22 00:00:00 pouchd -D --enable-lxcfs --lxcfs /usr/bin/lxcfs
Запустите контейнер и получите соответствующее содержимое файла:
# pouch run --enableLxcfs -it -m 50m registry.hub.docker.com/library/busybox:1.28
/ # head -n 5 /proc/meminfo
MemTotal: 51200 kB
MemFree: 50804 kB
MemAvailable: 50804 kB
Buffers: 0 kB
Cached: 4 kB
/ # cat /proc/uptime
10.00 10.00
Контейнер, запущенный с LXCFS, может прочитать файл /proc в контейнере, чтобы получить соответствующую информацию в контейнере.
Бизнес-приложения
Для большинства приложений, сильно зависящих от системы, программа запуска приложения должна получить системную память, ЦП и другую связанную информацию для соответствующей настройки. Когда файл /proc в контейнере не может точно отражать ресурсы в контейнере, это окажет существенное влияние на вышеуказанные приложения.
Например, для некоторых Java-приложений существует также сценарий запуска, проверяющий /proc/meminfo для динамического выделения размера стека запущенной программы. произойдет сбой выделения памяти. Для приложений, связанных с DPDK, инструменту приложения необходимо получить информацию о ЦП в соответствии с /proc/cpuinfo и получить логическое ядро ЦП, используемое приложением для инициализации уровня EAL. Если указанную выше информацию невозможно точно получить в контейнере, для приложений DPDK необходимо модифицировать соответствующие инструменты.
PouchContainer интегрирует LXCFS
PouchContainer поддерживает LXCFS с версии 0.1.0.Подробнее см.:GitHub.com/Alibaba/Анатомия… .
Короче говоря, при запуске контейнера точка монтирования /var/lib/lxc/lxcfs/proc/ LXCFS на хосте монтируется в виртуальный каталог файловой системы /proc внутри контейнера с помощью -v. На этом этапе в каталоге /proc внутри контейнера вы можете увидеть ряд файлов proc, включая meminfo, uptime, swaps, stat, diskstats, cpuinfo и т. д. Конкретные параметры следующие:
-v /var/lib/lxc/:/var/lib/lxc/:shared
-v /var/lib/lxc/lxcfs/proc/uptime:/proc/uptime
-v /var/lib/lxc/lxcfs/proc/swaps:/proc/swaps
-v /var/lib/lxc/lxcfs/proc/stat:/proc/stat
-v /var/lib/lxc/lxcfs/proc/diskstats:/proc/diskstats
-v /var/lib/lxc/lxcfs/proc/meminfo:/proc/meminfo
-v /var/lib/lxc/lxcfs/proc/cpuinfo:/proc/cpuinfo
Чтобы упростить использование, пакет создает и запускает командные строки, предоставляя аргументы--enableLxcfs
, указанные выше параметры при создании контейнера можно опустить, сложные-v
параметр.
После периода использования и тестирования мы обнаружили, что после перезапуска lxcfs proc и cgroup будут перестроены, что приведет к доступу к /proc в контейнере.connect failed
Ошибка. Чтобы повысить стабильность LXCFS, в PR:GitHub.com/Alibaba/Анатомия…В , метод управления уточнением LXCFS изменен, чтобы гарантировать systemd.Конкретный метод реализации заключается в добавлении ExecStartPost в lxcfs.service для выполнения операции повторного монтирования, обхода контейнера с помощью LXCFS и повторного монтирования в контейнере.
Суммировать
PouchContainer поддерживает LXCFS для реализации изоляции представлений файловой системы /proc в контейнере, что значительно сократит количество изменений в исходной цепочке инструментов и привычках эксплуатации и обслуживания в процессе контейнеризации стандартных корпоративных приложений, а также ускорит процесс контейнеризации. . Он решительно поддерживает плавный переход предприятий от традиционной виртуализации к контейнерной виртуализации.