使 systemctl 在 debian 拉伸镜像的容器内部工作

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

    • /var/运行/dbus
    • /运行/systemd
    • /bin/systemctl
    • /etc/systemd/系统

不工作设置:

  • 节点 AMI:kope.io/k8s-1.11-debian-stretch-amd64-hvm-ebs-2018-08-17

  • 节点目录挂载到容器中才能工作systemctl

    • /var/运行/dbus
    • /运行/systemd
    • /bin/systemctl
    • /etc/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
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 环境中的容器内部工作所需的所有安装。

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

Ric*_*ico 7

systemd您可以直接安装在容器中,而不是从主机安装一些库文件。

$ apt-get -y install systemd
Run Code Online (Sandbox Code Playgroud)

现在,这不一定能systemctl成功。您需要在系统上systemd生成的容器中运行。需要以 root 身份运行,因此本质上您必须在 Kubernetes 上的pod 或容器安全上下文中使用该标志来运行它。现在,这是不安全的,并且在容器中运行 systemd已经有很长的历史了,Docker 人员大多反对它(安全性),而红帽人员则表示需要它。/sbin/init/sbin/initprivileged

尽管如此,红帽人员还是找到了一种方法,让它在没有unprivilegedflag 的情况下也能工作。你需要:

  • /run作为 tmpfs 安装在容器中。
  • /sys/fs/cgroup安装为只读就可以了。
  • /sys/fs/cgroup/systemd/安装为读/写。
  • 用于STOPSIGNAL SIGRTMIN+3

在 Kubernetes 中,您需要emptyDir挂载tmpfs. 其他可以作为主机卷安装。


hel*_*ert 2

将主机的/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/使用此解决方案。