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 连接的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes:pod无法删除

无法获取 pod 指标 -Kubernetes

无法在 Kubernetes 中删除 pod

pod 无法访问本地机器 Kubernetes 服务

.NET Core pod 无法连接到 Kubernetes 中的 SQL Server pod

Kubernetes 无法删除状态为Terminating的Pod解决方法