描述错误
Kubernetes 版本从 v1.18.9 更新到 v1.19.4 后,一个节点上的 Trident CSI 节点插件 ( csi.trident.netapp.io
) 现在已取消注册。 此节点上的 Pod 不能再挂载和卸载 Trident 卷。
我们在 kubelet 日志中看到以下消息。
由于注册套接字 ( /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
) 已被删除, csi.trident.netapp.io
未注册。
I1119 05:47:54.246972 6550 plugin_watcher.go:212] 从所需的状态缓存中删除套接字路径 /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
I1119 05:47:53.162305 6550 reconciler.go:139] operationExecutor.UnregisterPlugin 在“/var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock”处为插件启动(插件详细信息:&{/var /lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock 2020-11-04 05:08:19.553684094 +0000 UTC m=+38.893901704 0x704c200 csi.trident.netapp.io})
I1119 05:47:53.163390 6550 csi_plugin.go:177] kubernetes.io/csi:registrationHandler.DeRegisterPlugin 插件请求 csi.trident.netapp.io
pod 无法卸载卷,因为找不到csi.trident.netapp.io
。
E1119 09:02:52.819122 6550 nestedpendingoperations.go:301] 操作“{v olumeName:kubernetes.io/csi/csi.trident.netapp.io ^pvc-75a6fd7f-7aee-45e8-a5fa-d4500272528e podName:ad18a7d1-4090 -4e0c-9e71-cba46dfc3657 nodeName:}" 失败。 在 2020-11-19 09:04:54.819071328 +0000 UTC m=+1310234.159288938 (durationBeforeRetry 2m2s) 之前不允许重试。 错误:“UnmountVolume.TearDown 卷“数据”失败(唯一名称:“kubernetes.io/csi/csi.trident.netapp.io^pvc-75a6fd7f-7aee-45e8-a5fa-d4500272528e”)pod“ad18a7d1-4090-4e0c -9e71-cba46dfc3657”(UID:“ad18a7d1-4090-4e0c-9e71-cba46dfc3657”):kubernetes.io/csi:mounter.SetUpAt 无法获取 CSI 客户端:驱动程序名称 csi.trident.netapp.io 未在列表中找到注册 CSI 驱动程序"
我们发现该节点上的两个trident-csi
(Node Plugin)Pod 同时运行了很短的时间,并且旧的driver-registrar
在新的 Pod 启动后停止了。
driver-registrar
在收到 SIGTERM ( node_register.go#L113-L116 ) 时删除注册套接字 ( /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
)。 移除套接字会导致 kubelet 注销 Trident 插件。 我相信这是问题的原因。
Trident-csi(节点插件)pod 由 DaemonSet 管理。 通常,每个节点上只运行一个 pod。 但是 Kubernetes 更新后, trident-csi Daemonset 被trident-operator
重新创建。 删除 DaemonSet 允许两个 pod(旧的和新的)同时运行。
我们在trident-operator
日志上确认了这一点。
在这里, trident-csi
Daemonset 被删除了。
time="2020-11-19T05:47:45Z" level=debug msg="Deleted Kubernetes DaemonSet." DaemonSet=trident-csi 命名空间=trident
然后很快创建了trident-csi
守护程序集。
time="2020-11-19T05:47:45Z" level=debug msg="创建对象。" kind=DaemonSet 名称=trident-csi 命名空间=trident
Kubernetes 更新后, shouldUpdate
标志设置为 true ( controller.go#L1110 )。 似乎shouldUpdate
标志会导致trident-csi
守护程序集被删除( installer.go#L1489-L1494 )。
环境
silenceAutosupport: true
(Trident Operator)重现
更新 Kubernetes 版本可能会重现此问题。 由于更新 Kubernetes 需要很长时间并且并不总是发生,我们通过不同的演示确认了以下导致此问题的行为。
$ kubectl describe csinodes.storage.k8s.io <NODE_NAME>
...
Spec:
Drivers:
csi.trident.netapp.io:
Node ID: <NODE_NAME>
Topology Keys: [topology.kubernetes.io/zone]
trident-csi
DaemonSet 以在每个节点上运行两个 trident-csi pod。$ kubectl get ds -n trident trident-csi -o json | jq '.metadata.name|="trident-csi-2"' | kubectl apply -f -
trident-csi-2
DaemonSet。$ kubectl delete ds -n trident trident-csi-2
$ kubectl describe csinodes.storage.k8s.io <NODE_NAME>
Spec:
trident-csi
DaemonSet。 DaemonSet 将很快由 trident-operator 重新创建。$ kubectl delete ds -n trident trident-csi
trident-csi
pod。$ kubectl get pods -n trident -o wide
预期行为
Pod 可以在 Kubernetes 版本更新后挂载和卸载 Trident 卷。
附加上下文
没有任何
你好@tksm
感谢您提供此问题的详细信息并仔细研究根本原因,您的分析非常有帮助。 daemonset pod 终止和重新创建之间的窗口至关重要,后者仅应仅在前者完成时发生。 因此,运营商应确保在创建 daemonset 之前,将属于先前 daemonset 的 pod 全部删除,然后再创建一个新的 daemonset。
出于好奇,您介意我询问升级期间遇到此问题的集群数量吗?
谢谢!
嗨,@ntap-arorar
感谢您的确认。 我认为您的想法将解决此问题。
到目前为止,我们只在一个集群上遇到了这个问题,因为我们只升级了几个集群作为测试。
我们将在 Trident v21.01 版本中包含此修复程序。
此问题已通过提交820579d 修复。
最有用的评论
我们将在 Trident v21.01 版本中包含此修复程序。