Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Kyverno

Модуль Kyverno - это механизм управления политиками безопасности кластера с помощью Custom Resources.

1. Основные возможности

  • Управление политиками. Определение и применение политик к ресурсам.

  • Admission‑контроль. Проверка (validate) и изменение (mutate) ресурсов при создании и обновлении.

  • Фоновое сканирование. Непрерывная проверка существующих ресурсов на соответствие политикам

  • Отчеты по политикам. Формирование отчетов о соблюдении политик.

  • Обработка исключений. Определение исключений из политик для отдельных случаев.

Более подробное описание Kyverno представлено в официальном репозитории.

2. Установка

2.1. Предварительные условия

  • У вас есть доступ к кластеру с учетной записью, имеющей роль cluster-admin в Kubernetes.

  • Вы установили утилиту kubectl для работы с Kubernetes.

2.2. Установка с помощью kubectl

  1. Установите оператор kyverno-operator. Для этого сохраните представленный ниже манифест в файл, например KyvernoOperator.yaml.

    Пример манифеста для установки kyverno-operator
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: kyverno-operator
      namespace: kyverno-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: kyverno-operator
      source: nova-catalog
      sourceNamespace: nova-operatorhub
      startingCSV: kyverno-operator.v1.13.1
  2. Установите манифест в кластер Kubernetes, выполнив команду:

     kubectl apply -f KyvernoOperator.yaml
  3. Проверьте состояние оператора после установки.

    kubectl get pods -n nova-operators
    Пример вывода:
    NAME                                             READY   STATUS    RESTARTS      AGE
    kyverno-operator-6f4fd9d5d4-69nvf                 1/1     Running   1 (44h ago)   5d

    Убедитесь, что оператор находится в статусе Running. В столбце READY должно быть 1/1.

Ограничения при создании и обновлении:

  • рекомендуется использовать validate.failureAction на уровне каждого правила

  • допустимые значения для validate.failureAction: только Audit или Enforce

  • при использовании validate.foreach поле validate.pattern на верхнем уровне не используется

2.2.1. Использование CEL-валидации (запрет сервисов типа NodePort)

ClusterPolicy с CEL-выражениями позволяет описывать валидацию декларативно на языке Common Expression Language. Данный пример запрещает создание и обновление в кластере сервисов типа NodePort.

Сохраните предоставленный манифест в файл, например, restrict-nodeport.yaml.

Пример манифеста
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: restrict-nodeport-cel
  annotations:
    policies.kyverno.io/title: Disallow NodePort in CEL expressions
    policies.kyverno.io/category: Best Practices in CEL
spec:
  validationFailureAction: Enforce (1)
  background: true (2)
  rules:
    - name: validate-nodeport (3)
      match: (4)
        any: (5)
          - resources:
              kinds: (6)
                - Service
              operations: (7)
                - CREATE
                - UPDATE
      validate: (8)
        cel:
          expressions: (9)
            - expression: "has(object.spec.type) ? (object.spec.type != 'NodePort') : true" (10)
              message: "Services of type NodePort are not allowed."
1 spec.validationFailureAction (тип: string) - действие при нарушении правил валидации для всех правил политики. Допустимые значения: Audit — разрешить запрос, зафиксировать нарушение в отчете; Enforce — отклонить запрос.
2 spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.
3 spec.rules[].name (тип: string) - уникальное имя правила в рамках политики.
4 spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле).
5 spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).
6 spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).
7 spec.rules[].match.any[].resources.operations (тип: []string) - операции, к которым применяется правило: CREATE, UPDATE, DELETE, CONNECT.
8 spec.rules[].validate (тип: Validation) - правило валидации ресурса.
9 spec.rules[].validate.cel.expressions (тип: []CELExpression) - CEL-выражения для валидации. Каждое содержит expression и message.
10 spec.rules[].validate.cel.expressions[].expression (тип: string) - CEL-выражение для проверки условия.

Установите манифест в кластер Kubernetes, выполнив команду:

kubectl apply -f restrict-nodeport.yaml

2.2.2. Использование pattern в валидации (требование resource requests и limits)

ClusterPolicy с валидацией через pattern проверяет структуру ресурса с помощью overlay-паттерна. Символ ?* означает поле обязательно и не может быть пустым. Данный пример запрещает создание подов, контейнеры которых не задают requests и limits на CPU и память.

