Docker 使systemctl在debian stretch映像中的容器内工作 目标-我想要实现什么?
我想从运行kubernetes节点(ami:运行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
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的人主要反对它(安全性),红帽的人说它是需要的
尽管如此,红帽人还是想出了一个解决问题的办法。你需要:
作为tmpfs安装在容器中/run
以只读方式装载是可以的/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装入容器并挂载我在问题中提到的目录后,它工作正常。我还没有让吊舱也私密化。在阅读了上面的信息后,我不明白为什么它对我有效。