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


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

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

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

2.9.1. 集成 gatekeeper 约束和约束模板

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

先决条件: 您必须有一个 Red Hat Advanced Cluster Management for Kubernetes 或 Red Hat OpenShift Container Platform Plus 订阅,才能将 Gatekeeper 策略应用到集群。只有在最新版本的 Red Hat Advanced Cluster Management 支持的 OpenShift Container Platform 版本(版本 3.11 除外)上支持 gatekeeper。

gatekeeper 策略在 Red Hat Advanced Cluster Management 中作为 Kubernetes 配置策略创建。Gatekeeper 策略包括约束模板(ConstraintTemplates)和 Constraints、审计模板和准入模板。如需更多信息,请参阅 Gatekeeper 上游存储库

Red Hat Advanced Cluster Management 支持 Gatekeeper 版本 3.3.0,并在 Red Hat Advanced Cluster Management gatekeeper 策略中应用以下约束模板:

  • ConstraintTemplates 和约束: 使用 policy-gatekeeper-k8srequiredlabels 策略在受管集群上创建 gatekeeper 约束模板。

    apiVersion: policy.open-cluster-management.io/v1
    kind: ConfigurationPolicy
    metadata:
      name: policy-gatekeeper-k8srequiredlabels
    spec:
      remediationAction: enforce # will be overridden by remediationAction in parent policy
      severity: low
      object-templates:
        - complianceType: musthave
          objectDefinition:
            apiVersion: templates.gatekeeper.sh/v1beta1
            kind: ConstraintTemplate
            metadata:
              name: k8srequiredlabels
            spec:
              crd:
                spec:
                  names:
                    kind: K8sRequiredLabels
                  validation:
                    # Schema for the `parameters` field
                    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])
                    }
        - complianceType: musthave
          objectDefinition:
            apiVersion: constraints.gatekeeper.sh/v1beta1
            kind: K8sRequiredLabels
            metadata:
              name: ns-must-have-gk
            spec:
              match:
                kinds:
                  - apiGroups: [""]
                    kinds: ["Namespace"]
                namespaces:
                  - e2etestsuccess
                  - e2etestfail
              parameters:
                labels: ["gatekeeper"]
  • audit 模板: 使用 policy-gatekeeper-audit 定期检查并评估为检测现有错误配置而强制执行的门管理器策略的现有资源。

    apiVersion: policy.open-cluster-management.io/v1
    kind: ConfigurationPolicy
    metadata:
      name: policy-gatekeeper-audit
    spec:
      remediationAction: inform # will be overridden by remediationAction in parent policy
      severity: low
      object-templates:
        - complianceType: musthave
          objectDefinition:
            apiVersion: constraints.gatekeeper.sh/v1beta1
            kind: K8sRequiredLabels
            metadata:
              name: ns-must-have-gk
            status:
              totalViolations: 0
  • Admission 模板: 使用 policy-gatekeeper-admission 检查由 gatekeeper admission webhook 创建的错误配置:

    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
  • 如需了解更多详细信息,请参阅 policy-gatekeeper-sample.yaml
  • 如需了解更多详细信息,请参阅 OPA Gatekeeper 是什么
  • 有关管理其他策略的更多信息,请参阅管理配置策略

有关安全框架的更多主题,请参阅监管

2.9.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 文档

此 Red Hat Advanced Cluster Management 版本捆绑的策略生成器版本是 v1.10.0。如需更多信息,请查看以下主题:

2.9.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.9.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
  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.9.2.3. 策略生成器配置参考表

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

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

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.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.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

选填

当策略引用违反 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.generatePlacementWhenInSet

选填

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

policyDefaults.placement

选填

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

policyDefaults.placement.name

选填

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

policyDefaults.placement.placementName

选填

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

policyDefaults.placement.placementPath

选填

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

policyDefaults.placement.clusterSelectors

选填

通过以以下格式 key:value 定义集群选择器来指定放置。请参阅 placementPath 指定现有文件。

policyDefaults.placement.placementRuleName

选填

要使用集群中已存在的放置规则,请在此处指定其名称。PlacementRule 不会被创建, PlacementBinding 将策略绑定到此 PlacementRule

policyDefaults.placement.placementRulePath

选填

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

policyDefaults.placement.labelSelector

选填

