我正在使用Kubernetes v1.2.4(在Coreos Stable 1010.5.0之上),并希望安装RBD/CEPH卷。基本上我遵循了https://github.com/kubernetes/kubernetes/tree/master/examples/rbd除了我更喜欢yaml而不是json。
注意必须有两个:
secretRef:
name: ceph-secret
和
keyring: /etc/ceph/keyring
否则库贝克特会抱怨。这是预期的行为吗?
看起来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上的路径上)也位于kubelet进程的路径中(我可以通过/proc/kubelet pid/environ确认)。
但是,如果我启动(测试)pod,就会得到这个错误(在kubectl pod描述中):
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可能会因为
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)无关,我还尝试在控制台上直接以根用户身份运行kubelet。结果是一样的。
最佳答案
我不太熟悉kubernetes如何启动rbd脚本,但我认为问题在于它是一个脚本。kubernetes正在执行的exec调用不能直接运行脚本。
文件顶部的#!/bin/sh
行不会自动为您启动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/