---
title: "Kyverno"
---

# Kyverno

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

Kyverno — это дополнение для Kubernetes, которое проверяет и изменяет ресурсы кластера по заданным политикам. С его помощью можно запретить запуск привилегированных подов, потребовать лимиты ресурсов и метки, автоматически добавлять аннотации и создавать стандартные ресурсы в новых неймспейсах.

Политики описываются как Kubernetes-ресурсы в YAML-манифестах и применяются через `kubectl`. Kyverno поддерживает четыре основных действия:

-   **Validate** — проверяет, соответствует ли ресурс требованиям политики.
    
-   **Mutate** — изменяет ресурс, например добавляет метки или аннотации.
    
-   **Generate** — создает ресурсы по заданным правилам.
    
-   **Cleanup** — удаляет ресурсы по условиям политики или по истечении заданного срока.
    

## Установка

Kyverno не зависит от других дополнений. Для его работы не нужны Ingress и отдельные ноды с публичным IP-адресом.

Для установки откройте панель управления кластером, перейдите во вкладку «Дополнения» и выберите Kyverno.

В открывшемся мастере можно оставить параметры по умолчанию или включить «Продвинутую установку» и изменить конфигурацию. Для начала работы достаточно настроек по умолчанию.

Нажмите «Установить» и дождитесь завершения установки.

Аддон устанавливается в неймспейс `kyverno`.

Для проверки установки выполните команду:

```bash
kubectl get pods -n kyverno
```

При установке с параметрами по умолчанию должны быть запущены четыре пода — по одному для каждого контроллера. Убедитесь, что все они находятся в статусе `Running`, а в столбце `READY` указано `1/1`.

| **Компонент** | **Назначение** |
| --- | --- |
| `kyverno-admission-controller` | Проверяет и изменяет ресурсы при обработке запросов на их создание и обновление через admission-вебхуки. |
| `kyverno-background-controller` | Создает ресурсы по правилам generate и изменяет существующие ресурсы по правилам `mutateExisting` в фоновом режиме. |
| `kyverno-cleanup-controller` | Удаляет ресурсы по политикам очистки, в том числе `CleanupPolicy`, и по метке `cleanup.kyverno.io/ttl`. |
| `kyverno-reports-controller` | Формирует отчеты `PolicyReport` и `ClusterPolicyReport`, выполняет фоновое сканирование ресурсов. |

## Особенности работы

Kyverno обрабатывает ресурсы, которые соответствуют условиям созданных политик и не входят в исключения аддона.

При установке через панель управления из проверки исключены:

-   неймспейсы `kube-system` и `kyverno`;
    
-   служебные типы ресурсов, в том числе `Node`, `Event`, `ReplicaSet`, `APIService` и `TokenReview`;
    
-   собственные ресурсы дополнений: их `Deployment`, `Service`, `ConfigMap`, `Secret` и другие объекты.
    

Для проверяющих политик можно сначала включить режим `Audit`: ресурсы с нарушениями будут создаваться, а результаты проверки появятся в отчетах. После проверки результатов можно включить блокировку запросов — `Deny` для `ValidatingPolicy` или `Enforce` для правил проверки в `ClusterPolicy` и `Policy`.

Некоторые политики могут заблокировать установку других дополнений из панели управления или нарушить работу уже установленных. Начинайте с режима `Audit`, ограничивайте область проверки нужными ресурсами и неймспейсами. Переводите политику в `Deny` или `Enforce` только после того, как убедитесь по отчетам, что она не мешает штатной работе кластера.

## Пример использования

Рассмотрим пример политики, которая требует метку `environment` у объектов `ConfigMap` в отдельном неймспейсе. Сначала проверим ее в режиме `Audit`.

### Создание политики

Создайте неймспейс для примера:

```bash
kubectl create namespace kyverno-example
```

Создайте файл `require-environment-label.yaml`:

```yaml
apiVersion: policies.kyverno.io/v1
kind: ValidatingPolicy
metadata:
 name: require-environment-label
spec:
 validationActions:
   - Audit
 matchConstraints:
   namespaceSelector:
     matchLabels:
       kubernetes.io/metadata.name: kyverno-example
   resourceRules:
     - apiGroups: [""]
       apiVersions: [v1]
       operations: [CREATE, UPDATE]
       resources: [configmaps]
 matchConditions:
   - name: is-example-config
     expression: "object.metadata.name.startsWith('example-')"
 validations:
   - expression: "has(object.metadata.labels) && 'environment' in object.metadata.labels"
     message: "Укажите метку environment для ConfigMap."
```

В этом манифесте:

-   `namespaceSelector` ограничивает проверку неймспейсом `kyverno-example`;
    
-   `resourceRules` ограничивает проверку объектами `ConfigMap`;
    
-   `matchConditions` выбирает объекты, имена которых начинаются с `example-`, и исключает автоматически созданный `ConfigMap` `kube-root-ca.crt`;
    