使用以下格式定义集群选择器来指定放置规则,即 key:value。请参阅 placementRulePath 以指定现有文件。

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

选填

要创建的策略集合列表。要在策略集中包含策略,请使用 policyDefaults.policySets, policies[].policySets, 或 policySets.policies

policySets[].name

必填

要创建的策略的名称。

policySets[].description

选填

要创建的策略集的描述。

policySets[].policies

选填

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

policySets[].placement

选填

策略设置的放置配置。这默认为与所有集群匹配的放置配置。请参阅 policyDefaults.placement 放置文档,但 policyDefaults.placement 设置不适用于策略集合。

2.9.3. 生成用于安装 Operator 的策略

Red Hat Advanced Cluster Management 策略的一个常见用途是在一个或多个受管 Red Hat OpenShift Container Platform 集群上安装 Operator。继续阅读以了解如何使用 Policy Generator 生成策略,并使用生成的策略安装 OpenShift GitOps Operator:

2.9.3.1. 生成安装 OpenShift GitOps 的策略

您可以使用 Policy Generator 生成安装 OpenShift GitOps 的策略。OpenShift GitOps operator 提供 所有命名空间 安装模式,如下例所示。创建名为 openshift-gitops-subscription.yamlSubscription 清单文件,如下例所示:

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: openshift-gitops-operator
  namespace: openshift-operators
spec:
  channel: stable
  name: openshift-gitops-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace

要固定到 Operator 的特定版本,您可以添加以下参数和值: spec.startingCSV: openshift-gitops-operator.v<version>。将 <version> 替换为您的首选版本。

需要 PolicyGenerator 配置文件。使用名为 policy-generator-config.yaml 的配置文件来生成策略,以便在所有 OpenShift Container Platform 受管集群上安装 OpenShift GitOps。请参见以下示例:

apiVersion: policy.open-cluster-management.io/v1
kind: PolicyGenerator
metadata:
  name: install-openshift-gitops
policyDefaults:
  namespace: policies
  placement:
    clusterSelectors:
      vendor: "OpenShift"
  remediationAction: enforce
policies:
  - name: install-openshift-gitops
    manifests:
      - path: openshift-gitops-subscription.yaml

最后所需的文件是 kustomization.yaml,它需要以下配置:

generators:
  - policy-generator-config.yaml

生成的策略可能类似以下文件:

apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
  name: placement-install-openshift-gitops
  namespace: policies
spec:
  clusterConditions:
    - status: "True"
      type: ManagedClusterConditionAvailable
  clusterSelector:
    matchExpressions:
      - key: vendor
        operator: In
        values:
          - OpenShift
---
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: binding-install-openshift-gitops
  namespace: policies
placementRef:
  apiGroup: apps.open-cluster-management.io
  kind: PlacementRule
  name: placement-install-openshift-gitops
subjects:
  - apiGroup: policy.open-cluster-management.io
    kind: Policy
    name: install-openshift-gitops
---
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
  name: install-openshift-gitops
  namespace: policies
spec:
  disabled: false
  policy-templates:
    - objectDefinition:
        apiVersion: policy.open-cluster-management.io/v1
        kind: ConfigurationPolicy
        metadata:
          name: install-openshift-gitops
        spec:
          object-templates:
            - complianceType: musthave
              objectDefinition:
                apiVersion: operators.coreos.com/v1alpha1
                kind: Subscription
                metadata:
                  name: openshift-gitops-operator
                  namespace: openshift-operators
                spec:
                  channel: stable
                  name: openshift-gitops-operator
                  source: redhat-operators
                  sourceNamespace: openshift-marketplace
          remediationAction: enforce
          severity: low

支持 OpenShift Container Platform 文档中的从清单生成的策略。OpenShift Container Platform 文档中的任何配置指南都可以使用 Policy Generator 应用。

2.9.3.2. 生成安装 Compliance Operator 的策略

对于使用 命名空间安装模式的 Operator,如 Compliance Operator,还需要 OperatorGroup 清单。

创建一个 YAML 文件,其中包含 NamespaceSubscription 和名为 compliance-operator.yamlOperatorGroup 清单。以下示例将这些清单安装到 compliance-operator 命名空间中:

apiVersion: v1
kind: Namespace
metadata:
  name: openshift-compliance
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: compliance-operator
  namespace: openshift-compliance
