База знаний LinxCloud Services

Использование политик Gatekeeper

Шаблоны ограничений

Перед началом использования ограничений нужно создать шаблон политики (ConstraintTemplate). Шаблон политики позволяет администраторам настроить поведение политик как аргументы у функций. Библиотека уже настроенных ограничений и шаблонов ограничений доступна по ссылке.

Ниже приведен пример шаблона политик, который требует наличие указанных меток:

1apiVersion: templates.gatekeeper.sh/v1beta1
2kind: ConstraintTemplate
3metadata:
4  name: k8srequiredlabels
5spec:
6  crd:
7    spec:
8      names:
9        kind: K8sRequiredLabels
10      validation:
11        openAPIV3Schema:
12          properties:
13            labels:
14              type: array
15              items: string
16  targets:
17    - target: admission.k8s.gatekeeper.sh
18      rego: |
19        package k8srequiredlabels
20 
21        violation[{"msg": msg, "details": {"missing_labels": missing}}] {
22          provided := {label | input.review.object.metadata.labels[label]}
23          required := {label | label := input.parameters.labels[_]}
24          missing := required - provided
25          count(missing) > 0
26          msg := sprintf("you must provide labels: %v", [missing])
27        }

 

Чтобы установить шаблон ограничений, выполните команду:

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/demo/basic/templates/k8srequiredlabels_template.yaml

 

Посмотреть существующие в кластере шаблоны можно по команде:

kubectl get constrainttemplate

 

Для просмотра детальной информации по определенному шаблону ограничений выполните команду:

kubectl describe constrainttemplate <NAME>

 

 

Ограничения

Ограничения (constraints) используются для применения ConstraintTemplate. Нижеприведенное ограничение использует K8sRequiredLabels и требует указание метки (label) gatekeeper для всех пространств имен (namespace).

1apiVersion: constraints.gatekeeper.sh/v1beta1
2kind: K8sRequiredLabels
3metadata:
4  name: ns-must-have-gk
5spec:
6  match:
7    kinds:
8      - apiGroups: [""]
9        kinds: ["Namespace"]
10  parameters:
11    labels: ["gatekeeper"]

 

Вы можете установить ограничения с помощью команды:

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/demo/basic/constraints/all_ns_must_have_gatekeeper.yaml

 

Чтобы посмотреть существующие ограничения в кластере, выполните команду:

kubectl get constraints

 

Для просмотра детальной информации по определенному ограничению выполните следующую команду:

kubectl describe constraints <NAME>

 

 

Поля сопоставлений

Поле match указывает границы применения ограничений к объектам. Поддерживаются следующие поля:

  • kinds принимает лист объектов с полями apiGroups и kinds. В них перечислены группы/виды объектов, к которым будет применяться ограничение. Если указано несколько объектов групп/видов, чтобы ресурс находился в области применения, требуется только одно совпадение.
  • scope определяет, совпадают ли ресурсы с областью кластера и/или с пространством имен. Используются * (по умолчанию), ClusterNamespaced.
  • namespaces — список имен. Если указано, то ограничения применяются только к ресурсам в указанных пространствах имен. Поддерживаются префиксы имен. Например, namespaces: [kube-*] соответствует kube-system и kube-public.
  • excludedNamespaces — список имен namespaces. Если указано, то ограничения применяются только к ресурсам, не относящимся к этим пространствам имен. Поддерживаются префиксы имен. Например, excludedNamespaces: [kube-*] соответствует kube-system и kube-public.
  • labelSelector — is the combination of two optional fields: matchLabels и matchExpressions. Эти два поля предоставляют разные методы выбора или исключения объектов Kubernetes на основе ключей и значений меток, включенных в метаданные объекта.
  • namespaceSelector является селектором меток для пространства имен, содержащего объект, или самого объекта, если объект является пространством имен.
  • name — имя объекта.

 

Поле parameters

Поле parameters описывает назначение ограничения. На него можно ссылаться как на input.parameters в исходном коде Rego ConstraintTemplate. Gatekeeper заполняет input.parameter значениями, переданными в поле parameters в файле Constraint.

Пример:

 rego: |
        package k8srequiredlabels

        violation[{"msg": msg, "details": {"missing_labels": missing}}] {
          provided := {label | input.review.object.metadata.labels[label]}
          required := {label | label := input.parameters.labels[_]}
          missing := required - provided
          count(missing) > 0
          msg := sprintf("you must provide labels: %v", [missing])
        }

Схема для входных параметров Constraint определяется в файле ConstraintTemplate. Сервер API отклонит Constraint с некорректным полем параметров, если типы данных не совпадают.

Пример:

# Apply the Constraint with incorrect parameters schema
$ cat << EOF | kubectl apply -f -
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-gk
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    # Note that "labels" is now an array item, rather than an object
    - labels: ["gatekeeper"]
EOF
The K8sRequiredLabels "ns-must-have-gk" is invalid: spec.parameters: Invalid value: "array": spec.parameters in body must be of type object: "array"

 

Поле enforcementAction

Поле enforcementAction определяет действие для обработки нарушений Constraint. По умолчанию, для enforcementAction установлено значение deny, поскольку поведение по умолчанию — отклонять запросы на допуск с любым нарушением. Другие поддерживаемые значения включают пробный запуск (dryrun) и предупреждение(warn).

Что вас интересует?
Получить демо-доступ

Спасибо за ваш запрос, мы свяжемся с вами в ближайшее время!