ポッドの再スケジュール後に新しいノードにボリュームをアタッチする際の Kubernetes の動作について質問があります。
クラスターでの一般的な動作は次のとおりです。
ノード n1 が使用不可になる
ボリューム v1 のポッド A は、ノード n2 で再スケジュールされます
ボリューム v1 をノード n1 から切り離しています。これには数秒かかります
ノード n2 の kubelet は、ボリューム v1 をポッド A にアタッチしようとします
ボリューム v1 はノード n1 からまだ切り離されていないため、Attach 呼び出しは次のように失敗します。
Sep 27 11:43:24 node n2 kubelet-wrapper[787]: E0927 11:43:24.794713 787 nestedpendingoperations.go:263] Operation for "\"kubernetes.io/cinder/volume_v1_id\"" failed. No retries permitted until 2018-09-27 11:43:25.294659022 +0000 UTC m=+1120541.835247469 (durationBeforeRetry 500ms). Error: "AttachVolume.Attach failed for volume \"volume v1\" (UniqueName: \"kubernetes.io/cinder/volume_2_id\") from node \"node n2\" : disk volume_v2_id path /dev/vdc is attached to a different instance (pod node n1)"
この接続エラーの後、kubelet は永久にボリューム v1 をマウントしようとします (ボリュームが接続されていないため失敗します)。
Sep 27 11:43:26 node n2 kubelet-wrapper[787]: E0927 11:43:26.870106 787 attacher.go:240] Error: could not find attached Cinder disk "volume_v1_id" (path: ""): <nil>
私の質問は: k8s がマウントを試みる前に再度接続を試みないのはなぜですか?
ここでの問題は、デタッチが十分に迅速に行われている場合は問題がないことですが、kubelet によって Attach が呼び出されたときにデタッチがまだ行われていない場合は、スタックします。
コードを掘り下げると、動作は WaitForAttachAndMount のようです。1/ Try Attach 2/ 接続の結果がどうであれ、Try Mount でループします。
予想される動作は 1/ Try Attach でループ 2/ ある時点で Attach が成功した場合、Try Mount でループ?
この質問はhttps://github.com/kubernetes/kubernetes/issues/69158に関連しています