2.3. 策略控制器介绍


策略控制器监控并报告集群是否合规。使用 Red Hat Advanced Cluster Management for Kubernetes 策略框架,使用支持的策略模板应用由这些控制器管理的策略。策略控制器管理 Kubernetes 自定义资源定义实例。

策略控制器检查策略违反情况,如果控制器支持强制功能,可以使集群状态合规。查看以下主题以了解有关以下 Red Hat Advanced Cluster Management for Kubernetes 策略控制器的更多信息:

重要: 只有配置策略控制器策略支持 enforce 功能。当策略控制器不支持 enforce 功能时,您必须手动修复策略。

2.3.1. Kubernetes 配置策略控制器

配置策略控制器可用于配置任何 Kubernetes 资源,并在集群中应用安全策略。配置策略在 hub 集群上的策略的 policy-templates 字段中提供,并由监管框架传播到所选受管集群。

在配置策略中的 object-templates 数组中定义了 Kubernetes 对象(完整或部分),指示字段的配置策略控制器与受管集群上的对象进行比较。配置策略控制器与本地 Kubernetes API 服务器通信,以获取集群中的配置列表。

配置策略控制器是在安装过程中在受管集群上创建的。配置策略控制器支持 enforceInformOnly 功能,以便在配置策略不合规时进行修复。

当将配置策略的 remediationAction 设置为 enforce 时,控制器会将指定的配置应用到目标受管集群。

当将配置策略的 remediationAction 设置为 InformOnly 时,父策略不会强制执行配置策略,即使父策略中的 remediationAction 被设置为 enforce

注: 指定没有名称的对象的配置策略只能是 inform

您还可以在配置策略中使用模板的值。如需更多信息,请参阅模板处理

如果您想将现有的 Kubernetes 清单放入到一个策略,则策略生成器是完成此任务的有用工具。

2.3.1.1. 配置策略示例

apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
  name: policy-config
spec:
  namespaceSelector:
    include: ["default"]
    exclude: []
    matchExpressions: []
    matchLabels: {}
  remediationAction: inform
  severity: low
  evaluationInterval:
    compliant:
    noncompliant:
  object-templates:
  - complianceType: musthave
    objectDefinition:
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod
      spec:
        containers:
        - image: pod-image
          name: pod-name
          ports:
          - containerPort: 80
  - complianceType: musthave
    objectDefinition:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: myconfig
      namespace: default
      data:
      testData: hello
    spec:
...
Copy to Clipboard Toggle word wrap

2.3.1.2. 配置策略 YAML 标

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

apiVersion

必填

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

kind

必填

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

metadata.name

必填

策略的名称。

spec.namespaceSelector

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

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

spec.remediationAction

必填

指定当策略不合规时要执行的操作。使用以下参数值: 通知InformOnlyenforce

spec.severity

必填

当策略不合规时,指定严重性。使用以下参数值:low, medium, high, 或 critical

spec.evaluationInterval.compliant

选填

用于定义策略处于合规状态时的评估频率。该值的格式必须是一个持续时间,它是带有时间单元后缀的数字序列。例如:12h30m5s 代表 12 小时、30 分钟和 5 秒。另外,也可以将其设定为 never,以便策略不会在合规集群中重新评估,除非更新了策略 spec

默认情况下,当 evaluationInterval.compliant 没有设置或为空时,配置策略评估之间的最短时间约为 10 秒。如果受管集群上的配置策略控制器饱和,这可能会更长。

spec.evaluationInterval.noncompliant

选填

用于定义策略处于不合规状态时的频率。与 evaluationInterval.compliant 参数类似,值必须采用持续时间格式,后者是时间后缀的序列。另外,也可以将其设定为 never,以便策略不会在不合规的集群中重新评估,除非更新了策略 spec

spec.object-templates

选填

用于控制器的 Kubernetes 对象数组(已定义或包含字段子集),以便与受管集群上的对象进行比较。注: 虽然 spec.object-templatesspec.object-templates-raw 列为可选,但必须设置两个参数字段中的一个。

spec.object-templates-raw

选填

用于使用原始 YAML 字符串设置对象模板。指定对象模板的条件,其中支持 if-else 语句和 range 函数等高级功能。例如,添加以下值以避免在 object-templates 定义中出现重复:

{{- if eq .metadata.name "policy-grc-your-meta-data-name" }} replicas: 2 {{- else }} replicas: 1 {{- end }}

注: 虽然 spec.object-templatesspec.object-templates-raw 列为可选,但必须设置两个参数字段中的一个。

spec.object-templates[].complianceType

必填

