2.11. 集成第三方策略控制器


集成第三方策略,在策略模板中创建自定义注解,以指定一个或多个合规标准、控制类别和控制。

您还可以使用来自 policy-collection/community 中的第三方策略。

了解如何集成以下第三方策略:

2.11.1. 集成 Gatekeeper 约束和约束模板

Gatekeeper 是一个验证 webhook,它带有审计功能,可以强制执行基于自定义资源定义的策略,该策略使用 Open Policy Agent (OPA)运行。您可以使用 Gatekeeper operator 策略在集群中安装 Gatekeeper。Gatekeeper 约束可用于评估 Kubernetes 资源合规性。您可以使用 OPA 作为策略引擎,并使用 Rego 作为策略语言。

先决条件: 安装 Gatekeeper 并将 Gatekeeper 策略应用到集群时,需要 Red Hat Advanced Cluster Management for Kubernetes 或 Red Hat OpenShift Container Platform Plus 订阅。只有在最新版本的 Red Hat Advanced Cluster Management 支持的 OpenShift Container Platform 版本(版本 3.11 除外)上支持 gatekeeper。

Gatekeeper 策略使用约束模板(ConstraintTemplates)和约束编写。查看 Red Hat Advanced Cluster Management 策略中使用 Gatekeeper 约束的以下 YAML 示例:

  • ConstraintTemplates 和约束: 使用 Red Hat Advanced Cluster Management 策略在 hub 集群上进行多集群发布 Gatekeeper 约束和 Gatekeeper 审计结果聚合。以下示例定义了一个 Gatekeeper ConstraintTemplate 和 constraint (K8sRequiredLabels),以确保在所有命名空间中设置了 gatekeeper 标签:

    apiVersion: policy.open-cluster-management.io/v1
    kind: Policy
    metadata:
      name: require-gatekeeper-labels-on-ns
    spec:
      remediationAction: inform 1
      disabled: false
      policy-templates:
        - objectDefinition:
            apiVersion: templates.gatekeeper.sh/v1beta1
            kind: ConstraintTemplate
            metadata:
              name: k8srequiredlabels
              annotations:
                policy.open-cluster-management.io/severity: low 2
            spec:
              crd:
                spec:
                  names:
                    kind: K8sRequiredLabels
                  validation:
                    openAPIV3Schema:
                      properties:
                        labels:
                          type: array
                          items: string
              targets:
                - target: admission.k8s.gatekeeper.sh
                  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])
                    }
        - objectDefinition:
            apiVersion: constraints.gatekeeper.sh/v1beta1
            kind: K8sRequiredLabels
            metadata:
              name: ns-must-have-gk
              annotations:
                policy.open-cluster-management.io/severity: low 3
            spec:
              enforcementAction: dryrun
              match:
                kinds:
                  - apiGroups: [""]
                    kinds: ["Namespace"]
              parameters:
                labels: ["gatekeeper"]
    1
    因为 remediationAction 被设置为 inform,所以 Gatekeeper 约束的 enforcementAction 字段会被覆盖来 警告。这意味着 Gatekeeper 会检测并警告您创建或更新缺少 gatekeeper 标签的命名空间。如果策略 remediationAction 设置为 enforce,则 Gatekeeper 约束 enforcementAction 字段会被覆盖 以拒绝。在这种情况下,此配置可防止任何用户创建或更新缺少 gatekeeper 标签的命名空间。
    2 3
    可选: 为每个 Gatekeeper 约束或约束模板设置 policy.open-cluster-management.io/severity 注解的严重性值。有效值与其他 Red Hat Advanced Cluster Management 策略类型相同: critical

    使用前面的策略,您可能会收到以下策略状态消息: warn - 您必须提供 labels: {"gatekeeper"}(on Namespace default); warn - 您必须提供 labels: {"gatekeeper"}(on Namespace gatekeeper-system)。当包含 Gatekeeper 约束或 ConstraintTemplates 被删除后,限制和 ConstraintTemplates 也会从受管集群中删除。

    要从控制台查看特定受管集群的 Gatekeeper 审计结果,请进入策略模板 结果 页面。如果启用了搜索,请查看失败的审计的 Kubernetes 对象的 YAML。

    备注:

    • 只有在 Gatekeeper 版本 3.9 或更高版本生成的审计结果时,相关资源 部分才可用。
    • Gatekeeper 审计功能默认每分钟运行一次。审计结果会发回到 hub 集群,以便在受管集群的 Red Hat Advanced Cluster Management 策略状态中查看。
  • policy-gatekeeper-admission :在 Red Hat Advanced Cluster Management 策略中使用 policy-gatekeeper-admission 配置策略来检查 gatekeeper admission webhook 拒绝的 Kubernetes API 请求:

    apiVersion: policy.open-cluster-management.io/v1
    kind: ConfigurationPolicy
    metadata:
      name: policy-gatekeeper-admission
    spec:
      remediationAction: inform # will be overridden by remediationAction in parent policy
      severity: low
      object-templates:
        - complianceType: mustnothave
          objectDefinition:
            apiVersion: v1
            kind: Event
            metadata:
              namespace: openshift-gatekeeper-system # set it to the actual namespace where gatekeeper is running if different
              annotations:
                constraint_action: deny
                constraint_kind: K8sRequiredLabels
                constraint_name: ns-must-have-gk
                event_type: violation

