2016-06-23 10 views
1

私はKubernetes v1.2.4(CoreOS stable 1010.5.0上)を使用していて、rbd/cephボリュームをマウントしたいと考えています。基本的に私はhttps://github.com/kubernetes/kubernetes/tree/master/examples/rbdに従ってきましたが、私はJSONよりもYAMLを好んでいました。コアレスでkubernetesからrbd(docker)を呼び出すとfork/execの無効な引数が返される

は気づいたの両方が存在しなければならない:

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 [email protected] 

は、/ etc /セファロ構成の世話をしたが、シェルスクリプトの実行などを作った - 私は、上の「RBDリスト」を行う場合CoreOSはすべて正常に動作します。/opt/bin(デフォルトでCoreOSのPATH上にある)は、kubeletプロセスのPATHにもあります(/ 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 

ので(フォーク)またはどちらかはexecve()EINVALを返しますか?いくつかのmanページを通読することにより、私は唯一の幹部が実際に起因する

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

にEINVALで失敗する可能性がありますが、それはかなりあいまいなようだ見つけました。

問題が何であるか、問題をどのように修正/回避することができますか?

編集:私はstrace -fp pidを試しました。そしてgolang os/exec LookPathから推測される多くのstat()呼び出しがあります。しかし、私は "rbd"でexecve()を見たり、EINVALでシステムコールが失敗したりしていません。それが艦隊(systemd)に関係していないことを確認するために、私はkubeletを直接rootとしてコンソールで実行しようとしました。結果は同じです。

+1

https://github.com/ceph/ceph-docker/tree/master/examples/coreos/rbdmapもチェックしてください。 –

+0

問題は複数のノードがあり、複数のノードでrbd(またはその上に少なくともext4)を同時に使用することは安全ではないということです。 https://github.com/kubernetes/kubernetes/issues/23518が良いでしょう。しかし、疑わしいことが起こります(外部のCLIツールとの統合はあまり脆弱ではありません) – fiction

+0

@ Yu-JuHong - 私のrbdmapスクリプトのプラグに感謝します。 – Matt

答えて

0

kubernetesがrbdスクリプトをどのように起動するのかよく分かっていませんが、問題だと思っています。 kubernetesがやっているexecの呼び出しでスクリプトを直接実行することはできません。

ファイルの先頭にある#!/bin/sh行は自動的にシェルを起動しません。これは実際に別のシェルによって解釈されます。あなたのスクリプト/ opt/bin/rbdをあなたのkubernetes configで直接呼び出すのではなく、本当に必要なものです。あなたはそれを変更したい:.../SH -c "は/ opt/binに/ RBD"

/binに

をし、それが動作するはずです。実際に

、私はあなたが本当にやりたいことは、このガイドを見ている少し

#!/bin/sh 
exec docker run -v /etc/ceph:/etc/ceph ceph/rbd [email protected] 

しかし、おそらくスクリプトを変更したい:

Bring persistent storage for your containers with krbd on kubernetes

物事は進んでいます。

+0

私は、すべての設定ファイルでrbdを参照していません。 kubeletは自動的にPATH上のrbdバイナリを検索し、見つかった最初のものを実行しようとします(フルパスで)。 >物事が進行しました。 確かに私のポストからは分かりませんでしたが、そのチュートリアルで指定されている通りです。 "ホストで初めてCephをインストールする:sudo yum install -y ceph-common " は、私がCoreOS上で行うことができないものです。そのため、私は最初にrbdのすべての問題を抱えています。 – fiction

+0

Execでのスクリプトの実行は良い提案です。別のサブプロセスala kubelet - > shell - > dockerがなくてもkubelet - >(シェルがドッカーで置き換えられました)、そうですか?私はまた、rbdがシェルスクリプトでexecve()がそれを処理できないために問題があると思っていましたが、exec.Commandを呼び出すダミーGoプログラムを作成しました。 [/ * 16 vars * /])= 0 [pid 32147] execve( "/ opt/bin/rbd"、["rbd"、 "list"]、[/ test] * 16 vars * /] <未完成...>ので、問題はないと思われますか? – fiction

+0

@fiction - このスクリプトはあなたのために動作しますか?github.com/ceph/ceph-docker/tree/master/examples/coreos/rbdmap。私はCoreOSで動作するように書いていますが、これはLaurent Barbeの仕事に基づいていましたが、拡張されていますので、rbdデバイスをCoreOSホスト(コンテナ内ではなく)に直接マップすることができます。 。 – Matt

0

部分的な答え:rbdはシェルスクリプトではありません。他の外部ツールを呼び出すときにkubeletからのstrace出力を見ると、clone()が使われているとわかりました。私はいくつかの短いテストコードを書いて、失敗したときに何が起こるかを検証しました。私は

strace ./test 2>&1 | grep clone 

をすれば

#define _GNU_SOURCE 
#include <sched.h> 
#include <stdio.h> 

int test(void *p) { 
    printf("Hello there!"); 
    return 0; 
} 

int main() { 
    if (clone(test, NULL, CLONE_THREAD, NULL) == -1) { 
    perror("clone"); 
    } 
    return 0; 
} 

は今、出力は謎の一部を説明し

write(2, "clone: Invalid argument\n", 24clone: Invalid argument 

です。 EINVALでclone()が失敗した場合、straceはまったく表示しません。

それから私はKubernetesのソースを見て、

https://github.com/kubernetes/kubernetes/blob/master/pkg/volume/rbd/rbd_util.go#L218

してきたが魅力

[pid 25039] execve("/usr/sbin/modprobe", ["modprobe", "rbd"], [/* 4 vars */] <unfinished ...> 

ワンダーのように動作するように思える理由https://github.com/kubernetes/kubernetes/blob/master/pkg/volume/rbd/rbd_util.go#L231またはhttps://github.com/kubernetes/kubernetes/blob/master/pkg/volume/rbd/rbd_util.go#L234の呼び出しは(ないでしょうか具体的に何がそのクローン()の呼び出しを失敗させるか)

0

Jus問題のフォローアップ。

私は、Kubernetes v1.3.5でCoreOS安定版(1068.9.0)にアップグレードしました。

#!/bin/sh 
exec docker run -v /dev:/dev -v /sys:/sys --net=host --privileged=true -v /etc/ceph:/etc/ceph ceph/rbd [email protected] 

(部分的にご提案に基づく):

私は/ opt/binに/ RBDは、次のようになります。そして今はすべてが魅力のように機能します。だから私はそれが固定されたバグだと思う(また、secretRefとkeyringはkubectlからもうもう必要ない)。おそらく誰かが実際の問題が何であるかについてコメントすることができますが、それ以外の場合は終了したと考えてください。

関連する問題