Восстановить Loki в standalone-режиме при заполнении PVC
В режиме standalone Loki хранит данные на одном PVC. Если PVC заполнен, pod Loki может перейти в CrashLoopBackOff, а в логах появляются ошибки вида no space left on device.
Не удаляйте PVC как первый шаг восстановления. В standalone это приведет к потере локального хранилища логов.
Проверить состояние
-
Найдите namespace с Loki. Для компонента
loggingиспользуетсяstackland-logging, для bootstrap-установки может использоватьсяloki.kubectl get pods,pvc -A | grep -E 'loki|stackland-logging' -
Проверьте pod и PVC:
NS=stackland-logging kubectl -n "$NS" get pods,pvc kubectl -n "$NS" describe pod -l app.kubernetes.io/name=loki kubectl -n "$NS" describe pvc -
Проверьте свободное место на PVC по метрикам kubelet или внутри pod, если pod еще стартует:
POD=$(kubectl -n "$NS" get pod \ -l app.kubernetes.io/name=loki,app.kubernetes.io/component=single-binary \ -o jsonpath='{.items[0].metadata.name}') kubectl -n "$NS" exec -it "$POD" -- df -h /var/loki
Предпочтительный способ: расширить PVC
-
Узнайте имя PVC и StorageClass:
NS=stackland-logging kubectl -n "$NS" get pvc PVC=<PVC_NAME> SC=$(kubectl -n "$NS" get pvc "$PVC" -o jsonpath='{.spec.storageClassName}') kubectl get storageclass "$SC" -o jsonpath='{.allowVolumeExpansion}{"\n"}' -
Если
allowVolumeExpansion=true, увеличьте PVC. Новое значение должно быть больше текущего:kubectl -n "$NS" patch pvc "$PVC" --type merge \ -p '{"spec":{"resources":{"requests":{"storage":"100Gi"}}}}' -
Дождитесь завершения resize:
kubectl -n "$NS" get pvc "$PVC" -w -
Перезапустите Loki, если pod сам не восстановился:
STS=$(kubectl -n "$NS" get statefulset \ -l app.kubernetes.io/name=loki,app.kubernetes.io/component=single-binary \ -o jsonpath='{.items[0].metadata.name}') kubectl -n "$NS" rollout restart statefulset/"$STS" kubectl -n "$NS" rollout status statefulset/"$STS" -
Закрепите новый размер в
LoggingConfig, иначе следующий reconcile может вернуть старое значение:apiVersion: stackland.yandex.cloud/v1alpha1 kind: LoggingConfig metadata: name: main spec: settings: logStorage: storage: enabled: true size: 100Gi
Если PVC нельзя расширить
Если StorageClass не поддерживает expansion или в VolumeGroup нет свободного места, сначала освободите или добавьте емкость на уровне дисковой подсистемы. После этого повторите расширение PVC.
Если быстро добавить место невозможно, можно удалить часть старых локальных данных Loki. Это аварийный способ с потерей части логов.
-
Остановите Loki:
NS=stackland-logging STS=$(kubectl -n "$NS" get statefulset \ -l app.kubernetes.io/name=loki,app.kubernetes.io/component=single-binary \ -o jsonpath='{.items[0].metadata.name}') kubectl -n "$NS" scale statefulset/"$STS" --replicas=0 -
Подключите PVC к временному pod и удалите самые старые данные из
/var/loki/chunks. Перед удалением проверьте, какие директории занимают место:kubectl -n "$NS" run loki-pvc-debug --image=busybox:1.37 --restart=Never \ --overrides='{"spec":{"containers":[{"name":"debug","image":"busybox:1.37","command":["sleep","1d"],"volumeMounts":[{"name":"storage","mountPath":"/var/loki"}]}],"volumes":[{"name":"storage","persistentVolumeClaim":{"claimName":"<PVC_NAME>"}}]}}' kubectl -n "$NS" exec -it loki-pvc-debug -- sh du -h /var/loki | sort -h | tail -20 find /var/loki/chunks -type f -mtime +30 -exec rm -f {} \; exit -
Удалите временный pod и запустите Loki:
kubectl -n "$NS" delete pod loki-pvc-debug kubectl -n "$NS" scale statefulset/"$STS" --replicas=1 kubectl -n "$NS" rollout status statefulset/"$STS"
После восстановления
Проверьте, что для standalone включены retention и compactor:
spec:
settings:
logStorage:
loki:
singleBinary:
enabled: true
storage:
size: 50Gi
limitsConfig:
retentionPeriod: 30d
compactor:
retentionEnabled: true
retentionDeleteDelay: 2h
Если Loki регулярно заполняет PVC даже с retention, уменьшите loki.singleBinary.limitsConfig.retentionPeriod, увеличьте loki.singleBinary.storage.size, проверьте объем входящих логов и рассмотрите переход на loki.simpleScalable с S3-хранилищем.