我正在使用 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
否则 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 并且有很多我认为来自 golang os/exec LookPath 的 stat() 调用。但是,我没有在“rbd”上看到任何 execve(),也没有任何系统调用因 EINVAL 而失败。为了确保它与舰队(systemd)无关,我还尝试以 root 身份直接在控制台上运行 kubelet。结果是一样的。