Сохраните предоставленный манифест в файл, например, require-resources.yaml.

Пример манифеста
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resources
  annotations:
    policies.kyverno.io/title: Require CPU and memory requests/limits
    policies.kyverno.io/category: Best Practices
spec:
  validationFailureAction: Enforce (1)
  background: true (2)
  rules:
    - name: require-resources-containers (3)
      match: (4)
        any: (5)
          - resources:
              kinds: (6)
                - Pod
      validate: (7)
        message: "Each container must set cpu and memory requests and limits." (8)
        pattern: (9)
          spec:
            containers:
              - resources:
                  requests:
                    cpu: "?*" (10)
                    memory: "?*" (11)
                  limits:
                    cpu: "?*" (12)
                    memory: "?*" (13)
            initContainers:
              - resources:
                  limits:
                    cpu: '?*' (14)
                    memory: '?*' (15)
                  requests:
                    cpu: '?*' (16)
                    memory: '?*' (17)
1 spec.validationFailureAction (тип: string) - действие при нарушении правил валидации для всех правил политики. Допустимые значения: Audit — разрешить запрос, зафиксировать нарушение в отчете; Enforce — отклонить запрос.
2 spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.
3 spec.rules[].name (тип: string) - уникальное имя правила в рамках политики.
4 spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле).
5 spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).
6 spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).
7 spec.rules[].validate (тип: Validation) - правило валидации ресурса.
8 spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении.
9 spec.rules[].validate.pattern (тип: object) - overlay-паттерн для проверки структуры ресурса. Ресурс должен соответствовать указанной структуре.
10 spec.containers[].resources.requests.cpu (тип: string) - обязательное поле, не может быть пустым. Запрос CPU для контейнера.
11 spec.containers[].resources.requests.memory (тип: string) - обязательное поле, не может быть пустым. Запрос памяти для контейнера.
12 spec.containers[].resources.limits.cpu (тип: string) - обязательное поле, не может быть пустым. Лимит CPU для контейнера.
13 spec.containers[].resources.limits.memory (тип: string) - обязательное поле, не может быть пустым. Лимит памяти для контейнера.
14 spec.initContainers[].resources.limits.cpu (тип: string) - обязательное поле, не может быть пустым. Лимит CPU для init-контейнера.
15 spec.initContainers[].resources.limits.memory (тип: string) - обязательное поле, не может быть пустым. Лимит памяти для init-контейнера.
16 spec.initContainers[].resources.requests.cpu (тип: string) - обязательное поле, не может быть пустым. Запрос CPU для init-контейнера.
17 spec.initContainers[].resources.requests.memory (тип: string) - обязательное поле, не может быть пустым. Запрос памяти для init-контейнера.

Установите манифест в кластер Kubernetes, выполнив команду:

kubectl apply -f require-resources.yaml

2.2.3. Использование foreach в валидации (ограничение реестров образов и запрет тега latest)

ClusterPolicy с foreach позволяет применять валидацию к каждому элементу списка внутри ресурса (например, к каждому контейнеру в поде). Первая политика запрещает использование образов не из реестра hub.nova-platform.io/registry. Вторая политика запрещает использование тега latest и образов без тега.

Сохраните предоставленный манифест в файл, например, restrict-image-registries.yaml.

Пример манифеста
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: restrict-image-registries
  annotations:
    policies.kyverno.io/title: Restrict image registries
    policies.kyverno.io/category: Supply Chain Security
spec:
  validationFailureAction: Enforce (1)
  background: true (2)
  rules:
    - name: allowed-registries (3)
      match: (4)
        any: (5)
          - resources:
              kinds: (6)
                - Pod
      validate:
        message: "Images must be pulled only from hub.nova-platform.io/registry." (7)
        foreach: (8)
          - list: "request.object.spec.containers" (9)
            preconditions: (10)
              all:
                - key: "{{ element.image }}"
                  operator: NotEquals
                  value: ""
            deny: (11)
              conditions: (12)
                any:
                  - key: "{{ element.image }}"
                    operator: NotEquals
                    value: "hub.nova-platform.io/registry/*"
---
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-latest-tag
  annotations:
    policies.kyverno.io/title: Disallow latest tag
    policies.kyverno.io/category: Supply Chain Security
