Я использую 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, сделал исполняемым скрипт оболочки и так далее - если я делаю "список rbd" на CoreOS, все работает нормально. /opt/bin (помимо PATH в CoreOS по умолчанию) также находится в PATH для процесса kubelet (что я могу подтвердить через /proc/kubelet pid/environ).
Однако, если я запускаю (тестовый) модуль, я получаю эту ошибку (в описании модуля kubectl):
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. Однако я не вижу ни одного execve() для "rbd", ни какого-либо системного вызова с ошибкой EINVAL. Чтобы убедиться, что это не связано с флотом (systemd), я также попытался запустить kubelet непосредственно на консоли от имени пользователя root. Результаты такие же.