gpt4 book ai didi

linux - 从 coreos 上的 kubernetes 调用 rbd (docker) 返回 fork/exec 无效参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:13 24 4
gpt4 key购买 nike

我正在使用 Kubernetes v1.2.4(在 CoreOS 稳定版 1010.5.0 之上)并想挂载 rbd/ceph 卷。基本上我关注了https://github.com/kubernetes/kubernetes/tree/master/examples/rbd除了我更喜欢 YAML 而不是 JSON。

注意到必须同时存在:

secretRef:
name: ceph-secret

keyring: /etc/ceph/keyring

否则 kubectl 会提示。这是预期的行为吗?

似乎 kubelet 试图直接在主机上调用 rbd 二进制文件(这对于像 CoreOS 这样的“裸系统”来说是个问题)。由于复制二进制文件和依赖项会有点麻烦,所以我做了这个技巧:

$ cat /opt/bin/rbd
#!/bin/sh
docker run -v /etc/ceph:/etc/ceph ceph/rbd $@

负责/etc/ceph 配置,使 shell 脚本可执行等 - 如果我在 CoreOS 上执行“rbd list”,一切正常。/opt/bin(除了默认在 CoreOS 上的 PATH 之外)也在 kubelet 进程的 PATH 中(我可以通过/proc/kubelet pid/environ 确认)。

但是,如果我启动(测试)pod,我会收到此错误(在 kubectl pod describe 中):

Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
5s 5s 1 {default-scheduler } Normal Scheduled Successfully assigned busybox4 to some-host
4s 4s 1 {kubelet some-host} Warning FailedMount Unable to mount volumes for pod "busybox4_default(5386c7f3-3959-11e6-a768-aa00009a7832)": rbd: map failed fork/exec /opt/bin/rbd: invalid argument
4s 4s 1 {kubelet some-host} Warning FailedSync Error syncing pod, skipping: rbd: map failed fork/exec /opt/bin/rbd: invalid argument

所以 fork() 或 execve() 返回 EINVAL?通过阅读几个手册页,我发现只有 exec 可能实际上因 EINVAL 而失败

An ELF executable had more than one PT_INTERP segment (i.e., tried to name more than one interpreter)

但这似乎很晦涩。

知道这是怎么回事,或者我该如何解决/解决问题?

编辑:我尝试了 strace -fp pid 并且有很多 stat() 调用,我认为这些调用来自 golang os/exec LookPath。但是,我没有在“rbd”上看到任何 execve(),也没有任何系统调用因 EINVAL 而失败。为了确保它与 fleet (systemd) 无关,我还尝试以 root 身份直接在控制台上运行 kubelet。结果是一样的。

最佳答案

我不太熟悉 kubernetes 如何启动该 rbd 脚本,但我认为问题在于它是一个脚本。脚本不能通过调用 exec 直接运行,而 kubernetes 正在这样做。

文件顶部的 #!/bin/sh 行不会自动为您启动 shell。这实际上是由另一个 shell 解释的。所以你真正想要的是什么,而不是直接在你的 kubernetes 配置中调用你的脚本/opt/bin/rbd 。您想将其更改为:

/bin/sh -c "/opt/bin/rbd" ...

然后它应该可以工作了。

事实上,我会稍微修改脚本

#!/bin/sh
exec docker run -v /etc/ceph:/etc/ceph ceph/rbd $@

但也许您真正想做的是查看本指南:

Bring persistent storage for your containers with krbd on kubernetes

事情有进展。

关于linux - 从 coreos 上的 kubernetes 调用 rbd (docker) 返回 fork/exec 无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37996983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com