spec:
  validationFailureAction: Enforce (1)
  background: true (2)
  rules:
    - name: no-latest-tag (3)
      match: (4)
        any: (5)
          - resources:
              kinds: (6)
                - Pod
      validate:
        message: "Using tag 'latest' or no tag is not allowed. Use a specific version." (7)
        foreach: (8)
          - list: "request.object.spec.containers" (9)
            deny: (10)
              conditions: (11)
                any:
                  - key: "{{ element.image }}"
                    operator: Equals
                    value: "*:latest"
                  - key: "{{ element.image }}"
                    operator: NotEquals
                    value: "*:*"
1 spec.validationFailureAction (тип: string) - действие при нарушении: Audit (разрешить запрос, зафиксировать нарушение) или Enforce (отклонить запрос).
2 spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.
3 spec.rules[].name (тип: string) - уникальное имя правила в рамках политики.
4 spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле).
5 spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).
6 spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).
7 spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении.
8 spec.rules[].validate.foreach (тип: []ForEachValidation) - итерация по элементам списка внутри ресурса.
9 spec.rules[].validate.foreach[].list (тип: string) - JMESPath-выражение, возвращающее список элементов для итерации.
10 spec.rules[].validate.foreach[].preconditions (тип: Conditions) - условия применения правила к каждому элементу.
11 spec.rules[].validate.foreach[].deny (тип: object) - условия отклонения для каждого элемента.
12 spec.rules[].validate.foreach[].deny.conditions (тип: Conditions) - условия отклонения запроса (any/all с операторами сравнения).

Установите манифест в кластер Kubernetes, выполнив команду:

kubectl apply -f restrict-image-registries.yaml

2.2.4. Использование anyPattern в валидации (запрет запуска контейнеров от root)

ClusterPolicy с anyPattern позволяет описать несколько допустимых конфигураций: ресурс считается валидным, если он соответствует хотя бы одному из паттернов. Данный пример запрещает запуск подов от имени root-пользователя. Под считается валидным, если либо spec.securityContext.runAsNonRoot: true задано на уровне пода, либо securityContext.runAsNonRoot: true задано на уровне каждого контейнера.

Сохраните предоставленный манифест в файл, например, require-run-as-non-root.yaml.

Пример манифеста
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-run-as-non-root
  annotations:
    policies.kyverno.io/title: Require runAsNonRoot
    policies.kyverno.io/category: Pod Security Standards
spec:
  validationFailureAction: Enforce (1)
  background: true (2)
  rules:
    - name: check-runasnonroot (3)
      match: (4)
        any: (5)
          - resources:
              kinds: (6)
                - Pod
      validate:
        message: >- (7)
          Running as root is not allowed. Either the field spec.securityContext.runAsNonRoot
          must be set to `true`, or all containers must set securityContext.runAsNonRoot to `true`.
        anyPattern: (8)
          - spec:
              securityContext:
                runAsNonRoot: true (9)
              =(ephemeralContainers):
                - =(securityContext):
                    =(runAsNonRoot): true (10)
              =(initContainers):
                - =(securityContext):
                    =(runAsNonRoot): true (11)
              containers:
                - =(securityContext):
                    =(runAsNonRoot): true (12)
          - spec:
              =(ephemeralContainers):
                - securityContext:
                    runAsNonRoot: true (13)
              =(initContainers):
                - securityContext:
                    runAsNonRoot: true (14)
              containers:
                - securityContext:
                    runAsNonRoot: true (15)
1 spec.validationFailureAction (тип: string) - действие при нарушении: Audit (разрешить запрос, зафиксировать нарушение) или Enforce (отклонить запрос).
2 spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.
3 spec.rules[].name (тип: string) - уникальное имя правила в рамках политики.
4 spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле).
5 spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).
6 spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).
7 spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении.
8 spec.rules[].validate.anyPattern (тип: []object) - список паттернов: ресурс должен соответствовать хотя бы одному.
9 spec.securityContext.runAsNonRoot (тип: bool) - должно быть true на уровне пода (первый паттерн).
10 spec.ephemeralContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого ephemeral-контейнера.
11 spec.initContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого init-контейнера.
12 spec.containers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого контейнера.
13 spec.ephemeralContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого ephemeral-контейнера (второй паттерн).
14 spec.initContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого init-контейнера (второй паттерн).
15 spec.containers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого контейнера (второй паттерн).

