在重新安排 pod 后处理在新节点上附加卷时,我对 Kubernetes 的行为有疑问。
我们在集群中的一个常见行为是:
节点 n1 变得不可用
具有卷 v1 的 pod A 在节点 n2 上重新调度
卷 v1 正在与节点 n1 分离,这将需要几秒钟
节点 n2 上的 kubelet 尝试将卷 v1 附加到 pod 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)"
在这个 Attach 错误之后,kubelet 将永远尝试挂载 Volume v1(这将失败,因为 Volume 没有附加)
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/ 尝试连接 2/ 无论连接的结果如何,在 Try Mount 上循环。
预期的行为是否应该是 1/ Try Attach 上的循环 2/ 如果在某个时候 Attach 成功,则在 Try Mount 上循环?
这个问题与https://github.com/kubernetes/kubernetes/issues/69158有关