在受管集群中定义 Kubernetes 对象的所需状态。使用以下动词之一作为参数值:

  • mustonlyhave :代表必须存在带有在 objectDefinition 中定义的特定字段和值。
  • musthave :代表必须存在名称与 objectDefinition 中指定的相同字段的对象。在 object-template 中指定的任何现有字段都会被忽略。通常,会附加数组值。要修补数组的一个例外是,当项目包含一个与现有项匹配的 name 值时。如果要替换数组,请使用 mustonlyhave 合规类型来完全定义 objectDefinition
  • mustnothave :代表一个具有与 objectDefinition 中指定的字段相同的对象不能存在。

spec.object-templates[].metadataComplianceType

选填

当将清单的 metadata 部分与集群中的对象比较时覆盖 spec.object-templates[].complianceType ("musthave", "mustonlyhave")。默认没有设置,这不会为原始覆盖 complianceType

spec.object-templates[].recordDiff

选填

使用此参数指定是否和在哪里显示集群中的对象与策略中的 objectDefinition 之间的区别。支持以下选项:

  • 设置为 InStatus 以存储 ConfigurationPolicy 状态中的差别。
  • 设置为 Log,以记录控制器日志的区别。
  • 设置为 None 不会记录区别。

默认情况下,如果控制器没有检测区别中的敏感数据,则此参数被设置为 InStatus。否则,默认值为 None。如果检测到敏感数据,ConfigurationPolicy 状态会显示一条消息,以设置 recordDiff 以查看差异。

spec.object-templates[].recreateOption

选填

描述在需要更新时删除和重新创建对象的时间。当您将对象设置为 IfRequired 时,策略会在更新不可变字段时重新创建对象。当您将参数设置为 Always 时,策略会在任何更新上重新创建对象。当您将 remediationAction 设置为 inform 时,参数值 recreateOption 不会对对象产生影响。IfRequired 值对集群没有空运行更新支持的集群没有影响。默认值为 None

spec.object-templates[].objectDefinition

必填

用于控制器的 Kubernetes 对象数组(完整定义或包含字段子集),以便与受管集群上的对象进行比较。

spec.pruneObjectBehavior

选填

决定在从受管集群中删除策略时是否清理与策略相关的资源。

2.3.1.3. 其他资源

如需更多信息,请参阅以下主题:

2.3.2. 证书策略控制器

您可以使用证书策略控制器来检测接近到期的证书,持续时间(小时)过长,或者包含无法与指定模式匹配的 DNS 名称。您可以将证书策略添加到 hub 集群上的策略的 policy-templates 字段中,它使用监管框架传播到所选受管集群。有关 hub 集群策略的详情,请参阅策略概述文档。

通过更新控制器策略中的以下参数来配置和自定义证书策略控制器:

  • minimumDuration
  • minimumCADuration
  • maximumDuration
  • maximumCADuration
  • allowedSANPattern
  • disallowedSANPattern

由于以下情况之一,您的策略可能会变得不合规:

  • 当证书过期的时间少于最短持续时间,或超过最长时间时。
  • 当 DNS 名称与指定模式匹配时。

证书策略控制器是在受管集群上创建的。控制器与本地 Kubernetes API 服务器通信,以获取包含证书的 secret 列表,并确定所有不合规的证书。

证书策略控制器不支持 enforce 功能。

注: 证书策略控制器仅在 tls.crt 键的 secret 中自动查找证书。如果 secret 存储在不同的键下,添加名为 certificate_key_name 的标签,其值为 key,使证书策略控制器知道在不同的键中。例如,如果 secret 包含存储在名为 sensor-cert.pem 的密钥的证书,请将以下内容添加到 secret: certificate_key_name: sensor-cert.pem 中。

2.3.2.1. 证书策略控制器 YAML 结构

查看证书策略的以下示例,并查看 YAML 表中的元素:

apiVersion: policy.open-cluster-management.io/v1
kind: CertificatePolicy
metadata:
  name: certificate-policy-example
spec:
  namespaceSelector:
    include: ["default"]
    exclude: []
    matchExpressions: []
    matchLabels: {}
  labelSelector:
    myLabelKey: myLabelValue
  remediationAction:
  severity:
  minimumDuration:
  minimumCADuration:
  maximumDuration:
  maximumCADuration:
  allowedSANPattern:
  disallowedSANPattern:
Copy to Clipboard Toggle word wrap
2.3.2.1.1. 证书策略控制器 YAML 表
Expand
表 2.3. 参数表
字段可选或必需的描述

apiVersion

必填

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

kind

必填

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

metadata.name

必填

用于标识策略的名称。

metadata.labels

选填

在证书策略中,category=system-and-information-integrity 标签将对策略进行分类,并促进查询证书策略。如果您的证书策略中 category 键的值不同,该值会被证书控制器覆盖。

spec.namespaceSelector