2.11.1.1. 其他资源

2.11.2. 策略生成器

Policy Generator 是 Red Hat Advanced Cluster Management for Kubernetes 应用程序生命周期订阅 GitOps 工作流的一部分,它使用 Kustomize 生成 Red Hat Advanced Cluster Management 策略。策略生成器从 Kubernetes 清单 YAML 文件构建 Red Hat Advanced Cluster Management 策略,该文件通过用于配置它的 PolicyGenerator 清单 YAML 文件提供。策略生成器作为 Kustomize 生成器插件实施。有关 Kustomize 的更多信息,请阅读 Kustomize 文档

如需更多信息,请参阅以下部分:

2.11.2.1. 策略生成器功能

Policy Generator 及其与 Red Hat Advanced Cluster Management 应用程序生命周期订阅 GitOps 工作流的集成简化了 Kubernetes 资源对象的分发到受管 OpenShift Container Platform 集群,并通过 Red Hat Advanced Cluster Management 策略简化 Kubernetes 集群的发布。

使用 Policy Generator 完成以下操作:

  • 将任何 Kubernetes 清单文件转换为 Red Hat Advanced Cluster Management 配置策略,包括从 Kustomize 目录创建的清单。
  • 在将输入 Kubernetes 清单插入到生成的 Red Hat Advanced Cluster Management 策略前对其进行补丁。
  • 生成额外的配置策略,以便您可以通过 Red Hat Advanced Cluster Management for Kubernetes 报告 Gatekeeper 策略违反情况。
  • 在 hub 集群上生成策略集。

2.11.2.2. 策略生成器配置结构

策略生成器是一个 Kustomize 生成器插件,它配置了一个 PolicyGenerator kind 和 policy.open-cluster-management.io/v1 API 版本的清单。

要使用插件,首先在 kustomization.yaml 文件中添加一个 generators 部分。查看以下示例:

generators:
  - policy-generator-config.yaml

上例中引用的 policy-generator-config.yaml 文件是一个 YAML 文件,其中包含要生成的策略的说明。简单的 PolicyGenerator 配置文件可能类似以下示例:

apiVersion: policy.open-cluster-management.io/v1
kind: PolicyGenerator
metadata:
  name: config-data-policies
policyDefaults:
  namespace: policies
  policySets: []
policies:
  - name: config-data
    manifests:
      - path: configmap.yaml

configmap.yaml 代表要包含在策略中的 Kubernetes 清单 YAML 文件。另外,您可以设置 Kustomize 目录的路径,或者设置具有多个 Kubernetes 清单 YAML 文件的目录。查看以下示例:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
  namespace: default
data:
  key1: value1
  key2: value2

生成的 Policy 以及生成的 PlacementRulePlacementBinding 可能类似以下示例:

apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
  name: placement-config-data
  namespace: policies
spec:
  clusterConditions:
  - status: "True"
    type: ManagedClusterConditionAvailable
  clusterSelector:
    matchExpressions: []
---
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: binding-config-data
  namespace: policies
placementRef:
  apiGroup: apps.open-cluster-management.io
  kind: PlacementRule
  name: placement-config-data
