Kubernetes Pod:无法获得D-Bus连接

时间:2019-05-23 13:10:23

标签: linux docker kubernetes systemd dbus

我有一个基于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?

提示::由于容器内运行的软件,因此需要系统化,因此这里没有管理员选项

2 个答案:

答案 0 :(得分:0)

令人遗憾的是,丹尼尔·沃尔什(Redhat)的旧建议仍在徘徊-包括暗示运行“特权容器”以通过与容器外部的守护进程进行基本对话来获得某些系统行为

将其丢弃。把它忘了吧。除非违反其基本设计,否则您无法在真正的集群中得到它。

在大多数情况下,靠近容器时对systemd的要求不是很严格。容器有很多服务管理器或init守护程序实现。例如,您可以尝试使用docker-systemctl-replacement脚本。

答案 1 :(得分:0)

启动systemd的命令必须在容器的脚本中。我使用/usr/sbin/init/usr/lib/systemd/systemd --systemd --unit=basic.target。另外,您需要使用tmpfs启动systemd以便/ run来存储运行时信息。编写脚本并不容易,Tableau就是一个很好的例子。

此外,我建议不要不使用--privileged,因为这会带来安全风险,并且您可能会不小心更改或关闭容器中进行更改的主机。