В Kubernetes v1.37 функция PersistentVolumeClaimUnusedSinceTime переведена в статус бета-версии (включена по умолчанию). Благодаря этой функции контроллер защиты PersistentVolumeClaim (PVC) добавляет условие Unused («Не используется») к каждому PVC, позволяя узнать, ссылается ли на него какой-либо запущенный под, без необходимости использования сторонних инструментов или перекрестных проверок.
Определение API для условий PVC см. в справочнике API PersistentVolumeClaim. Читайте далее, чтобы узнать, как работает условие Unused и как его использовать.
Зачем отслеживать использование PVC?
В крупномасштабных кластерах Kubernetes пользователи часто создают PVC, а затем удаляют связанные с ними поды, не очищая хранилище, поскольку Kubernetes не удаляет PVC автоматически при удалении подов (для защиты от случайной потери данных). Со временем такие «осиротевшие» PVC могут накапливаться, незаметно потребляя емкость хранилища и увеличивая расходы на облачные услуги.
До выхода Kubernetes v1.37 было легко определить неиспользуемый PersistentVolume, но гораздо сложнее понять, используется ли еще PVC. Для этого требовалось сопоставлять поды, PersistentVolumes и PVC в течение потенциально длительного периода времени. Администраторы часто прибегали к созданию пользовательских конвейеров мониторинга или скриптов, чтобы ответить на, казалось бы, простой вопрос: «Использует ли что-нибудь этот том на самом деле?»
Функция PersistentVolumeClaimUnusedSinceTime решает эту проблему, делая ответ доступным нативно в статусе PVC. Как только функция включена, каждый PVC получает условие Unused, управляемое контроллером защиты PVC.
Пользовательские сценарии
- Администратор хранилища: «Я хочу знать, какие PVC в моем кластере не используются ни одним подом, чтобы я мог безопасно выявить осиротевшие тома и запланировать их удаление».
- DevOps-инженер: «Я хочу получить список PVC, у которых условие Unused установлено в True, чтобы я мог автоматизировать очистку в средах разработки».
Как это работает?
Контроллер защиты PVC, который уже отслеживает поды для обеспечения защиты используемых объектов хранилища, теперь также управляет новым условием Unused для PVC.
Условие работает следующим образом:
Несколько деталей, заслуживающих внимания:
- Завершенные поды не учитываются: под, который завершил работу (фаза Succeeded или Failed), не сохраняет PVC в статусе «используется». Это означает, что пакетные задания (batch jobs) с параметром restartPolicy: Never не помешают PVC перейти в состояние Unused=True после их завершения.
- Ожидающие (Pending) поды учитываются: даже под, который невозможно запланировать (например, из-за невыполнимого селектора узла), все равно считается использующим PVC. Намерения использовать том достаточно.
- Несколько подов: если несколько подов ссылаются на один и тот же PVC, условие переходит в Unused=True только после того, как будет удален или завершится *последний* незавершенный под.
Использование lastTransitionTime для определения того, когда PVC стал неактивным
Как и любое другое условие в Kubernetes, условие Unused содержит стандартное поле lastTransitionTime. Это дает полезное преимущество: когда условие переходит из False в True, поле lastTransitionTime точно фиксирует момент, когда PVC стал неактивным. Вы можете использовать эту метку времени, чтобы ответить на вопросы типа «как долго этот PVC простаивает?» — например, чтобы найти PVC, которые не использовались более 30 дней (см. пример запроса ниже).
Что изменилось при переходе от альфа- к бета-версии?
В Kubernetes v1.36 эта функция была представлена как альфа-версия, где требовалось явно включать feature gate PersistentVolumeClaimUnusedSinceTime. В бета-версии v1.37 этот параметр включен по умолчанию, а функция имеет полное покрытие сквозными тестами (end-to-end).
Как использовать
Поскольку функция находится в статусе бета-версии и включена по умолчанию в Kubernetes v1.37, условие Unused будет появляться на PVC автоматически. Вот пошаговое руководство, как увидеть это в действии:
- Создайте PVC: apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-data spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
Создайте PVC:
- Через некоторое время проверьте условия PVC: kubectl get pvc my-data -o jsonpath='{.status.conditions[*]}' | jq . Вы должны увидеть условие Unused со статусом True и причиной NoPodsUsingPVC: { "lastProbeTime": null, "lastTransitionTime": "2026-09-14T12:03:11Z", "message": "No pods are currently referencing this PVC", "reason": "NoPodsUsingPVC", "status": "True", "type": "Unused" }
Через некоторое время проверьте условия PVC:
Вы должны увидеть условие Unused со статусом True и причиной NoPodsUsingPVC:
- Создайте под, использующий этот PVC: apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: app image: busybox command: ["sleep", "3600"] volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: my-data
Создайте под, использующий этот PVC:
- Проверьте условие снова — теперь оно должно показывать Unused=False: kubectl get pvc my-data -o jsonpath='{.status.conditions[?(@.type=="Unused")].status}' Вывод: False
Проверьте условие снова — теперь оно должно показывать Unused=False:
Вывод:
- Удалите под и подождите, пока условие снова перейдет в Unused=True: kubectl delete pod my-app kubectl get pvc my-data -o jsonpath='{.status.conditions[?(@.type=="Unused")]}' Условие должно снова показывать Unused=True с причиной NoPodsUsingPVC.
Удалите под и подождите, пока условие снова перейдет в Unused=True:
Условие должно снова показывать Unused=True с причиной NoPodsUsingPVC.
Поиск неиспользуемых PVC в кластере
Чтобы вывести список всех PVC, которые не использовались более 30 дней, можно использовать команду:
Примечание:
Эта команда использует jq, процессор JSON для командной строки.
Что дальше?
В зависимости от отзывов и внедрения, проект Kubernetes планирует перевести эту функцию в статус общедоступной (General Availability, GA) в будущих выпусках. Если у вас есть отзывы об этой функции, пожалуйста, откройте issue в репозитории kubernetes/kubernetes.
Чтобы узнать больше об этом улучшении, обратитесь к KEP-5541: PersistentVolumeClaim last used time.
Как принять участие
Проект Kubernetes всегда приветствует новых участников. Если вы хотите принять участие, присоединяйтесь к нам в SIG Storage.
Если вы хотите поделиться отзывом, вы можете сделать это на нашем публичном канале в Slack (посетите https://slack.k8s.io/ для получения приглашения, если оно вам нужно).
Особая благодарность участникам, которые помогли спроектировать и реализовать эту функцию (в алфавитном порядке):
- Arvind Parekh (ArvindParekh)
- Hemant Kumar (gnufied)
- Jan Šafránek (jsafrane)
- Kevin Hannon (kannon92)
- Roman Bednář (RomanBednar)