subjects:
- apiGroup: policy.open-cluster-management.io
  kind: Policy
  name: config-data
---
apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  annotations:
    policy.open-cluster-management.io/categories: CM Configuration Management
    policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
    policy.open-cluster-management.io/standards: NIST SP 800-53
    policy.open-cluster-management.io/description:
  name: config-data
  namespace: policies
spec:
  disabled: false
  policy-templates:
  - objectDefinition:
      apiVersion: policy.open-cluster-management.io/v1
      kind: ConfigurationPolicy
      metadata:
        name: config-data
      spec:
        object-templates:
        - complianceType: musthave
          objectDefinition:
            apiVersion: v1
            data:
              key1: value1
              key2: value2
            kind: ConfigMap
            metadata:
              name: my-config
              namespace: default
        remediationAction: inform
        severity: low

2.11.2.3. 策略生成器配置参考表

请注意,每个策略都可以覆盖 policyDefaults 部分中除 namespace 以外的所有字段,每个策略集都可以覆盖 policySetDefaults 部分中的所有字段。

表 2.15. 参数表
字段可选或必需的描述

apiVersion

必填

将值设置为 policy.open-cluster-management.io/v1

kind

必填

将值设为 PolicyGenerator 以表示策略类型。

metadata.name

必填

用于标识策略资源的名称。

placementBindingDefaults.name

选填

如果多个策略使用相同的放置,则使用此名称为生成的 PlacementBinding 生成唯一名称,将放置与引用它的策略数组绑定。

policyDefaults

必填

对于 policies 数组中的条目,这里列出的任何默认值都会被覆盖,但 namespace 除外。

policyDefaults.namespace

必填

所有策略的命名空间。

policyDefaults.complianceType

选填

决定在将清单与集群上对象进行比较时的策略控制器行为。您可以使用的值是 musthavemusthavemustnothave。默认值为 musthave

policyDefaults.metadataComplianceType

选填

在将清单元数据部分与集群中的对象进行比较时,会覆盖 complianceType。您可以使用的值是 musthavemustonlyhave。默认值为空 ({}),以避免覆盖元数据的 complianceType

policyDefaults.categories

选填

policy.open-cluster-management.io/categories 注解中使用的类别数组。默认值为 CM 配置管理

policyDefaults.controls

选填

policy.open-cluster-management.io/controls 注解中使用的控制数组。默认值为 CM-2 Baseline Configuration

policyDefaults.standards

选填

policy.open-cluster-management.io/standards 注解中使用的一组标准。默认值为 NIST SP 800-53

policyDefaults.policyAnnotations

选填

策略在 metadata.annotations 部分中包含的注解。除非在策略中指定的,否则会适用于所有策略。默认值为空 ({})。

policyDefaults.configurationPolicyAnnotations

选填

用于对生成的配置策略设置的注解的键值对。例如,您可以通过定义以下参数来禁用策略模板: {"policy.open-cluster-management.io/disable-templates": "true"}。默认值为空 ({})。

policyDefaults.copyPolicyMetadata

选填

复制所有策略的标签和注解,并将它们添加到副本策略中。默认设置为 true。如果设置为 false,则只有策略框架特定的策略标签和注解复制到复制策略中。

policyDefaults.severity

选填

策略违反的严重性。默认值为 low

policyDefaults.disabled

选填

策略是否被禁用,代表不会传播它,因此结果为没有状态。默认值为 false,这会启用策略。

policyDefaults.remediationAction

选填

策略的补救机制。参数值是 enforceinform。默认值是 inform

policyDefaults.namespaceSelector

没有指定命名空间的命名空间对象是必需的

决定对象要应用到的受管集群中的命名空间。includeexclude 参数接受根据名称包含和排除命名空间的文件路径表达式。matchExpressionsmatchLabels 参数指定要包含的命名空间。阅读 Kubernetes 标签和选择器 文档。生成的列表通过使用来自所有参数的结果的交集进行编译。

policyDefaults.evaluationInterval

选填

使用 compliantnoncompliant 参数指定特定合规状态时要评估的策略的频率。当受管集群具有较低的 CPU 资源时,可以增加评估间隔,以减少 Kubernetes API 上的 CPU 使用量。这是持续时间的格式。例如,"1h25m3s" 代表 1 小时,25 分钟和 3 秒。它们也可以设置为 "never",以避免在策略成为特定合规状态后评估策略。