-   `validations` проверяет наличие метки `environment`. Значение метки может быть любым.
    

Для условий в `ValidatingPolicy` используется язык выражений CEL. Подробнее о параметрах этого типа политик — в [документации Kyverno](https://kyverno.io/docs/policy-types/validating-policy/).

Примените манифест:

```bash
kubectl apply -f require-environment-label.yaml
```

### Проверка отчетов

Создайте `ConfigMap` без обязательной метки:

```bash
kubectl create configmap example-config -n kyverno-example --from-literal=mode=test
```

В режиме Audit ресурс будет создан. Через некоторое время проверьте результаты:

```bash
kubectl get policyreports -n kyverno-example \
 -o custom-columns='RESOURCE:.scope.name,PASS:.summary.pass,FAIL:.summary.fail,RESULT:.results[0].result,MESSAGE:.results[0].message'
```

В строке для `example-config` должно появиться нарушение политики `require-environment-label`: в столбце `RESULT` будет указано `fail`, а в `MESSAGE` — сообщение о необходимости указать метку.

Добавьте метку:

```bash
kubectl label configmap example-config -n kyverno-example environment=test
```

Отчеты обновляются асинхронно. Состояние ресурса и результат в `PolicyReport` могут временно отличаться, поэтому сразу после добавления метки в отчете еще может отображаться `fail`.

Следите за обновлением отчета командой:

```bash
kubectl get policyreports -n kyverno-example --watch \
 -o custom-columns='RESOURCE:.scope.name,PASS:.summary.pass,FAIL:.summary.fail,RESULT:.results[0].result,MESSAGE:.results[0].message'
```

Дождитесь, пока в строке `example-config` значение `RESULT` изменится на `pass`, затем завершите просмотр сочетанием клавиш `Ctrl+C`.

Отчеты по ресурсам во всех неймспейсах и по ресурсам уровня кластера можно посмотреть командами:

```bash
kubectl get policyreports -A
kubectl get clusterpolicyreports
```

Отчеты отражают текущее состояние ресурсов и не хранят историю всех нарушений. Подробнее — в [документации по отчетам Kyverno](https://kyverno.io/docs/guides/reports/).

### Включение блокировки

После проверки отчетов замените `Audit` на `Deny` в файле `require-environment-label.yaml`:

```yaml
 validationActions:
   - Deny
```

Повторно примените манифест:

```bash
kubectl apply -f require-environment-label.yaml
```

Теперь попробуйте создать еще один `ConfigMap` без метки:

```bash
kubectl create configmap example-without-label -n kyverno-example --from-literal=mode=test
```

После вступления политики в силу Kyverno отклонит запрос и вернет сообщение «Укажите метку environment для ConfigMap». Чтобы снова разрешить создание ресурсов с нарушениями, верните `Audit` и примените манифест повторно.

### Удаление примера

Удалите тестовую политику и неймспейс:

```bash
kubectl delete -f require-environment-label.yaml
kubectl delete namespace kyverno-example
```

Дополнение Kyverno при этом останется установленным в кластере.

## Удаление дополнения

Перед удалением Kyverno обязательно удалите все созданные вами политики. Если они понадобятся позже, предварительно сохраните их манифесты. При удалении аддона удаляются и его `CRD` — определения пользовательских типов ресурсов, поэтому политики в кластере не сохранятся.

### Сохранение политик

Выгрузите политики в YAML-файл:

```bash
kubectl get vpol,mpol,gpol,ivpol,dpol,cpol,pol -A -o yaml > kyverno-policies-backup.yaml
```

Команда сохраняет `ValidatingPolicy`, `MutatingPolicy`, `GeneratingPolicy`, `ImageValidatingPolicy`, `DeletingPolicy`, `ClusterPolicy` и `Policy`.

Если вы использовали `CleanupPolicy` или `ClusterCleanupPolicy`, сохраните их отдельно:

```bash
kubectl get cleanuppolicies.kyverno.io,clustercleanuppolicies.kyverno.io -A -o yaml > kyverno-cleanup-policies-backup.yaml
```

Если вы создавали политики других типов, например `NamespacedValidatingPolicy`, также выгрузите их перед удалением. Проверьте, что команды завершились без ошибок и файлы содержат все нужные политики.

### Удаление политик и аддона

Удалите политики, пока Kyverno еще работает:

```bash
kubectl delete vpol,mpol,gpol,ivpol,dpol,cpol,pol -A --all
```

Если вы использовали политики очистки, удалите и их:

```bash
kubectl delete cleanuppolicies.kyverno.io,clustercleanuppolicies.kyverno.io -A --all
```

Команды удаляют все политики перечисленных типов во всех неймспейсах и на уровне кластера. Политики других типов, если они есть, также необходимо удалить.

Убедитесь, что удаление политик завершено. После этого откройте вкладку «Дополнения» в панели управления кластером, нажмите на три точки в карточке Kyverno и нажмите на кнопку «Удалить дополнение».
