Как очистить (удалить) несмонтированные ПВХ и ПВ?
Мы не хотим удалять 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"}}'