Evolution
Тема интерфейса

Настроить очистку кластера от неиспользуемых артефактов с помощью K8s Cleaner

В инструкции описано, как настроить K8s Cleaner для очистки кластера от неиспользуемых или неработающих артефактов на примере автоматического удаления подов в нерабочем состоянии.

Аналогично настраивается очистка и для других типов ресурсов Kubernetes, таких как неиспользуемые сервисы, устаревшие Deployment, неактуальные ConfigMap или секреты.

Перед началом работы

У вас должен быть создан кластер Managed Kubernetes и группа узлов.

  1. В кластер установите плагин K8s Cleaner.

  2. Проверьте, что K8s Cleaner установлен корректно:

    kubectl get pods -n k8s-cleaner

    Под должен быть в статусе «Running».

Шаг 1. Создайте Cleaner с правилами уборки кластера

Cleaner автоматически удаляет поды в состоянии «Failed», у которых хотя бы один контейнер завершился с причиной «Error» и ненулевым кодом выхода exitCode != 0.

  1. Создайте файл cloudru-cleaner.yaml и сохраните следующий манифест:

    apiVersion: apps.projectsveltos.io/v1alpha1
    kind: Cleaner
    metadata:
    name: cloudru-error-state-pods
    spec:
    schedule: "*/10 * * * *"
    resourcePolicySet:
    resourceSelectors:
    - kind: Pod
    group: ""
    version: v1
    excludeDeleted: false
    evaluate: |
    function evaluate()
    hs = {}
    hs.matching = false
    -- Check if pod phase is Failed
    if obj.status.phase == "Failed" then
    -- Check container status for Error termination
    if obj.status.containerStatuses then
    for _, containerStatus in ipairs(obj.status.containerStatuses) do
    if containerStatus.state and containerStatus.state.terminated then
    -- Match only pods terminated with reason "Error" and exit code != 0
    if containerStatus.state.terminated.reason == "Error" and
    containerStatus.state.terminated.exitCode ~= 0 then
    hs.matching = true
    break
    end
    end
    end
    end
    end
    return hs
    end
    action: Scan
    notifications:
    - name: report
    type: CleanerReport

    Где:

    • spec.schedule — расписание для выполнения очистки в CRON-формате.

      Запись */10 * * * * означает, что поиск объектов для очистки выполняется каждые 10 минут.

    • spec.resourcePolicySet.resourceSelectors.kind — тип ресурса для уборки.

      В примере проверяются поды.

    • spec.resourcePolicySet.resourceSelectors.evaluate — Lua-скрипт, который реализует логику фильтрации.

      В примере:

      • выполняется проверка, что под находится в статусе «Failed»;

      • среди контейнеров выполняется поиск таких, которые завершились с причиной «Error» и ненулевым exit code;

      • возвращается флаг hs.matching — если true, под попадет под действие Cleaner.

    • spec.action — действие, которое нужно выполнить для найденных ресурсов.

      Возможные значения:

      • Delete — удалить соответствующие объекты из кластера.

      • Scan — объекты, соответствующие правилу, фиксируются в отчете.

        Режим подходит для тестирования и отладки.

  2. В терминале или PowerShell выполните команду:

    kubectl apply -f cloudru-cleaner.yaml

    Результат:

    cleaner.apps.projectsveltos.io/cloudru-error-state-pods created

Шаг 2. Создайте под

  1. Создайте файл cloudru-error-demo-pod.yaml и сохраните следующий манифест:

    apiVersion: v1
    kind: Pod
    metadata:
    name: error-demo-pod
    namespace: default
    spec:
    containers:
    - name: demo-container
    image: emk8s.cr.cloud.ru/busybox
    command: ["sh", "-c", "exit 1"]
    restartPolicy: Never
  2. В терминале или PowerShell выполните команду:

    kubectl apply -f cloudru-error-demo-pod.yaml

    Такой под отработает и перейдет в статус «Failed», а его контейнер в state.terminated.reason: Error с exitCode: 1.

  3. Проверьте его статус:

    kubectl describe pods

    Примерный результат:

    Labels: <none>
    Annotations: <none>
    Status: Failed
    ...
    State: Terminated
    Reason: Error
    Exit Code: 1
    ...
  4. Подождите 10–15 минут.

Шаг 3. Проверьте отчет

  1. В терминале или PowerShell выполните команду:

    kubectl get report

    Результат:

    cloudru-error-state-pods 2m29s
  2. Чтобы посмотреть подробный отчет, выполните команду:

    kubectl describe report cloudru-error-state-pods