Kyverno — это дополнение для Kubernetes, которое проверяет и изменяет ресурсы кластера по заданным политикам. С его помощью можно запретить запуск привилегированных подов, потребовать лимиты ресурсов и метки, автоматически добавлять аннотации и создавать стандартные ресурсы в новых неймспейсах.
Политики описываются как Kubernetes-ресурсы в YAML-манифестах и применяются через kubectl. Kyverno поддерживает четыре основных действия:
-
Validate — проверяет, соответствует ли ресурс требованиям политики.
-
Mutate — изменяет ресурс, например добавляет метки или аннотации.
-
Generate — создает ресурсы по заданным правилам.
-
Cleanup — удаляет ресурсы по условиям политики или по истечении заданного срока.
Установка
Kyverno не зависит от других дополнений. Для его работы не нужны Ingress и отдельные ноды с публичным IP-адресом.
Для установки откройте панель управления кластером, перейдите во вкладку «Дополнения» и выберите Kyverno.
В открывшемся мастере можно оставить параметры по умолчанию или включить «Продвинутую установку» и изменить конфигурацию. Для начала работы достаточно настроек по умолчанию.
Нажмите «Установить» и дождитесь завершения установки.
Аддон устанавливается в неймспейс kyverno.
Для проверки установки выполните команду:
kubectl get pods -n kyverno
При установке с параметрами по умолчанию должны быть запущены четыре пода — по одному для каждого контроллера. Убедитесь, что все они находятся в статусе Running, а в столбце READY указано 1/1.
|
Компонент |
Назначение |
|
|
Проверяет и изменяет ресурсы при обработке запросов на их создание и обновление через admission-вебхуки. |
|
|
Создает ресурсы по правилам generate и изменяет существующие ресурсы по правилам |
|
|
Удаляет ресурсы по политикам очистки, в том числе |
|
|
Формирует отчеты |
Особенности работы
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.
Создание политики
Создайте неймспейс для примера:
kubectl create namespace kyverno-example
Создайте файл require-environment-label.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-, и исключает автоматически созданныйConfigMapkube-root-ca.crt; -
validationsпроверяет наличие меткиenvironment. Значение метки может быть любым.
Для условий в ValidatingPolicy используется язык выражений CEL. Подробнее о параметрах этого типа политик — в документации Kyverno.
Примените манифест:
kubectl apply -f require-environment-label.yaml
Проверка отчетов
Создайте ConfigMap без обязательной метки:
kubectl create configmap example-config -n kyverno-example --from-literal=mode=test
В режиме Audit ресурс будет создан. Через некоторое время проверьте результаты:
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 — сообщение о необходимости указать метку.
Добавьте метку:
kubectl label configmap example-config -n kyverno-example environment=test
Отчеты обновляются асинхронно. Состояние ресурса и результат в PolicyReport могут временно отличаться, поэтому сразу после добавления метки в отчете еще может отображаться fail.
Следите за обновлением отчета командой:
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.
Отчеты по ресурсам во всех неймспейсах и по ресурсам уровня кластера можно посмотреть командами:
kubectl get policyreports -A kubectl get clusterpolicyreports
Отчеты отражают текущее состояние ресурсов и не хранят историю всех нарушений. Подробнее — в документации по отчетам Kyverno.
Включение блокировки
После проверки отчетов замените Audit на Deny в файле require-environment-label.yaml:
validationActions:
- Deny
Повторно примените манифест:
kubectl apply -f require-environment-label.yaml
Теперь попробуйте создать еще один ConfigMap без метки:
kubectl create configmap example-without-label -n kyverno-example --from-literal=mode=test
После вступления политики в силу Kyverno отклонит запрос и вернет сообщение «Укажите метку environment для ConfigMap». Чтобы снова разрешить создание ресурсов с нарушениями, верните Audit и примените манифест повторно.
Удаление примера
Удалите тестовую политику и неймспейс:
kubectl delete -f require-environment-label.yaml kubectl delete namespace kyverno-example
Дополнение Kyverno при этом останется установленным в кластере.
Удаление дополнения
Перед удалением Kyverno обязательно удалите все созданные вами политики. Если они понадобятся позже, предварительно сохраните их манифесты. При удалении аддона удаляются и его CRD — определения пользовательских типов ресурсов, поэтому политики в кластере не сохранятся.
Сохранение политик
Выгрузите политики в YAML-файл:
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, сохраните их отдельно:
kubectl get cleanuppolicies.kyverno.io,clustercleanuppolicies.kyverno.io -A -o yaml > kyverno-cleanup-policies-backup.yaml
Если вы создавали политики других типов, например NamespacedValidatingPolicy, также выгрузите их перед удалением. Проверьте, что команды завершились без ошибок и файлы содержат все нужные политики.
Удаление политик и аддона
Удалите политики, пока Kyverno еще работает:
kubectl delete vpol,mpol,gpol,ivpol,dpol,cpol,pol -A --all
Если вы использовали политики очистки, удалите и их:
kubectl delete cleanuppolicies.kyverno.io,clustercleanuppolicies.kyverno.io -A --all
Команды удаляют все политики перечисленных типов во всех неймспейсах и на уровне кластера. Политики других типов, если они есть, также необходимо удалить.
Убедитесь, что удаление политик завершено. После этого откройте вкладку «Дополнения» в панели управления кластером, нажмите на три точки в карточке Kyverno и нажмите на кнопку «Удалить дополнение».