policyDefaults.pruneObjectBehavior

选填

决定在删除策略时是否应删除由策略创建或监控的对象。只有策略的补救操作被设置为 enforce 时才会进行修剪。示例值为 DeleteIfCreatedDeleteAllNone。默认值为 None

policyDefaults.dependencies

选填

应用此策略前必须处于特定合规性状态的对象列表。当 policyDefaults.orderPolicies 设置为 true 时,无法指定。

policyDefaults.dependencies[].name

必填

要依赖的对象名称。

policyDefaults.dependencies[].namespace

选填

要依赖的对象的命名空间。默认为 Policy Generator 设置的策略命名空间。

policyDefaults.dependencies[].compliance

选填

对象需要处于的合规性状态。默认值为 Compliant

policyDefaults.dependencies[].kind

选填

对象的种类。默认情况下,kind 设置为 Policy,但也可以是具有合规状态的其他类型,如 ConfigurationPolicy

policyDefaults.dependencies[].apiVersion

选填

对象的 API 版本。默认值为 policy.open-cluster-management.io/v1

policyDefaults.extraDependencies

选填

应用此策略前必须处于特定合规性状态的对象列表。您定义的依赖项会独立于 dependencies 列表添加到每个策略模板中(如 ConfigurationPolicy)。当 policyDefaults.orderManifests 被设置为 true 时,无法指定。

policyDefaults.extraDependencies[].name

必填

要依赖的对象名称。

policyDefaults.extraDependencies[].namespace

选填

要依赖的对象的命名空间。默认情况下,值设为为 Policy Generator 设置的策略命名空间。

policyDefaults.extraDependencies[].compliance

选填

对象需要处于的合规性状态。默认值为 Compliant

policyDefaults.extraDependencies[].kind

选填

对象的种类。默认值为 Policy,但也可以是具有合规状态的其他类型,如 ConfigurationPolicy

policyDefaults.extraDependencies[].apiVersion

选填

对象的 API 版本。默认值为 policy.open-cluster-management.io/v1

policyDefaults.ignorePending

选填

当 Policy Generator 等待其依赖项达到其所需状态时,绕过合规性状态检查。默认值为 false

policyDefaults.orderPolicies

选填

自动生成有关策略的依赖项,以便它们按照您在策略列表中定义的顺序应用。默认情况下,值设为 false。无法与 policyDefaults.dependencies 同时指定。

policyDefaults.orderManifests

选填

在策略模板上自动生成 extraDependencies,以便它们按照您在该策略的清单列表中定义的顺序应用。当 policyDefaults.consolidateManifests 被设置为 true 时,无法指定。无法与 policyDefaults.extraDependencies 同时指定。

policyDefaults.consolidateManifests

选填

这决定了是否为策略中包含的所有清单生成单一配置策略。如果设置为 false,则为每个清单生成配置策略。默认值为 true

policyDefaults.informGatekeeperPolicies (已弃用)

选填

informGatekeeperPolicies 设置为 false 以直接使用 Gatekeeper 清单,而无需在配置策略中定义。当策略引用违反 Gatekeeper 策略清单时,会生成一个额外的配置策略,以便在 Red Hat Advanced Cluster Management 中接收策略违反情况。默认值为 true

policyDefaults.informKyvernoPolicies

选填

当策略引用 Kyverno 策略清单时,这决定了在 Kyverno 策略被违反时,是否生成额外的配置策略来接收 Red Hat Advanced Cluster Management 中的策略违反情况。默认值为 true

policyDefaults.policySets

选填

策略加入的策略集合的数组。策略设置详情可在 policySets 部分中定义。当一个策略是策略集的一部分时,对这个策略的放置绑定没有保证,因为会为集合生成一个。设置 policies[].generatePlacementWhenInSetpolicyDefaults.generatePlacementWhenInSet 来覆盖 policyDefaults.policySets

policyDefaults.generatePolicyPlacement

选填

为策略生成放置清单。默认设置为 true。当设置为 false 时,会跳过放置清单生成,即使指定了放置也是如此。

policyDefaults.generatePlacementWhenInSet

选填