必填

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

注: 如果证书策略控制器的 namespaceSelector 与任何命名空间不匹配,则该策略被视为合规。

spec.labelSelector

选填

指定识别对象属性。请参阅 Kubernetes 标签和选择器文档。

spec.remediationAction

必填

指定您的策略的修复。将参数值设置为 inform。证书策略控制器只支持 inform 功能。

spec.severity

选填

当策略不合规时,会告知用户的严重性。使用以下参数值:low, medium, high, 或 critical

spec.minimumDuration

必填

如果没有指定值,则默认为 100h。参数指定证书被视为不合规前的最短持续时间(以小时为单位)。参数值使用 Golang 的持续时间格式。如需更多信息,请参阅 Golang 解析持续时间

spec.minimumCADuration

选填

设定一个与其他证书不同的值来标识可能很快过期的签名证书。如果没有指定参数值,则 CA 证书过期时间作为 minimumDuration 的值。如需更多信息,请参阅 Golang 解析持续时间

spec.maximumDuration

选填

指定一个值来标识创建的时间超过您所期望的限制值的证书。参数使用 Golang 的持续时间格式。如需更多信息,请参阅 Golang 解析持续时间

spec.maximumCADuration

选填

创建一个值来标识创建的时间超过您定义的限制值的签名的证书。参数使用 Golang 的持续时间格式。如需更多信息,请参阅 Golang 解析持续时间

spec.allowedSANPattern

选填

正则表达式,必须与您证书中定义的每个 SAN 条目匹配。这个参数会根据特征检查 DNS 名称。如需更多信息,请参阅 Golang 郑则表达式语法

spec.disallowedSANPattern

选填

正则表达式,不能与证书中定义的任何 SAN 条目匹配。这个参数会根据特征检查 DNS 名称。

:要检测通配符证书,请使用以下 SAN 模式:disallowedSANPattern: "[\\*]"

如需更多信息,请参阅 Golang 郑则表达式语法

2.3.2.2. 证书策略示例

当在 hub 集群上创建证书策略控制器时,会在受管集群上创建复制策略。请参阅 policy-certificate.yaml 查看证书策略示例。

2.3.2.3. 其他资源

2.3.3. 策略控制器

策略控制器将策略状态范围聚合到同一命名空间中定义的策略。创建策略集合(PolicySet),以对同一命名空间中的策略进行分组。PolicySet 中的所有策略都放在选定集群中,方法是创建一个 PlacementBinding 来绑定 PolicySetPlacement。策略集已部署到 hub 集群。

另外,当策略是多个策略集的一部分时,现有和新的 Placement 资源保留在策略中。当用户从策略集合中删除策略时,策略不会应用到在策略集合中选择的集群,但放置会保留。策略控制器只检查包括策略设置放置的集群中的违反情况。

备注:

  • Red Hat Advanced Cluster Management 示例策略集使用集群放置。如果使用集群放置,请将包含策略的命名空间绑定到受管集群集。有关使用集群放置的详情,请参阅在集群中部署策略
  • 要使用 放置资源ManagedClusterSet 资源必须绑定到带有 ManagedClusterSetBinding 资源的 Placement 资源的命名空间。如需了解更多详细信息 ,请参阅创建 ManagedClusterSetBinding 资源

在以下部分了解更多有关策略设置结构的详细信息:

2.3.3.1. 策略设置 YAML 结构

您的策略集可能类似以下 YAML 文件:

apiVersion: policy.open-cluster-management.io/v1beta1
kind: PolicySet
metadata:
  name: demo-policyset
spec:
  policies:
  - policy-demo

---
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: demo-policyset-pb
placementRef:
  apiGroup: cluster.open-cluster-management.io
  kind: Placement
  name: demo-policyset-pr
subjects:
- apiGroup: policy.open-cluster-management.io
  kind: PolicySet
  name: demo-policyset
---
apiVersion: cluster.open-cluster-management.io/v1beta1
kind: Placement
metadata:
  name: demo-policyset-pr
spec:
  predicates:
  - requiredClusterSelector:
      labelSelector:
        matchExpressions:
          - key: name
            operator: In
            values:
              - local-cluster
Copy to Clipboard Toggle word wrap

2.3.3.2. 策略设置表

查看以下参数表以获详细信息:

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

apiVersion

必填

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

kind

必填

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

metadata.name

必填

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

spec

必填

添加策略的配置详情。

spec.policies

选填

要在策略集合中分组的策略列表。

2.3.3.3. 策略示例

apiVersion: policy.open-cluster-management.io/v1beta1
kind: PolicySet
metadata:
  name: pci
  namespace: default
spec:
  description: Policies for PCI compliance
  policies:
  - policy-pod
  - policy-namespace
