Kubernetes Pod:无法获得 D-Bus 连接
Posted
技术标签:
【中文标题】Kubernetes Pod:无法获得 D-Bus 连接【英文标题】:Kubernetes Pod: Failed to get D-Bus Connection 【发布时间】:2019-10-10 01:47:59 【问题描述】:我有一个基于 centos/systemd 的 docker 容器。我用
运行容器docker run -d --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image>
然后我可以通过以下方式访问容器:
docker exec -ti <containerID> /bin/bash
然后我可以使用命令 systemctl
列出所有加载的单元。这很好用。
现在我想将镜像部署到 kubernetes 集群中,这也很好,我可以通过 kubectl exec -ti <pod> /bin/bash
访问集群中正在运行的 pod
如果我现在输入命令systemctl
我会收到错误消息
获取 D-Bus 连接失败:不允许操作
如何使 systemd/systemctl 在 pod 中可用?
提示:因为软件在容器内运行,所以需要 systemd,所以这里不能选择 supervisord
【问题讨论】:
***.com/questions/56261077/… 需要 systemd,因为软件在容器 (Tableau Server) 内运行 在 Docker 中,尤其是在 Kubernetes 中,systemd 无法完成其设计要做的 90% 的事情(并且试图在 Docker 中运行 systemctl 是它自己经常造成混淆的原因)。如果 systemd 确实是这个软件的硬性要求,那么在 VM 中运行它可能会更容易。 我很确定您需要卷挂载/var/lib/dbus
和 /etc/machine-id
以及可能的其他路径,但正如大卫所说,如果您的软件与 systemd 密切相关,那么您可能会解决错误问题
好吧,听起来很糟糕。什么是正确的解决方案? LinuxContainer?
【参考方案1】:
令人遗憾的是,Daniel Walsh (Redhat) 的旧提案仍在流传 - 其中包括运行“特权容器”以获得一些 systemd 行为的提示,基本上是与容器外的守护进程对话.
放下那个。把它忘了吧。除非违反其基本设计,否则您无法在真正的集群中获得它。
而且在大多数情况下,仔细观察,容器中对 systemd 的要求并不是很严格。容器有相当多的服务管理器或初始化守护程序实现。例如,您可以尝试使用 docker-systemctl-replacement 脚本。
【讨论】:
您好 Draheim 先生,我尝试了您的 docker-systemctl-replacement 脚本。感谢分享这个脚本,它看起来很有趣。但是我仍然遇到问题,如果我使用脚本,我可以在我的 centos-docker-container 中调用systemctl
并获得已加载单元的列表。但问题是:为了在容器中安装我的软件(Tableau Server),我需要一个 dbus 连接,但没有。我收到错误Failed to create bus connection: No such file or directory
。也许对此有任何想法?
显然,替换脚本切断了“systemctl”与 systemd 守护进程的联系。如果应用程序本身具有这样的依赖关系,那么脚本将无济于事。但是,我不知道该软件是什么,但我确实感觉到这样的应用程序与系统管理深度集成 - 而不是应该在容器中运行的软件,无论如何可以轻松移动到其他工作节点集群?【参考方案2】:
启动 systemd 的命令必须在容器的脚本中。我使用/usr/sbin/init
或/usr/lib/systemd/systemd --systemd --unit=basic.target
。此外,您需要使用 /run 的 tmpfs 启动 systemd 以存储运行时信息。编写脚本并不容易,Tableau 就是一个很好的例子来说明为什么要这样做。
另外,我建议不要不惜一切代价使用 --privileged,因为它存在安全风险,而且您可能会在容器内进行更改时意外更改或关闭主机。
【讨论】:
以上是关于Kubernetes Pod:无法获得 D-Bus 连接的主要内容,如果未能解决你的问题,请参考以下文章