Установите манифест в кластер Kubernetes, выполнив команду:

kubectl apply -f require-run-as-non-root.yaml

2.3. Установка с помощью Nova Console

Установите модуль Kyverno через Nova Console OperatorHUB. Для этого выполните следующие шаги.

  1. Установите оператор Kyverno Operator. В Nova Console в главном меню выберите OperatorsOperatorHUB. Выберите Kyverno Operator. Нажмите кнопку Установить.

    Заполните поля формы по примеру, представленному на скриншоте.

    kyverno 1

    Подтвердите установку, нажав Установить.

  2. Перейдите в раздел OperatorsУстановленные операторы. Выберите Kyverno Operator или сразу после установки нажмите Открыть оператор.

  3. Перейдите ко вкладке ClusterPolicy и нажмите на кнопку Создать ClusterPolicy.

  4. Заполнить настройки ClusterPolicy можно двумя способами:

    • С помощью формы

      cluster policy 1

      Заполните обязательные поля:

      • Имя - уникальное имя правила

      • Match - определяет, когда следует применять это правило политики. Критерии соответствия могут включать информацию о ресурсе (например, тип, имя, пространство имен, метки) и информацию о запросе на проверку доступа, такую как имя пользователя или роль. Требуется, по крайней мере, один тип.

      • Kinds - типы ресурсов Kubernetes (например, Pod, Deployment, Service). Укажите тип ресурса в поле Значение. Так же ресурсу можно задать имя в поле name.

      • subjects - субъекты (пользователи, группы, service accounts). Обязательным под данным заголовком является поле Имя - это метка для идентификации правила, она должна быть уникальной в рамках политики.

    • С помощью манифеста

      Ниже предложены примеры манифестов для ClusterPolicy.

      Использование CEL-валидации (запрет сервисов типа NodePort)
      apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      metadata:
        name: restrict-nodeport-cel
        annotations:
          policies.kyverno.io/title: Disallow NodePort in CEL expressions
          policies.kyverno.io/category: Best Practices in CEL
      spec:
        validationFailureAction: Enforce (1)
        background: true (2)
        rules:
          - name: validate-nodeport (3)
            match: (4)
              any: (5)
                - resources:
                    kinds: (6)
                      - Service
                    operations: (7)
                      - CREATE
                      - UPDATE
            validate: (8)
              cel:
                expressions: (9)
                  - expression: "has(object.spec.type) ? (object.spec.type != 'NodePort') : true" (10)
                    message: "Services of type NodePort are not allowed."
      1 spec.validationFailureAction (тип: string) - действие при нарушении правил валидации для всех правил политики. Допустимые значения: Audit — разрешить запрос, зафиксировать нарушение в отчете; Enforce — отклонить запрос.
      2 spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.
      3 spec.rules[].name (тип: string) - уникальное имя правила в рамках политики.
      4 spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле).
      5 spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).
      6 spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).
      7 spec.rules[].match.any[].resources.operations (тип: []string) - операции, к которым применяется правило: CREATE, UPDATE, DELETE, CONNECT.
      8 spec.rules[].validate (тип: Validation) - правило валидации ресурса.
      9 spec.rules[].validate.cel.expressions (тип: []CELExpression) - CEL-выражения для валидации. Каждое содержит expression и message.
      10 spec.rules[].validate.cel.expressions[].expression (тип: string) - CEL-выражение для проверки условия.
      Использование pattern в валидации (требование resource requests и limits)
      apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      metadata:
        name: require-resources
        annotations:
          policies.kyverno.io/title: Require CPU and memory requests/limits
          policies.kyverno.io/category: Best Practices
      spec:
        validationFailureAction: Enforce (1)
        background: true (2)
        rules:
          - name: require-resources-containers (3)
            match: (4)
              any: (5)
                - resources:
                    kinds: (6)
                      - Pod
            validate: (7)
              message: "Each container must set cpu and memory requests and limits." (8)
              pattern: (9)
                spec:
                  containers:
                    - resources:
                        requests:
                          cpu: "?*" (10)
                          memory: "?*" (11)
                        limits:
                          cpu: "?*" (12)
                          memory: "?*" (13)
                  initContainers:
                    - resources:
                        limits:
                          cpu: '?*' (14)
                          memory: '?*' (15)
                        requests:
                          cpu: '?*' (16)
                          memory: '?*' (17)
      1 spec.validationFailureAction (тип: string) - действие при нарушении правил валидации для всех правил политики. Допустимые значения: Audit — разрешить запрос, зафиксировать нарушение в отчете; Enforce — отклонить запрос.
      2 spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.
      3 spec.rules[].name (тип: string) - уникальное имя правила в рамках политики.
      4 spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле).
      5 spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).
      6 spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).
      7 spec.rules[].validate (тип: Validation) - правило валидации ресурса.
      8 spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении.
      9 spec.rules[].validate.pattern (тип: object) - overlay-паттерн для проверки структуры ресурса. Ресурс должен соответствовать указанной структуре.
      10 spec.containers[].resources.requests.cpu (тип: string) - обязательное поле, не может быть пустым. Запрос CPU для контейнера.
      11 spec.containers[].resources.requests.memory (тип: string) - обязательное поле, не может быть пустым. Запрос памяти для контейнера.
      12 spec.containers[].resources.limits.cpu (тип: string) - обязательное поле, не может быть пустым. Лимит CPU для контейнера.
      13 spec.containers[].resources.limits.memory (тип: string) - обязательное поле, не может быть пустым. Лимит памяти для контейнера.
      14 spec.initContainers[].resources.limits.cpu (тип: string) - обязательное поле, не может быть пустым. Лимит CPU для init-контейнера.
      15 spec.initContainers[].resources.limits.memory (тип: string) - обязательное поле, не может быть пустым. Лимит памяти для init-контейнера.
      16 spec.initContainers[].resources.requests.cpu (тип: string) - обязательное поле, не может быть пустым. Запрос CPU для init-контейнера.
      17 spec.initContainers[].resources.requests.memory (тип: string) - обязательное поле, не может быть пустым. Запрос памяти для init-контейнера.
      Использование foreach в валидации (ограничение реестров образов и запрет тега latest)
      apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      metadata:
        name: restrict-image-registries
        annotations:
          policies.kyverno.io/title: Restrict image registries
          policies.kyverno.io/category: Supply Chain Security
      spec:
        validationFailureAction: Enforce (1)
        background: true (2)
        rules:
          - name: allowed-registries (3)
            match: (4)
              any: (5)
                - resources:
                    kinds: (6)
                      - Pod
            validate:
              message: "Images must be pulled only from hub.nova-platform.io/registry." (7)
              foreach: (8)
                - list: "request.object.spec.containers" (9)
                  preconditions: (10)
                    all:
                      - key: "{{ element.image }}"
                        operator: NotEquals
                        value: ""
                  deny: (11)
                    conditions: (12)
                      any:
                        - key: "{{ element.image }}"
                          operator: NotEquals
                          value: "hub.nova-platform.io/registry/*"
      ---
      apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      metadata:
        name: disallow-latest-tag
        annotations:
          policies.kyverno.io/title: Disallow latest tag
          policies.kyverno.io/category: Supply Chain Security
      spec:
        validationFailureAction: Enforce (1)
        background: true (2)
        rules:
          - name: no-latest-tag (3)
            match: (4)
              any: (5)
                - resources:
                    kinds: (6)
                      - Pod
            validate:
              message: "Using tag 'latest' or no tag is not allowed. Use a specific version." (7)
              foreach: (8)
                - list: "request.object.spec.containers" (9)
                  deny: (10)
                    conditions: (11)
                      any:
                        - key: "{{ element.image }}"
                          operator: Equals
                          value: "*:latest"
                        - key: "{{ element.image }}"
                          operator: NotEquals
                          value: "*:*"
      1 spec.validationFailureAction (тип: string) - действие при нарушении: Audit (разрешить запрос, зафиксировать нарушение) или Enforce (отклонить запрос).
      2 spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.
      3 spec.rules[].name (тип: string) - уникальное имя правила в рамках политики.
      4 spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле).
      5 spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).
      6 spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).
      7 spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении.
      8 spec.rules[].validate.foreach (тип: []ForEachValidation) - итерация по элементам списка внутри ресурса.
      9 spec.rules[].validate.foreach[].list (тип: string) - JMESPath-выражение, возвращающее список элементов для итерации.
      10 spec.rules[].validate.foreach[].preconditions (тип: Conditions) - условия применения правила к каждому элементу.
      11 spec.rules[].validate.foreach[].deny (тип: object) - условия отклонения для каждого элемента.
      12 spec.rules[].validate.foreach[].deny.conditions (тип: Conditions) - условия отклонения запроса (any/all с операторами сравнения).
      Использование anyPattern в валидации (запрет запуска контейнеров от root)
      apiVersion: kyverno.io/v1
      kind: ClusterPolicy
      metadata:
        name: require-run-as-non-root
        annotations:
          policies.kyverno.io/title: Require runAsNonRoot
          policies.kyverno.io/category: Pod Security Standards
      spec:
        validationFailureAction: Enforce (1)
        background: true (2)
        rules:
          - name: check-runasnonroot (3)
            match: (4)
              any: (5)
                - resources:
                    kinds: (6)
                      - Pod
            validate:
              message: >- (7)
                Running as root is not allowed. Either the field spec.securityContext.runAsNonRoot
                must be set to `true`, or all containers must set securityContext.runAsNonRoot to `true`.
              anyPattern: (8)
                - spec:
                    securityContext:
                      runAsNonRoot: true (9)
                    =(ephemeralContainers):
                      - =(securityContext):
                          =(runAsNonRoot): true (10)
                    =(initContainers):
                      - =(securityContext):
                          =(runAsNonRoot): true (11)
                    containers:
                      - =(securityContext):
                          =(runAsNonRoot): true (12)
                - spec:
                    =(ephemeralContainers):
                      - securityContext:
                          runAsNonRoot: true (13)
                    =(initContainers):
                      - securityContext:
                          runAsNonRoot: true (14)
                    containers:
                      - securityContext:
                          runAsNonRoot: true (15)
      1 spec.validationFailureAction (тип: string) - действие при нарушении: Audit (разрешить запрос, зафиксировать нарушение) или Enforce (отклонить запрос).
      2 spec.background (тип: bool) - флаг необходимости запускать фоновое сканирование существующих ресурсов на соответствие политике.
      3 spec.rules[].name (тип: string) - уникальное имя правила в рамках политики.
      4 spec.rules[].match (тип: ResourceFilter) - условия применения правила (обязательное поле).
      5 spec.rules[].match.any (тип: []ResourceDescription) - условия объединяются оператором ИЛИ (ресурс должен соответствовать хотя бы одному условию).
      6 spec.rules[].match.any[].resources.kinds (тип: []string) - типы ресурсов Kubernetes (например, Pod, Deployment, Service).
      7 spec.rules[].validate.message (тип: string) - сообщение об ошибке, возвращаемое при нарушении.
      8 spec.rules[].validate.anyPattern (тип: []object) - список паттернов: ресурс должен соответствовать хотя бы одному.
      9 spec.securityContext.runAsNonRoot (тип: bool) - должно быть true на уровне пода (первый паттерн).
      10 spec.ephemeralContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого ephemeral-контейнера.
      11 spec.initContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого init-контейнера.
      12 spec.containers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого контейнера.
      13 spec.ephemeralContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого ephemeral-контейнера (второй паттерн).
      14 spec.initContainers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого init-контейнера (второй паттерн).
      15 spec.containers[].securityContext.runAsNonRoot (тип: bool) - должно быть true для каждого контейнера (второй паттерн).
  5. Нажмите Создать. Отслеживайте статус на вкладке ClusterPolicy на странице оператора.

3. Удаление ClusterPolicy

3.1. Удаление с помощью kubectl

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

kubectl delete clusterpolicy <name_custom_resource> (1)
1 Укажите имя CR, который необходимо удалить

3.2. Удаление с помощью OperatorHUB

Для удаления ClusterPolicy из кластера Nova выполните следующие шаги.

  1. Перейдите в раздел OperatorsУстановленные операторы. Выберите Kyverno Operator.

  2. Перейдите на вкладку ClusterPolicy.

  3. Выберите политику и нажмите Удалить.

    cluster policy 2