Заставить systemctl работать из контейнера в растянутом образе Debian - PullRequest
0 голосов
/ 07 января 2019

Цель - Чего я хочу достичь?

Я хочу получить доступ к systemctl из контейнера, в котором запущен узел kubernetes (ami: работает debian stretch)

Рабочая настройка:

  • Узел AMI : kope.io/k8s-1.10-debian-jessie-amd64-hvm-ebs-2018-08-17

  • Каталоги узлов, установленные в контейнере для работы systemctl:

    • / вар / бег / DBus
    • / бег / Systemd
    • / бен / systemctl
    • / и т.д. / Systemd / система

Не работает настройка:

  • Узел AMI : kope.io/k8s-1.11-debian-stretch-amd64-hvm-ebs-2018-08-17

  • Каталоги узлов, установленные в контейнере для обеспечения работы systemctl:

    • / вар / бег / DBus
    • / бег / Systemd
    • / бен / systemctl
    • / и т.д. / Systemd / система * * одна тысяча пятьдесят-одна

Отладка в попытке решить проблему

Для устранения этой проблемы с изображением debian-stretch, не поддерживающим systemctl с теми же креплениями, что и debian-jessie

1) Я начал с развертывания nginx, смонтировав в нем вышеупомянутые тома

kubectl apply -f https://k8s.io/examples/application/deployment.yaml

kubectl exec -it nginx-deployment /bin/bash

root@nginx-deployment-788f65877d-pzzrn:/# systemctl
systemctl: error while loading shared libraries: libsystemd-shared- 
232.so: cannot open shared object file: No such file or directory

2) Как указывалось выше, файл libsystemd-shared-232.so не найден. Я нашел фактический путь, посмотрев в узел.

admin@ip-10-0-20-11:~$ sudo find / -iname 'libsystemd-shared-232.so'
/lib/systemd/libsystemd-shared-232.so

3) Смонтировал /lib/systemd в модуле nginx и снова запустил systemctl

 kubectl exec -it nginx-deployment /bin/bash

 root@nginx-deployment-587d866f54-ghfll:/# systemctl
 systemctl: error while loading shared libraries: libcap.so.2:cannot 
 open shared object file: No such file or directory

4) Теперь systemctl терпел неудачу с новой отсутствующей ошибкой

root@nginx-deployment-587d866f54-ghfll:/# systemctl
systemctl: error while loading shared libraries: libcap.so.2: cannot 
open shared object file: No such file or directory

5) Чтобы устранить вышеуказанную ошибку, я снова искал узел для libcap.so.2 Нашел его по указанному ниже пути.

admin@ip-10-0-20-11:~$ sudo find / -iname 'libcap.so.2'
/lib/x86_64-linux-gnu/libcap.so.2 

6) Видя, что вышеупомянутый каталог не смонтирован в моем модуле. Я смонтировал следующий путь в модуле nginx.

/lib/x86_64-linux-gnu mounted in the nginx pod(deployment)

7) Модуль nginx не может появиться после добавления вышеуказанного монтирования. Получение ошибки ниже:

$ k logs nginx-deployment-f9c5ff956-b9wn5
standard_init_linux.go:178: exec user process caused "no such file 
or directory"

Подскажите, пожалуйста, как отлаживать дальше. И все, что требуется для монтирования systemctl изнутри контейнера в среде растяжения Debian.

Любые указатели для дальнейшей отладки могут быть полезны.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вместо того, чтобы монтировать некоторые файлы библиотеки с хоста, вы можете просто установить systemd в контейнер.

$ apt-get -y install systemd

Теперь, это не обязательно заставит systemctl бежать. Вам потребуется systemd для запуска в вашем контейнере, который порождается /sbin/init в вашей системе. /sbin/init должен быть запущен от имени пользователя root, так что по сути вам придется запускать его с флагом privileged в модуле или контейнере контекст безопасности в Kubernetes. Теперь это небезопасно, и существует длинная история о запуске systemd в контейнере, где люди Docker были в основном против него (безопасность), и люди из Red Hat сказали, что это было необходимо.

Тем не менее, ребята из Red Hat нашли способ заставить его работать без флага unprivileged . Вам нужно:

  • /run монтируется как tmpfs в контейнер.
  • /sys/fs/cgroup монтируется только для чтения.
  • /sys/fs/cgroup/systemd/ монтируется как чтение / запись.
  • Использовать для STOPSIGNAL SIGRTMIN+3

В Kubernetes вам нужно emptyDir, чтобы смонтировать tmpfs. Остальные могут быть смонтированы как тома хоста.

0 голосов
/ 07 января 2019

После монтирования каталога /lib вашего хоста в контейнер ваш Pod, скорее всего, не запустится, потому что каталог /lib образа Docker содержит некоторую библиотеку, необходимую серверу Nginx, которая должна запускаться в этом контейнере. При монтировании /lib с хоста библиотеки, требуемые Nginx, больше не будут доступны. Это приведет к ошибке Нет такого файла или каталога при попытке запуска Nginx.

Чтобы сделать systemctl доступным из контейнера, я бы предложил просто установить его внутри контейнера, а не пытаться монтировать необходимые двоичные файлы и библиотеки в контейнер. Это можно сделать в вашем контейнере Dockerfile:

FROM whatever

RUN apt-get update && apt-get install systemd

Нет необходимости монтировать /bin/systemd или /lib/ с этим решением.

...