Docker 使systemctl在debian stretch映像中的容器内工作 目标-我想要实现什么?

Docker 使systemctl在debian stretch映像中的容器内工作 目标-我想要实现什么?,docker,kubernetes,debian,systemd,kops,Docker,Kubernetes,Debian,Systemd,Kops,我想从运行kubernetes节点(ami:运行debian stretch)的容器中访问systemctl 工作设置: :kope.io/k8s-1.10-debian-jessie-amd64-hvm-ebs-2018-08-17 安装在容器中以使systemctl工作的节点目录: /var/run/dbus /运行/系统D /bin/systemctl /etc/systemd/system 不工作设置: :kope.io/k8s-1.11-debian-stretch-amd6

我想从运行kubernetes节点(ami:运行debian stretch)的容器中访问
systemctl

工作设置:
  • :kope.io/k8s-1.10-debian-jessie-amd64-hvm-ebs-2018-08-17

  • 安装在容器中以使
    systemctl
    工作的节点目录:

    • /var/run/dbus
    • /运行/系统D
    • /bin/systemctl
    • /etc/systemd/system
不工作设置:
  • :kope.io/k8s-1.11-debian-stretch-amd64-hvm-ebs-2018-08-17

  • 安装在容器中以使
    systemctl
    工作的节点目录:

    • /var/run/dbus
    • /运行/系统D
    • /bin/systemctl
    • /etc/systemd/system
试图解决问题的调试 要调试此问题,请使用与
debian jessie

1) 我首先通过在nginx部署中装载上述卷来加速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。因此
未找到。我通过查看节点找到了实际路径

admin@ip-10-0-20-11:~$ sudo find / -iname 'libsystemd-shared-232.so'
/lib/systemd/libsystemd-shared-232.so
3) 在nginx吊舱中装入
/lib/systemd
,然后再次运行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) 看到上面的目录没有挂载在我的pod中。我在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 stretch环境中的容器中工作所需的所有装载


任何进一步调试的指针都可能会有所帮助。

将主机的
/lib
目录装入容器后,Pod很可能不会启动,因为Docker映像的
/lib
目录包含Nginx服务器需要的一些库,应该在该容器中启动。通过从主机装载
/lib
,Nginx所需的库将不再可访问。这将导致在尝试启动Nginx时出现无此类文件或目录错误

要使
systemctl
在容器中可用,我建议只需在容器中安装它,而不是尝试将所需的二进制文件和库装入容器中。这可以在容器的
Dockerfile
中完成:

FROM whatever

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

无需使用此解决方案装载
/bin/systemd
/lib/

您只需在容器中安装
systemd
即可,而无需从主机装载某些库文件

$ apt-get -y install systemd
现在,这不一定会使
systemctl
运行。您需要在系统上由
/sbin/init
生成的容器中运行
systemd
/sbin/init
需要以root用户身份运行,因此基本上您必须在Kubernetes上的pod或容器中使用
privileged
标志来运行它。现在,这是不安全的,关于在一个容器中运行systemd,Docker的人主要反对它(安全性),红帽的人说它是需要的

尽管如此,红帽人还是想出了一个解决问题的办法。你需要:

  • /run
    作为tmpfs安装在容器中
  • /sys/fs/cgroup
    以只读方式装载是可以的
  • /sys/fs/cgroup/systemd/
    以读/写方式装载
  • 用于
    停止信号
    SIGRTMIN+3

在Kubernetes中,您需要安装
tmpfs
。其他的可以作为主机卷装入。

我遇到了一个类似的问题,Dockerfile中的一行是: 运行apt get install-y——重新安装systemd 但在docker重新启动后,当我尝试使用systemctl命令时。结果是: 无法连接到总线:没有这样的文件或目录。 我通过在docker-compose.yml中添加以下内容解决了此问题: 卷数: -“/sys/fs/cgroup:/sys/fs/cgroup:ro” 也可以通过以下方式完成:
sudo docker run-d-v/sys/fs/cgroup:/sys/fs/cgroup:ro{other options}

我想使用容器中的代码配置节点的终止钩子。节点终止钩子是节点的一个系统化进程。容器中的systemd安装将有何帮助?因为
systemd
包包含您在问题中询问的
systemctl
二进制文件(以及作为依赖项所需的所有各种库)。感谢您的及时回复,我已经用了一段时间了。您的意思是说,如果我在容器中安装systemctl,我仍然可以从容器中配置节点的systemd脚本。它需要安装吗?安装了systemctl,得到了这个<代码>root@nginx-部署-98d4cfc5b-hngl6:/#systemctl未能发出方法调用:未收到答复。可能的原因包括:远程应用程序未发送回复,消息总线安全策略阻止了回复,回复超时已过期,或者网络连接已断开。是,如果要控制节点上的
systemd
init进程,可能需要
/var/run/dbus
/run/systemd
,也可能是
/etc/systemd
挂载。谢谢Rico。对我来说,在将systemd装入容器并挂载我在问题中提到的目录后,它工作正常。我还没有让吊舱也私密化。在阅读了上面的信息后,我不明白为什么它对我有效。