VK Cloud logo
Обновлена 15 апреля 2024 г. в 08:50

Gatekeeper

Gatekeeper — это контроллер, который обеспечивает создание ограничений (constraints) на языке Rego и контроль за их выполнением. Набор ограничений формирует политику, основанную на CRD (CRD-based policy). Gatekeeper проверяет все CRD-операции для ресурсов Kubernetes (создание, изменение, удаление) на соответствие заданным ограничениям и принимает решение о запрете или разрешении определенного действия.

За применение ограничений (в виде политик) отвечает Open Policy Agent (OPA).

Принцип работы Gatekeeper

Соблюдение политик контролируется с помощью ограничений (constraints). Эти ограничения создаются на основе шаблонов ограничений (constraint templates) и определяют:

  • Область действия ограничения: какие ресурсы Kubernetes будет проверяться на соответствие правилам, заданным в шаблоне ограничений.
  • Параметры, которые будут использоваться при проверке на соответствие правилам.

Шаблон ограничений, в свою очередь, проверяет соблюдение описанных в нем правил при заданных в ограничении области действия и параметрах. Эти правила описываются прямо в YAML-файле шаблона ограничений с использованием языка Rego. Также проводится проверка корректности параметров, переданных из ограничения.

Устройство ресурсов для Gatekeeper

Структура ограничения

Пример ограничения:

apiVersion: constraints.gatekeeper.sh/v1beta1kind: <имя шаблона ограничений>metadata:  name: <имя ограничения>spec:  match:    <параметры, определяющие область действия ограничения>  parameters:    <параметры, участвующие в проверке правил из шаблона ограничений>  enforcementAction: <действие при обработке нарушения ограничения: deny | dryrun | warn>

Здесь:

  • spec.match: группа параметров, которые в совокупности определяют область действия ограничения.

    • kinds: содержит список объектов с полями apiGroups и kinds. В этих объектах перечислены группы и виды ресурсов, к которым будет применяться ограничение. Если указано несколько групп и видов ресурсов, то достаточно одного совпадения, чтобы ресурс попал в область действия ограничения (применяется операция «логическое ИЛИ»).

    • scope: определяет, проверять ли совпадения для всех ресурсов сразу (по умолчанию), для ресурсов уровня кластера (cluster-scoped), ресурсов уровня пространства имен (namespace-scoped).

    • namespaces: список пространств имен. Если этот параметр задан, то ограничения применяются только к ресурсам в указанных пространствах имен.

      Этот параметр может быть задан в виде префикса для выбора сразу нескольких пространств имен. Например, namespaces: [kube-*] соответствует kube-system и kube-public.

    • excludedNamespaces: список пространств имен, которые служат исключениями для namespaces. Если этот параметр задан, то ограничения применяются только к ресурсам, не относящимся к этим пространствам имен.

      Этот параметр может быть задан в виде префикса для выбора сразу нескольких пространств имен. Например, namespaces: [kube-*] соответствует kube-system и kube-public.

    • labelSelector: комбинация двух необязательных полей matchLabels и matchExpressions. Эти два поля предоставляют разные методы выбора или исключения ресурсов Kubernetes на основе ключей и значений меток, включенных в метаданные ресурса.

      Чтобы ресурс был выбран, он должен удовлетворять всем заданным здесь требованиям (к требованиям применяется операция «логическое И»).

    • namespaceSelector: селектор меток для пространства имен, содержащего ресурс, или самого ресурса, если он является пространством имен.

    • name: имя ресурса. Если этот параметр задан, то ограничения применяются только к ресурсам c указанным именем.

      Этот параметр может быть задан в виде префикса для выбора сразу нескольких ресурсов. Например, name: [pod-*] соответствует pod-a и pod-b.

  • spec.parameters: параметры, которые сначала будут проверены в шаблоне ограничений на соответствие типу, а затем подставлены в правила на языке Rego.

  • spec.enforcementAction: действие при обработке нарушения ограничения. Возможные значения:

    • deny (по умолчанию): запретить создание ресурса Kubernetes.
    • warn: создать ресурс Kubernetes и выдать предупреждение (warning). Это может быть полезно при отладке ограничений.
    • dryrun: не создавать ресурс Kubernetes, выполнить тестовый прогон ограничения (dry run). Это может быть полезно при отладке ограничений.

Подробнее об ограничениях в документации Gatekeeper.

Структура шаблона ограничения

Пример шаблона ограничения:

apiVersion: templates.gatekeeper.sh/v1beta1kind: ConstraintTemplatemetadata:  name: <имя ограничения>spec:  crd:    spec:      names:        kind: <имя ограничения, указывается в параметре kind для ресурса Constraint>      validation:        openAPIV3Schema: <схема для проверки типов параметров, переданных из ресурса Constraint>  targets:    - target: admission.k8s.gatekeeper.sh      rego: <правила на языке Rego>

Параметр spec.crd.spec.validation.openAPIV3Schema обеспечивает проверку корректности типа параметров, которые передаются из ограничения в шаблон ограничений для проверки правил. Ограничения с некорректно заданными параметрами не будут созданы.

Подробнее о шаблонах в документации Gatekeeper.

Как использовать Gatekeeper

Чтобы использовать Gatekeeper:

  1. Создайте манифест шаблона ограничения с нужными правилами и проверками входных параметров.
  2. Создайте ресурс шаблона ограничения на основе манифеста.
  3. Создайте манифест ограничения на основе созданного шаблона ограничения. Для ограничения задайте область действия и параметры.

Примеры использования ограничений Gatekeeper приведены в сценариях использования.