status:
  compliant: NonCompliant
  placement:
  - placementBinding: binding1
    placement: placement1
    policySet: policyset-ps
Copy to Clipboard Toggle word wrap

2.3.3.4. 其他资源

2.3.4. Operator 策略控制器

Operator 策略控制器允许您在集群中监控和安装 Operator Lifecycle Manager Operator。使用 Operator 策略控制器来监控 Operator 的各种部分的健康状况,并指定如何自动处理 Operator 更新。

您还可以使用监管框架将 operator 策略分发到受管集群,并将策略添加到 hub 集群上的策略的 policy-templates 字段中。

您还可以使用 operator 策略的 operatorGroupsubscription 字段中的模板值。如需更多信息,请参阅模板处理

2.3.4.1. 先决条件

  • Operator Lifecycle Manager 必须在受管集群中可用。这在 Red Hat OpenShift Container Platform 上默认启用。
  • 需要的访问权限:集群管理员

2.3.4.2. Operator 策略 YAML 表

Expand
字段可选或必需的描述

apiVersion

必填

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

kind

必填

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

metadata.name

必填

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

spec.remediationAction

必填

如果将 operator 策略的 remediationAction 设置为 enforce,则控制器会在目标受管集群上创建资源,以与 OLM 通信以根据策略中指定的版本安装 Operator 并根据策略中指定的版本批准更新。+ 如果 remediationAction 设置为 inform,控制器只报告 Operator 的状态,包括任何升级可用。

spec.operatorGroup

选填

默认情况下,如果没有指定 operatorGroup 字段,控制器会在与订阅相同的命名空间中生成一个 AllNamespaces 类型 OperatorGroup。此资源由 Operator 策略控制器生成。

spec.complianceType

必填

指定集群上 Operator 的所需状态。如果设置为 musthave,则当找到 Operator 时策略会合规。如果设置为 mustnothave,则在找不到 Operator 时策略合规。

spec.removalBehavior

选填

当您强制定义 complianceType: mustnothaveOperatorPolicy 资源时,决定需要保留或删除哪些资源类型。当 complianceType 设置为 musthave 时,没有影响。- operatorGroups 可以设置为 KeepDeleteIfUnused。默认值为 DeleteIfUnusued,它仅在任何其他 Operator 没有使用时删除 OperatorGroup 资源。- 订阅 可以设置为 KeepDelete。默认值为 Delete. - clusterServiceVersions 可以设置为 KeepDelete。默认值为 Delete。- customResourceDefinitions 可以设置为 KeepDelete。默认值为 Keep。如果把它设置为 Delete,则受管集群上的 CustomResourceDefintion 资源会被删除,并可能导致数据丢失。

spec.subscription

必填

定义用于创建 operator 订阅的配置。在以下字段中添加信息以创建 operator 订阅。如果没有条目,会为几个项目选择默认选项:

  • 频道 :如果没有指定,则会从 operator 目录中选择默认频道。默认值在不同的 OpenShift Container Platform 版本中可能会有所不同。
  • 名称 :指定 Operator 的软件包名称。
  • 命名空间 :如果没有指定,用于 OpenShift Container Platform 受管集群的默认命名空间为 openshift-operators
  • Source :如果没有指定,则会选择包含 Operator 的目录。
  • sourceNamespace :如果没有指定,则会选择包含 Operator 的目录的命名空间。

    注: 如果您为 upgradeApproval 定义了一个值,您的策略将变为不合规。

spec.complianceConfig

选填

使用此参数定义与操作器关联的特定场景的合规性行为。您可以单独设置以下选项,其中支持的值为 CompliantNonCompliant

  • catalogSourceUnhealthy :定义 Operator 的目录源不健康时的合规性。默认值为 Compliant,因为这只会影响到可能的升级。
  • deploymentsUnavailable :定义至少一个 Operator 部署没有完全可用时的合规性。默认值为 NonCompliant,因为这反映了 Operator 提供的服务的可用性。
  • upgrade Available :定义有可用于 Operator 的升级时的合规性。默认值为 Compliant,因为现有 Operator 安装可能会正确运行。

spec.upgradeApproval

必填

如果 upgradeApproval 字段设置为 Automatic,策略将设置为 enforce 时,策略会批准集群中的版本升级。如果将字段设置为 None,当策略设置为 enforce 时,到特定 Operator 的版本将不会被批准。

spec.versions

选填

声明哪些 Operator 版本合规。如果字段为空,则集群中运行的任何版本都被视为合规。如果该字段不为空,则受管集群上的版本必须与列表中的一个版本匹配,以便策略兼容。如果策略被设置为 enforce,且列表不为空,则控制器会批准此处列出的版本。

2.3.4.3. 其他资源

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat