Поддержите нашу команду в рейтинге работодателей на hh.ru
Вход/ Регистрация

Kyverno

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

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

  • Validate — проверяет, соответствует ли ресурс требованиям политики.

  • Mutate — изменяет ресурс, например добавляет метки или аннотации.

  • Generate — создает ресурсы по заданным правилам.

  • Cleanup — удаляет ресурсы по условиям политики или по истечении заданного срока.

Установка

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

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

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

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

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

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

    
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.

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

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

    
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-, и исключает автоматически созданный ConfigMap kube-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 и нажмите на кнопку «Удалить дополнение».

Была ли статья полезна?
Ваш ответ поможет улучшить документацию
Пока нет комментариев