Pod не стартует, потому что его PVC застрял в Pending — диагностируйте и почините
Pod не стартует — он висит в ожидании тома. Вы смотрите PVC и делаете describe. Объясните, что значит Pending у PVC, назовите вероятные причины и дайте фикс для показанного события.
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-app Pending fast-ssd 6m
$ kubectl describe pvc data-app
...
Events:
Type Reason Age Message
---- ------ ---- -------
Warning ProvisioningFailed 6m storageclass.storage.k8s.io "fast-ssd" not found
Определите причину и дайте фикс.
Pending у PVC значит, что он не связался: выделение не удовлетворило claim. Событие describe — StorageClass fast-ssd не найден, provisioner не запустился. Причины: нет дефолтного StorageClass или подходящего PV. Фикс — указать существующий StorageClass или дефолтный.
- ✗Винить Pod или образ, когда событие указывает на выделение хранилища
- ✗Игнорировать события describe, которые называют точную причину сбоя
- ✗Считать, что Pending PVC свяжется сам без валидного StorageClass
- →Как изменилась бы диагностика, если бы события ProvisioningFailed не было вовсе?
- →Как пометить StorageClass как дефолтный для кластера?
Решение
1. Что значит Pending
PVC в статусе Pending — это несвязанный claim: Kubernetes не нашёл и не создал для него PV. Первым делом всегда смотрят события:
$ kubectl describe pvc data-app
Events:
Warning ProvisioningFailed 6m storageclass.storage.k8s.io "fast-ssd" not found
2. Диагноз
Событие прямо называет причину: PVC ссылается на storageClassName: fast-ssd, которого в кластере нет, поэтому ни один provisioner не сработал. Типовые причины Pending:
- указан несуществующий
storageClassName(наш случай); - нет StorageClass по умолчанию, а имя не задано вовсе;
- статический сетап: нет PV, подходящего под запрошенные размер и access mode.
3. Фикс
Сослаться на существующий класс (проверить kubectl get storageclass) либо пометить класс дефолтным:
$ kubectl get storageclass
$ kubectl patch storageclass standard \
-p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
Затем пересоздать PVC с валидным storageClassName (или положиться на дефолт). После этого provisioner создаёт PV, PVC переходит в Bound, и Pod стартует.