Опишите ошибку
Плагин узла Trident CSI Node ( csi.trident.netapp.io
) на одном узле теперь не зарегистрирован после обновления версии Kubernetes с версии 1.18.9 до версии 1.19.4. Поды на этом узле больше не могут монтировать и размонтировать тома Trident.
В логе kubelet видим следующие сообщения.
csi.trident.netapp.io
не зарегистрирован, так как регистрационный сокет ( /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
) был удален.
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
Поду не удалось размонтировать том, поскольку csi.trident.netapp.io
не найден.
E1119 09:02:52.819122 6550 nestedpendingoperations.go:301] Операция для "{ volumeName:kubernetes.io/csi/csi.trident.netapp.io ^pvc-75a6fd7f-7aee-45e8-a5fa-d4500272528e podName:ad18a7d1-4090 -4e0c-9e71-cba46dfc3657 имя_узла:}" не удалось. Повторные попытки не разрешены до 2020-11-19 09:04:54,819071328 +0000 UTC m=+1310234,159288938 (durationBeforeRetry 2 м2 с). Ошибка: «Не удалось выполнить UnmountVolume.TearDown для тома data» (UniqueName: «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
(плагин узла) на этом узле работали одновременно в течение очень короткого времени, и что старый driver-registrar
остановился после запуска нового.
driver-registrar
удаляет регистрационный сокет ( /var/lib/kubelet/plugins_registry/csi.trident.netapp.io-reg.sock
) при получении SIGTERM ( node_register.go#L113-L116 ). Удаление сокета приводит к тому, что kubelet отменяет регистрацию плагина Trident. Я считаю, что это является причиной проблемы.
Модули Trident-csi (Node Plugin) управляются DaemonSet. Обычно на каждом узле работает только один модуль. Но после обновления Kubernetes набор демонов trident-csi был воссоздан trident-operator
. Удаление DaemonSet позволяет одновременно запускать два модуля (старый и новый).
Мы подтвердили это в журнале trident-operator
.
Здесь набор демонов trident-csi
был удален.
time="2020-11-19T05:47:45Z" level=debug msg="Удаленный набор демонов Kubernetes." DaemonSet=трезубец-csi namespace=трезубец
Вскоре после этого был создан набор демонов trident-csi
.
time="2020-11-19T05:47:45Z" level=debug msg="Создание объекта." kind=DaemonSet name=trident-csi namespace=trident
После обновления Kubernetes для флага shouldUpdate
было установлено значение true ( controller.go#L1110 ). Похоже, что флаг shouldUpdate
приводит к удалению набора демонов trident-csi
( installer.go#L1489-L1494 ).
Окружающая обстановка
silenceAutosupport: true
(оператор Trident)Воспроизвести
Обновление версии 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 на каждом узле.$ 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 будет воссоздан вскоре после этого оператором трезубца.$ kubectl delete ds -n trident trident-csi
trident-csi
на каждом узле.$ kubectl get pods -n trident -o wide
Ожидаемое поведение
Поды могут подключать и отключать тома Trident после обновления версии Kubernetes.
Дополнительный контекст
Никто
Привет @tksm
Благодарим вас за подробное описание этой проблемы и внимательное изучение основной причины, ваш анализ очень полезен. Промежуток времени между завершением работы модуля набора демонов и восстановлением имеет решающее значение, и последнее должно происходить только после завершения первого. Поэтому оператор должен убедиться, что перед созданием набора демонов все модули, принадлежащие предыдущему набору демонов, удалены, а затем только создать новый набор демонов.
Из любопытства не возражаете, если я спрошу, сколько кластеров столкнулись с этой проблемой во время обновления?
Спасибо!
Привет, @ntap-arorar
Спасибо за подтверждение. Я думаю, что ваша идея решит эту проблему.
Пока мы столкнулись с этой проблемой только на одном кластере, так как мы обновили только несколько кластеров в качестве теста.
Мы включим это исправление в выпуск Trident v21.01.
Эта проблема была исправлена с коммитом 820579d .
Самый полезный комментарий
Мы включим это исправление в выпуск Trident v21.01.