spec:
  targetNamespaces:
    - compliance-operator
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: compliance-operator
  namespace: openshift-compliance
spec:
  channel: release-0.1
  name: compliance-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace

需要 PolicyGenerator 配置文件。查看以下 PolicyGenerator 策略示例,该示例在所有 OpenShift Container Platform 受管集群上安装 Compliance Operator:

apiVersion: policy.open-cluster-management.io/v1
kind: PolicyGenerator
metadata:
  name: install-compliance-operator
policyDefaults:
  namespace: policies
  placement:
    clusterSelectors:
      vendor: "OpenShift"
  remediationAction: enforce
policies:
  - name: install-compliance-operator
    manifests:
      - path: compliance-operator.yaml

最后所需的文件是 kustomization.yaml,它需要以下配置:

generators:
  - policy-generator-config.yaml

因此,生成的策略类似于以下文件:

apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
  name: placement-install-compliance-operator
  namespace: policies
spec:
  clusterConditions:
    - status: "True"
      type: ManagedClusterConditionAvailable
  clusterSelector:
    matchExpressions:
      - key: vendor
        operator: In
        values:
          - OpenShift
---
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: binding-install-compliance-operator
  namespace: policies
placementRef:
  apiGroup: apps.open-cluster-management.io
  kind: PlacementRule
  name: placement-install-compliance-operator
subjects:
  - apiGroup: policy.open-cluster-management.io
    kind: Policy
    name: install-compliance-operator
---
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
  name: install-compliance-operator
  namespace: policies
spec:
  disabled: false
  policy-templates:
    - objectDefinition:
        apiVersion: policy.open-cluster-management.io/v1
        kind: ConfigurationPolicy
        metadata:
          name: install-compliance-operator
        spec:
          object-templates:
            - complianceType: musthave
              objectDefinition:
                apiVersion: v1
                kind: Namespace
                metadata:
                  name: openshift-compliance
            - complianceType: musthave
              objectDefinition:
                apiVersion: operators.coreos.com/v1alpha1
                kind: Subscription
                metadata:
                  name: compliance-operator
                  namespace: openshift-compliance
                spec:
                  channel: release-0.1
                  name: compliance-operator
                  source: redhat-operators
                  sourceNamespace: openshift-marketplace
            - complianceType: musthave
              objectDefinition:
                apiVersion: operators.coreos.com/v1
                kind: OperatorGroup
                metadata:
                  name: compliance-operator
                  namespace: openshift-compliance
                spec:
                  targetNamespaces:
                    - compliance-operator
          remediationAction: enforce
          severity: low

2.9.3.3. 使用带有 OperatorGroup 的策略依赖项

当使用 OperatorGroup 清单安装 Operator 时,OperatorGroup 必须在创建 Subscription 前存在于集群中。使用策略依赖项功能以及 Policy Generator,确保在强制 订阅 策略前 OperatorGroup 策略兼容。

通过按您想要的顺序列出清单来设置策略依赖项。例如,您可能想要首先创建命名空间策略,然后创建 OperatorGroup,然后创建 订阅 最后。

启用 policyDefaults.orderManifests 参数,并在 Policy Generator 配置清单中禁用 policyDefaults.consolidateManifests,以自动设置清单之间的依赖项。

2.9.4. 使用 OpenShift GitOps 管理策略定义(ArgoCD)

基于 ArgoCD 的 OpenShift GitOps 也可用于管理策略定义。要允许此工作流,OpenShift GitOps 必须被授予在 Red Hat Advanced Cluster Management hub 集群中创建策略的访问权限。创建以下 ClusterRole 资源,名为 openshift-gitops-policy-admin,它有权创建、读取、更新和删除策略和放置。您的 ClusterRole 可能类似以下示例:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: openshift-gitops-policy-admin
rules:
  - verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    apiGroups:
      - policy.open-cluster-management.io
    resources:
      - policies
      - placementbindings
  - verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    apiGroups:
      - apps.open-cluster-management.io
    resources:
      - placementrules
  - verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    apiGroups:
      - cluster.open-cluster-management.io
    resources:
      - placements
      - placements/status
      - placementdecisions
      - placementdecisions/status