当一个策略是策略集的一部分时,默认情况下,生成器不会为这个策略生成放置,因为会为策略集生成一个。将 generatePlacementWhenInSet 设置为 true,以使用策略放置和策略设置放置部署策略。默认值为 false

policyDefaults.placement

选填

策略的放置配置。这默认为与所有集群匹配的放置配置。

policyDefaults.placement.name

选填

指定一个名称来整合包含相同集群选择器的放置规则。

policyDefaults.placement.labelSelector

选填

使用 key:value 定义集群选择器来指定放置规则,或使用适当的值提供 matchExpressionsmatchLabels 或两者。请参阅 placementPath 指定现有文件。

policyDefaults.placement.placementName

选填

定义此参数以使用集群中已存在的放置。没有创建 Placement,而是一个 PlacementBinding 将策略绑定到这个 Placement

policyDefaults.placement.placementPath

选填

要重复使用现有放置,请指定相对于 kustomization.yaml 文件的位置的路径。如果提供,则默认所有策略都使用此放置规则。请参阅 labelSelector 以生成新的 放置

policyDefaults.placement.clusterSelector (Deprecated)

选填

PlacementRule 已被弃用。使用 labelSelector 来生成放置。使用 key:value 或提供 matchExpressionsmatchLabels 或使用适当的值来定义集群选择器来指定放置规则。请参阅 placementRulePath 以指定现有文件。

policyDefaults.placement.placementRuleName (Deprecated)

选填

PlacementRule 已被弃用。或者,使用 placementName 指定放置。要使用集群中的现有放置规则,请指定此参数的名称。PlacementRule 不会被创建,但 PlacementBinding 将策略绑定到现有的 PlacementRule

policyDefaults.placement.placementRulePath (Deprecated)

选填

PlacementRule 已被弃用。或者,使用 placementPath 指定放置。要重复使用现有放置规则,请指定相对于 kustomization.yaml 文件的位置的路径。如果提供,则默认所有策略都使用此放置规则。请参阅 clusterSelector 以生成新的 PlacementRule

policySetDefaults

选填

策略设置的默认值。为此参数列出的任何默认值都会被 policySets 数组中的条目覆盖。

policySetDefaults.placement

选填

策略的放置配置。这默认为与所有集群匹配的放置配置。有关此字段的描述,请参阅 policyDefaults.placement

policySetDefaults.generatePolicySetPlacement

选填

为策略集合生成放置清单。默认设置为 true。当设置为 false 时,会跳过放置清单生成,即使指定了放置也是如此。

policies

必填

要创建的策略列表以及覆盖默认值或 policyDefaults 中设置的值。如需了解更多字段和描述,请参阅 policyDefaults

policies[].name

必填

要创建的策略的名称。

policies[].manifests

必填

策略中包含的 Kubernetes 对象清单列表,以及覆盖默认值、此策略项中设置的值或 policyDefaults 中设置的值。如需了解更多字段和描述,请参阅 policyDefaults。当将 Manifests 设置为 true 时,只有 complianceTypemetadataComplianceType 可以在 policies[].manifests 级别被覆盖。

policies[].manifests[].path

必填

相对于 kustomization.yaml 文件,到单个文件的路径、平面文件目录或 Kustomize 目录。如果该目录是一个 Kustomize 目录,则生成器会在生成策略前针对目录运行 Kustomize。

policies[].manifests[].patches

选填

应用到路径上清单的 Kustomize 补丁列表。如果有多个清单,补丁需要设置 apiVersionkindmetadata.namemetadata.namespace (如果适用)字段,以便 Kustomize 可以识别补丁应用到的清单。如果只有一个清单,则可以修补 metadata.namemetadata.namespace 字段。

policySets

选填

要创建的策略集合列表,以及覆盖默认值或 policySetDefaults 中设置的值。要在策略集中包含策略,请使用 policyDefaults.policySets, policies[].policySets, 或 policySets.policies。如需了解更多字段和描述,请参阅 policySetDefaults

policySets[].name

必填

要创建的策略的名称。

policySets[].description

选填

要创建的策略集的描述。

policySets[].policies

选填

包括在策略集中的策略列表。如果还指定了 policyDefaults.policySetspolicies[].policySets,则列表会被合并。

2.11.2.4. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.