Как очистить (удалить) несмонтированные ПВХ и ПВ?

Мы не хотим удалять PV и PVC, так как стручки используют их большую часть времени. Однако в долгосрочной перспективе у нас будет много PV и PVC, которые не будут использоваться. Как безопасно чистить?

3 ответа

Не очень элегантный, но быстрый способ удалить выпущенные PV

kubectl get pv | grep Released | awk '$1 {print$1}' | while read vol; do kubectl delete pv/${vol}; done

Просматривая текущие ответы, похоже, что большинство из них не дают прямого ответа на вопрос (я могу ошибаться). ПВХ, которыйBound это не то же самое, что Mounted. Текущих ответов должно хватить, чтобы очиститьUnbound ПВХ, но поиск и очистка всего Unmounted PVC кажется без ответа.

К сожалению, похоже, что -o=go-template=... нет переменной для Mounted By: как показано в kubectl describe pvc.

Вот что я придумал после некоторого взлома:

Чтобы вывести список всех PVC в кластере (смонтированных и не смонтированных), вы можете сделать это: kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Mounted By:.*$"

В -Aвернет каждый PVC в кластере в каждом пространстве имен. Затем мы фильтруем, чтобы показать толькоName, Namespace а также Mounted By поля.

Лучшее, что я мог придумать, чтобы затем получить имена и пространства имен всех несмонтированных PVC, это следующее:

kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Mounted By:.*$" | grep -B 2 "<none>" | grep -E "^Name:.*$|^Namespace:.*$"

На самом деле удалить PVC довольно сложно, потому что нам нужно знать имя PVC, а также его пространство имен. Для этого мы используем вырезать, вставить и xargs:

kubectl describe -A pvc | grep -E "^Name:.*$|^Namespace:.*$|^Mounted By:.*$" | grep -B 2 "<none>" | grep -E "^Name:.*$|^Namespace:.*$" | cut -f2 -d: | paste -d " " - - | xargs -n2 bash -c 'kubectl -n ${1} delete pvc ${0}'
  • cut удаляет Name: а также Namespace: так как они просто мешают
  • paste ставит Name ПВХ и это Namespaceна той же линии
  • xargs -n bash делает так, что название ПВХ ${0} и пространство имен ${1}.

Признаюсь, у меня есть ощущение, что это не лучший способ сделать это, но это был единственный очевидный способ, который я мог придумать (в интерфейсе командной строки) для этого.

После запуска ваши тома будут идти с Bound к Unbound и у других ответов в этой теме есть хорошие идеи о том, как их очистить.

Также имейте в виду, что некоторые контроллеры громкости на самом деле не удаляют ваши данные при удалении томов в Kubernetes. Возможно, вам все равно придется очистить это в любой системе, которую вы используете.

Например, в контроллере NFS данные переименовываются с archived- префикс и на стороне NFS вы можете запустить rm -rf /persistentvolumes/archived-*. Для AWS EBS вам все равно может потребоваться удалить тома EBS, если они отсоединены от любого экземпляра.

Надеюсь, это поможет!

Если вы хотите удалить все несвязанные PV и PVC, вы можете сделать это:

Сначала удалите PVC:

$ kubectl -n <namespace> get pvc | tail -n +2 | grep -v Bound | \
  awk '{print $1}' | xargs -I{} kubectl -n namespace delete pvc {}

Затем просто удалите PV:

$ kubectl -n <namespace> get pv | tail -n +2 | grep -v Bound | \
  awk '{print $1}' | xargs -I{} kubectl -n namespace delete pv {}

Все предыдущие ответы действительны и интересны. Вот еще один простой способ удалить постоянные тома.

Вы должны сначала удалить связанный с ним запрос на постоянный том, но в некоторых случаях постоянные тома нельзя было удалить автоматически. (Пример: политика возврата "Сохранить").

Вот безопасный синтаксис для удаления постоянных томов с помощью освобожденного состояния (неиспользуемых и размонтированных).

kubectl get --no-headers persistentvolumes|awk '$5=="Released" { print $1 }'|xargs echo "kubectl delete persistentvolumes"

Пока вы не сохраните пвх, ваш пв будет в связанном состоянии. Таким образом, вы можете просто пойти и удалить неиспользованный ПВХ с: kubectl -n namespace get pvc -o name | grep myname | xargs kubectl -n namespace delete

Да, сначала нужно удалить неиспользованный ПВХ. С kubectl get pvc --all-namespaces Вы можете перечислить их все во всех пространствах имен вместе с соответствующими PV. Чтобы удалить неиспользуемые PV, вам нужно изменить их ReclaimPolicy, потому что если он установлен в значение "Сохранить", они не будут удалены, но будут зависать в состоянии "Выпущено". Таким образом, чтобы сделать это, вам нужно исправить патч (невозможно редактировать его вручную с помощью kubectl edit по какой-то причине)

kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'
Другие вопросы по тегам