Согласно документации Longhorn об отказе узла :
Когда происходит сбой узла Kubernetes с установленным драйвером CSI (все перечисленное основано на Kubernetes v1.12 с настройкой по умолчанию) :
- Через одну минуту ,
kubectl get nodes
сообщит NotReady
для узла отказа. - Примерно через пять минут , Состояния всех модулей в узле
NotReady
изменятся на Unknown
или NodeLost
. - Если вы развертываете с помощью StatefulSet или Deployment, вам нужно решить, безопасно ли форсировать удаление модуля рабочей нагрузки, выполняемой на потерянном узле. Смотрите здесь .
- StatefulSet имеет стабильную идентификацию, поэтому Kubernetes не будет принудительно удалять Pod для пользователя.
- У развертывания нет стабильной идентификации, но Longhorn является типом хранилища с возможностью чтения и записи. Это означает, что он может быть подключен только к одному Pod. Таким образом, новый Pod, созданный Kubernetes, не сможет запуститься из-за тома Longhorn, все еще прикрепленного к старому Pod, на потерянном узле.
- В обоих случаях Kubernetes автоматически вытеснит модуль (установите удаление отметка времени для модуля) на потерянном узле, затем попытайтесь воссоздать новый со старыми томами . Поскольку высохший модуль застревает в состоянии
Terminating
, а подключенные тома Longhorn не могут быть освобождены / использованы повторно, новый модуль застревает в состоянии ContainerCreating
. Вот почему пользователям нужно решить, безопасно ли принудительно удалять модуль.
Это текущее состояние LongHorn (которое все еще находится в бета-версии).
Существует открытая проблема на Github: Улучшение обработки сбоя узла # 1105 для точного решения этой проблемы, но пока, как указано в документации, администратор должен вмешаться вручную.
В Kubernetes Github есть больше проблем, таких как этот , который, как я считаю, лежит на грани между kubernetes и CSI, это взаимная проверка: CSI является читаемым и записываемым один раз и устанавливает хранение как стабильное и запирает хранение. В части kubernetes он видит, что в модулях есть финализаторы (как в проблеме выше), и не удалит их, пока задача не будет завершена.
К сожалению, в любом случае на сегодняшний день требуется ручное вмешательство.
- С точки зрения Longhorn вы должны запустить
delete volumeattachment
. - Со стороны kubernetes вы можете удалить финализаторы pod , позволяющие удалить стручки, здесь является примером того, как изменить финализаторы.
Редактировать:
Github Kubernetes Issue # 69697 Пример удаления финализаторов :
kubectl patch pvc <PVC_NAME> -p '{"metadata":{"finalizers":null}}'
kubectl patch pod <POD_NAME> -p '{"metadata":{"finalizers":null}}'
Вы можете создать скрипт для удаления финализаторов, чтобы вам не приходилось делать это вручную, как предложено в другом открытом выпуске Kubernetes # 77258 :
Вот одна строка для удаления финализаторов из всех PV в системе:
kubectl get pv | tail -n+2 | awk '{print $1}' | xargs -I{} kubectl patch pv {} -p '{"metadata":{"finalizers": null}}'
Великая проблема в том, что финализаторы добавляются LongHorn, поэтому в моем понимая, что вы не можете создавать стручки без него б потому что впоследствии он был добавлен LongHorn.
Я добавил документацию и Открытые выпуски от Github, чтобы показать вам, что это актуальная проблема, и которую еще предстоит решить разработчикам как из Longhorn, так и из Kubernetes.