Alo*_*ngh 5 debian systemd docker kubernetes kops
我想systemctl
从运行 kubernetes 节点的容器内部进行访问(ami:运行 debianstretch)
节点 AMI:kope.io/k8s-1.10-debian-jessie-amd64-hvm-ebs-2018-08-17
节点目录挂载到容器中才能工作systemctl
:
节点 AMI:kope.io/k8s-1.11-debian-stretch-amd64-hvm-ebs-2018-08-17
节点目录挂载到容器中才能工作systemctl
:
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
Run Code Online (Sandbox Code Playgroud)
2)如上问题显示libsystemd-shared-232.so
找不到文件。我通过查看节点找到了实际路径。
admin@ip-10-0-20-11:~$ sudo find / -iname 'libsystemd-shared-232.so'
/lib/systemd/libsystemd-shared-232.so
Run Code Online (Sandbox Code Playgroud)
3)在nginx pod中安装/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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
5)为了解决上述错误,我再次搜索节点以libcap.so.2
在以下路径中找到它。
admin@ip-10-0-20-11:~$ sudo find / -iname 'libcap.so.2'
/lib/x86_64-linux-gnu/libcap.so.2
Run Code Online (Sandbox Code Playgroud)
6)看到上面的目录没有挂载到我的pod中。我在 nginx pod 中安装了以下路径。
/lib/x86_64-linux-gnu mounted in the nginx pod(deployment)
Run Code Online (Sandbox Code Playgroud)
7) 添加上述挂载后,nginx pod 无法启动。出现以下错误:
$ k logs nginx-deployment-f9c5ff956-b9wn5
standard_init_linux.go:178: exec user process caused "no such file
or directory"
Run Code Online (Sandbox Code Playgroud)
请建议如何进一步调试。以及使 systemctl 在 Debian Stretch 环境中的容器内部工作所需的所有安装。
任何进一步调试的指示都可能会有所帮助。
systemd
您可以直接安装在容器中,而不是从主机安装一些库文件。
$ apt-get -y install systemd
Run Code Online (Sandbox Code Playgroud)
现在,这不一定能systemctl
成功。您需要在系统上systemd
生成的容器中运行。需要以 root 身份运行,因此本质上您必须在 Kubernetes 上的pod 或容器安全上下文中使用该标志来运行它。现在,这是不安全的,并且在容器中运行 systemd已经有很长的历史了,Docker 人员大多反对它(安全性),而红帽人员则表示需要它。/sbin/init
/sbin/init
privileged
尽管如此,红帽人员还是找到了一种方法,让它在没有unprivileged
flag 的情况下也能工作。你需要:
/run
作为 tmpfs 安装在容器中。/sys/fs/cgroup
安装为只读就可以了。/sys/fs/cgroup/systemd/
安装为读/写。STOPSIGNAL
SIGRTMIN+3
在 Kubernetes 中,您需要emptyDir
挂载tmpfs
. 其他可以作为主机卷安装。
将主机的/lib
目录安装到容器中后,您的 Pod 很可能不会启动,因为 Docker 映像的/lib
目录包含应在该容器中启动的 Nginx 服务器所需的一些库。从主机挂载后/lib
,Nginx 所需的库将无法再访问。当尝试启动 Nginx 时,这将导致出现“无此类文件或目录”错误。
为了systemctl
从容器内可用,我建议只需将其安装在容器内,而不是尝试将所需的二进制文件和库安装到容器中。这可以在您的容器中完成Dockerfile
:
FROM whatever
RUN apt-get update && apt-get install systemd
Run Code Online (Sandbox Code Playgroud)
无需安装/bin/systemd
或/lib/
使用此解决方案。
归档时间: |
|
查看次数: |
14762 次 |
最近记录: |