创建一个 ClusterRoleBinding 对象,为 OpenShift GitOps 服务帐户授予 openshift-gitops-policy-admin ClusterRole 对象的访问权限。ClusterRoleBinding 可能类似以下示例:

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: openshift-gitops-policy-admin
subjects:
  - kind: ServiceAccount
    name: openshift-gitops-argocd-application-controller
    namespace: openshift-gitops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: openshift-gitops-policy-admin

当使用 OpenShift GitOps 部署 Red Hat Advanced Cluster Management 策略定义时,会在每个受管集群命名空间中创建策略副本。这些副本称为复制策略。要防止 OpenShift GitOps 重复删除此复制策略,或者显示 ArgoCD 应用程序没有同步,则 Red Hat Advanced Cluster Management 策略框架在每个复制策略上自动设置 argocd.argoproj.io/compare-options: IgnoreExtraneous 注解。

ArgoCD 使用标签和注解来跟踪对象。要使复制策略不会显示在 ArgoCD 中,您可以在 Red Hat Advanced Cluster Management 策略定义中将 spec.copyPolicyMetadata 设置为 false,以防止将这些 ArgoCD 跟踪标签和注解复制到复制策略。

2.9.4.1. 将策略生成器与 OpenShift GitOps 集成(ArgoCD)

基于 ArgoCD 的 OpenShift GitOps 也可用于通过 GitOps 使用 Policy Generator 生成策略。由于 OpenShift GitOps 容器镜像中没有预安装 Policy Generator,因此必须进行一些自定义。为了继续操作,必须在 Red Hat Advanced Cluster Management hub 集群中安装了 OpenShift GitOps Operator,并确保登录到 hub 集群。

为了使 OpenShift GitOps 在运行 Kustomize 时可以访问 Policy Generator,需要一个 Init 容器,将 Red Hat Advanced Cluster Management Application Subscription 容器镜像中的 Policy Generator 二进制文件复制到 OpenShift GitOps 容器。另外,OpenShift GitOps 必须配置为在运行 Kustomize 时提供 --enable-alpha-plugins 标志。使用以下命令开始编辑 OpenShift GitOps argocd 对象:

oc -n openshift-gitops edit argocd openshift-gitops

然后,修改 OpenShift GitOps argocd 对象使其包含以下额外的 YAML 内容。当发布新的 Red Hat Advanced Cluster Management 主版本且您要将 Policy Generator 更新至更新的版本时,您需要更新 registry.redhat.io/busybox2/multicluster-operators-subscription-rhel8 镜像,供 Init 容器用于较新的标签。查看以下示例,将 < version&gt; 替换为 2.7 或您所需的 Red Hat Advanced Cluster Management 版本:

apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
  name: openshift-gitops
  namespace: openshift-gitops
spec:
  kustomizeBuildOptions: --enable-alpha-plugins
  repo:
    env:
    - name: KUSTOMIZE_PLUGIN_HOME
      value: /etc/kustomize/plugin
    initContainers:
    - args:
      - -c
      - cp /etc/kustomize/plugin/policy.open-cluster-management.io/v1/policygenerator/PolicyGenerator
        /policy-generator/PolicyGenerator
      command:
      - /bin/bash
      image: registry.redhat.io/rhacm2/multicluster-operators-subscription-rhel8:v<version>
      name: policy-generator-install
      volumeMounts:
      - mountPath: /policy-generator
        name: policy-generator
    volumeMounts:
    - mountPath: /etc/kustomize/plugin/policy.open-cluster-management.io/v1/policygenerator
      name: policy-generator
    volumes:
    - emptyDir: {}
      name: policy-generator

现在,OpenShift GitOps 可以使用 Policy Generator,OpenShift GitOps 必须被授予在 Red Hat Advanced Cluster Management hub 集群中创建策略的访问权限。创建名为 openshift-gitops-policy-adminClusterRole 资源,其具有创建、读取、更新和删除策略和放置的访问权限。请参阅 ealier ClusterRole 示例。

另外,创建一个 ClusterRoleBinding 对象来授予 OpenShift GitOps 服务帐户对 openshift-gitops-policy-admin ClusterRole 的访问权限。ClusterRoleBinding 可能类似以下资源:

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: openshift-gitops-policy-admin
subjects:
  - kind: ServiceAccount
    name: openshift-gitops-argocd-application-controller
    namespace: openshift-gitops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: openshift-gitops-policy-admin
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.