我正在使用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/

10-11 17:40