DevOps

Анализ кластера k8s и очистка диска Nexus

nexus

Сценарий описывает последовательность действий: диагностика состояния кластера, проверка Nexus, расширение PVC и настройка автоочистки репозиториев. Подходит для команд, поддерживающих сборки/деплой бэкенда в Kubernetes.

1. Подготовка доступа

  • Убедитесь, что локально установлены kubectl, docker, curl, jq.
  • Настройте kubeconfig с правами администратора на целевой кластер.
  • Получите учётные данные администратора Nexus (UI/Admin API).

Проверка контекста kubectl

kubectl config current-context
kubectl version --client

2. Диагностика состояния Nexus в кластере

Поиск подов и сервисов

kubectl get pods -A | grep nexus
kubectl get svc -A | grep nexus

Проверка пода и логов

kubectl get pod nexus-0 -n nexus -o wide
kubectl describe pod nexus-0 -n nexus | tail -30
kubectl logs nexus-0 -n nexus --tail=100

В логах часто встречается ошибка No space left on device, если переполнено PV.

Проверка состояния PVC/PV и свободного места

kubectl get pvc -n nexus
kubectl get pv -n nexus | grep nexus
kubectl exec -n nexus nexus-0 -- df -h /nexus-data
kubectl exec -n nexus nexus-0 -- sh -c "du -sh /nexus-data/* | sort -hr | head -10"
Если основное место забирает /nexus-data/blobs, значит артефакты не чистились.

3. Расширение PVC Nexus

Если StorageClass позволяет расширение (поле allowVolumeExpansion: true), можно увеличить объём.

Проверка StorageClass

kubectl get storageclass sas-disk-infra -o yaml | grep -A2 allowVolumeExpansion

Изменение размера PVC

kubectl patch pvc nexus-data-nexus-0 -n nexus \
  -p '{"spec":{"resources":{"requests":{"storage":"800Gi"}}}}'

После выполнения дождитесь событий успешного расширения:

kubectl describe pvc nexus-data-nexus-0 -n nexus

В событиях появится:

  • ExternalExpanding – ожидание контроллера
  • VolumeResizeSuccessful
  • FileSystemResizeSuccessful

Проверьте новое свободное место:

kubectl exec -n nexus nexus-0 -- df -h /nexus-data

4. Настройка очистки артефактов в Nexus

Получение списка репозиториев

Сначала пробросьте порт или выполните kubectl exec для обращения к REST API:

kubectl port-forward -n nexus svc/nexus 8081:8081
curl -s -u admin:*** http://localhost:8081/service/rest/v1/repositories \
  | jq -r '.[] | "\(.name) \(.format) \(.type)"'

Создание политики Cleanup (пример для docker-repo)

curl -u admin:*** -X POST \
  http://localhost:8081/service/rest/v1/security/cleanup-policies \
  -H 'Content-Type: application/json' \
  -d '{
        "name": "docker-older-than-30d",
        "format": "docker",
        "criteria": {
          "lastDownloaded": "30d"
        },
        "notes": "Удалять docker-артефакты старше 30 дней"
      }'

Привязка политики к репозиторию

curl -u admin:*** -X PUT \
  http://localhost:8081/service/rest/v1/repositories/docker/hosted/lkmrdvs \
  -H 'Content-Type: application/json' \
  -d '{
        "name": "lkmrdvs",
        "online": true,
        "storage": {
          "blobStoreName": "default",
          "strictContentTypeValidation": true,
          "writePolicy": "ALLOW_ONCE"
        },
        "cleanup": {
          "policies": ["docker-older-than-30d"]
        },
        "docker": {
          "forceBasicAuth": true,
          "v1Enabled": false,
          "httpPort": null,
          "httpsPort": 8443,
          "subdomain": null
        }
      }'

Убедитесь, что параметры соответствуют текущей конфигурации репозитория.

Запуск задачи Cleanup вручную

curl -u admin:*** -X POST \
  http://localhost:8081/service/rest/v1/tasks \
  -H 'Content-Type: application/json' \
  -d '{
        "name": "docker-cleanup-now",
        "typeId": "repositoryCleanup",
        "schedule": "manual",
        "properties": {
          "repositoryName": "lkmrdvs"
        }
      }'

После создания выполните задачу:

curl -u admin:*** -X POST \
  http://localhost:8081/service/rest/v1/tasks/{taskId}/run

Task ID можно получить из ответа на предыдущий POST или из UI (админ-панель → System → Tasks).

5. Скрипт автоматизации очистки

Пример bash-скрипта, который удаляет docker-теги старше 30 дней по REST API:

#!/usr/bin/env bash
NEXUS_URL="https://nexus.example.com"
USER="admin"
PASS="***"
REPO="lkmrdvs"
OLDER_THAN="30d"

curl -s -u "$USER:$PASS" \
  "$NEXUS_URL/service/rest/v1/components?repository=$REPO" |
  jq -r '.items[] | "\(.id) \(.assets[0].downloadUrl) \(.assets[0].lastDownloaded)"' |
  while read -r ID URL LAST; do
    if [[ -z "$LAST" ]]; then continue; fi
    if [[ $(date -j -f "%Y-%m-%dT%H:%M:%S%z" "$LAST" +%s) -lt $(date -v-"${OLDER_THAN}" +%s) ]]; then
      echo "Deleting $ID ($URL, last downloaded $LAST)"
      curl -u "$USER:$PASS" -X DELETE \
        "$NEXUS_URL/service/rest/v1/components/$ID"
    fi
  done
Для больших репозиториев лучше использовать встроенные задачи Cleanup, чтобы не перегружать Nexus множеством REST-запросов.

6. Контроль после очистки

  • Проверить df -h /nexus-data — убедиться, что свободное место выросло.
  • Запустить тестовую сборку/деплой, чтобы удостовериться, что образы по-прежнему доступны.
  • Настроить мониторинг PVC (Prometheus/Grafana) и оповещения при достижении порога (например, 80%).

Заключение

Комбинированный подход — расширение диска + автоматическая очистка старых артефактов — позволяет избежать повторного переполнения Nexus и падения CI/CD-пайплайнов. Регулярно проверяйте состояние PVC, ведите журнал очисток и храните скрипты с настройками в репозитории инфраструктуры.