2.3. 策略控制器


策略控制器监控并报告集群是否合规。通过开箱即用的策略模板应用预定义策略控制器和策略,以使用 Red Hat Advanced Cluster Management for Kubernetes 策略框架。策略控制器是 Kubernetes 自定义资源定义(CRD)实例。

有关 CRD 的更多信息,请参阅使用 CustomResourceDefinitions 扩展 Kubernetes API。策略控制器会修复策略违反情况,以使集群状态兼容。

您可以使用产品策略框架创建自定义策略和策略控制器。如需更多信息,请参阅 创建自定义策略控制器(已弃用)。

查看以下主题以了解有关以下 Red Hat Advanced Cluster Management for Kubernetes 策略控制器的更多信息:

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

有关管理您的策略的更多主题,请参阅监管

2.3.1. Kubernetes 配置策略控制器

配置策略控制器可用于配置任何 Kubernetes 资源,并在集群中应用安全策略。

配置策略控制器与本地 Kubernetes API 服务器通信,以获取集群中的配置列表。有关 CRD 的更多信息,请参阅使用 CustomResourceDefinitions 扩展 Kubernetes API

配置策略控制器是在安装过程中在 hub 集群上创建的。配置策略控制器支持 enforce 功能并监控以下策略的合规性:

当将配置策略的 remediationAction 设置为 enforce 时,控制器会在目标受管集群上创建副本策略。您还可以在配置策略中使用模板。如需更多信息,请参阅配置策略中的模板支持

继续读取以了解更多有关配置策略控制器的信息:

2.3.1.1. 配置策略控制器 YAML 结构

Name:         configuration-policy-example
Namespace:
Labels:
APIVersion:   policy.open-cluster-management.io/v1
Kind:         ConfigurationPolicy
Metadata:
  Finalizers:
    finalizer.policy.open-cluster-management.io
Spec:
  Conditions:
    Ownership:
    NamespaceSelector:
      Exclude:
      Include:
    RemediationAction:
 Status:
   CompliancyDetails:
     Configuration-Policy-Example:
       Default:
       Kube - Public:
   Compliant:          Compliant
 Events:
Copy to Clipboard Toggle word wrap

2.3.1.2. 配置策略示例

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

2.3.1.3. 配置策略 YAML 标

Expand
表 2.1. 参数表
字段描述

apiVersion

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

kind

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

metadata.name

必需。策略的名称。

spec

必需。有关监控哪些配置策略以及如何进行修复的规格。

spec.namespace

命名空间对象或资源是必需的。策略应用到的 hub 集群中的命名空间。至少为 include 参数输入一个命名空间,这是您要将策略应用到的命名空间。exclude 参数指定您明确不希望将策略应用到的命名空间。

spec.remediationAction

必需。指定您的策略的修复。输入 inform

spec.remediationAction.severity

必需。当策略不合规时,指定严重性。使用以下参数值: lowmediumhigh

spec.remediationAction.complianceType

必需。用于列出必须被评估或应用到受管集群的角色的预期行为和任何 Kubernetes 对象。您必须使用以下操作动词作为参数值:

mustonlyhave:必须存在带有相同的名称和相关项的对象。

musthave:必须存在名称与指定 object-template 的名称相同的对象。模板中的其它字段是对象中存在的子集。

mustnothave:具有相同名称或标签的对象不能存在,需要删除,而不管规格或规则是什么。

spec.evaluationInterval.compliant

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

spec.evaluationInterval.noncompliant

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

请参阅 CM-Configuration-Management 目录获取使用NIST Special Publication 800-53 (Rev. 4) 的,被 Red Hat Advanced Cluster Management 支持的策略示例。了解策略如何应用到您的 hub 集群,请参阅支持的策略以了解更多详细信息。

了解如何创建和自定义策略,请参阅管理安全策略。有关控制器的详情,请参阅策略控制器

2.3.2. 证书策略控制器

证书策略控制器可以用来检测快要到期的证书,并检测时间太长(小时)或包含无法与指定模式匹配的 DNS 名称。

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

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

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

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

证书策略控制器是在受管集群上创建的。控制器与本地 Kubernetes API 服务器通信,以获取包含证书的 secret 列表,并确定所有不合规的证书。有关 CRD 的更多信息,请参阅使用 CustomResourceDefinitions 扩展 Kubernetes API

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

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

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

apiVersion: policy.open-cluster-management.io/v1
kind: CertificatePolicy
metadata:
  name: certificate-policy-example
  namespace:
  labels: category=system-and-information-integrity
spec:
  namespaceSelector:
    include: ["default"]
  remediationAction:
  severity:
  minimumDuration:
  minimumCADuration:
  maximumDuration:
  maximumCADuration:
  allowedSANPattern:
  disallowedSANPattern:
Copy to Clipboard Toggle word wrap
2.3.2.1.1. 证书策略控制器 YAML 表
Expand
表 2.2. 参数表
字段描述

apiVersion

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

kind

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

metadata.name

必需。用于标识策略的名称。

metadata.namespace

必需。创建了策略的受管集群内命名空间。

metadata.labels

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

spec

必需。有关要监控和刷新哪些证书的规格。

spec.namespaceSelector

必需。要将策略应用到的受管集群命名空间。输入 IncludeExclude 的参数值。备注:

• 当您创建多个证书策略并将其应用到同一受管集群时,必须为每个策略 namespaceSelector 分配一个不同的值。

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

spec.remediationAction

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

spec.severity

可选。当策略不合规时,会告知用户的严重性。使用以下参数值: lowmediumhigh

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.3. IAM 策略控制器

Identity and Access Management (IAM) 策略控制器可以用来接收有关不合规的 IAM 策略的通知。合规性检查是基于您在 IAM 策略中配置的参数。

IAM 策略控制器监控集群中具有特定集群角色(例如 ClusterRole)所需的最大数量用户数。要监控的默认集群角色是 cluster-admin。IAM 策略控制器与本地 Kubernetes API 服务器通信。如需更多信息,请参阅使用 CustomResourceDefinitions 扩展 Kubernetes API

IAM 策略控制器在您的受管集群上运行。查看以下部分以了解更多信息:

2.3.3.1. IAM 策略 YAML 结构

查看 IAM 策略的以下示例,并查看 YAML 表中的参数:

apiVersion: policy.open-cluster-management.io/v1
kind: IamPolicy
metadata:
  name:
spec:
  clusterRole:
  severity:
  remediationAction:
  maxClusterRoleBindingUsers:
  ignoreClusterRoleBindings:
Copy to Clipboard Toggle word wrap

2.3.3.2. IAM 策略 YAML 表

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

Expand
表 2.3. 参数表
字段描述

apiVersion

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

kind

必需。将值设为 Policy 以表示策略类型。

metadata.name

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

spec

必需。添加策略的配置详情。

spec.clusterRole

可选。要监控的集群角色(如 ClusterRole)。如果没有指定,则默认为 cluster-admin

spec.severity

可选。当策略不合规时,会告知用户的严重性。使用以下参数值: lowmediumhigh

spec.remediationAction

可选。指定您的策略的修复。输入 inform

spec.ignoreClusterRoleBindings

可选。正则表达式(regex)值列表,指示要忽略的集群角色绑定名称。这些正则表达式值必须遵循 Go regexp 语法。默认情况下,所有具有以 system: 开头的名称的集群角色绑定都将被忽略。建议将其设置为更严格的值。要不忽略任何集群角色绑定名称,请将列表设置为单个值 .^ 或一些永不匹配的其他正则表达式。

spec.maxClusterRoleBindingUsers

必需。在策略被视为不合规前可用的 IAM rolebinding 的最大数量。

2.3.3.3. IAM 策略示例

请参阅 policy-limitclusteradmin.yaml 查看 IAM 策略示例。如需更多信息,请参阅管理安全策略

如需更多主题,请参阅策略控制器

2.3.4. 策略控制器

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

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

注: Red Hat Advanced Cluster Management 强化示例策略集使用集群放置。如果使用集群放置,请将包含策略的命名空间绑定到受管集群集。有关使用集群放置的详情,请参阅在集群中部署策略

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

2.3.4.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: apps.open-cluster-management.io
  kind: PlacementRule
  name: demo-policyset-pr
subjects:
- apiGroup: policy.open-cluster-management.io
  kind: PolicySet
  name: demo-policyset
---
apiVersion: apps.open-cluster-management.io
kind: PlacementRule
metadata:
  name: demo-policyset-pr
spec:
  clusterConditions:pagewidth:
  - status: "True"
    type: ManagedCLusterConditionAvailable
  clusterSelectors:
    matchExpressions:
      - key: name
        operator: In
        values:
          - local-cluster
Copy to Clipboard Toggle word wrap

2.3.4.2. 策略设置表

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

Expand
表 2.4. 参数表
字段描述

apiVersion

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

kind

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

metadata.name

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

spec

必需。添加策略的配置详情。

spec.policies

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

2.3.4.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
    placementRule: placement1
    policySet: policyset-ps
Copy to Clipboard Toggle word wrap

请参阅管理安全策略部分中的创建策略部分。另外,查看 stable PolicySets,它要求策略生成器用于部署,PolicySets- Stable。请参阅策略生成器文档。

2.3.5. 创建自定义策略控制器(已弃用)

了解如何编写、应用、查看和更新您的自定义策略控制器。您可以为策略控制器创建 YAML 文件,以部署到集群中。查看以下部分以创建策略控制器:

2.3.5.1. 编写一个策略控制器

使用位于 Govern-policy-framework 存储库中的策略控制器框架。完成以下步骤来创建策略控制器:

  1. 运行以下命令克隆 governance-policy-framework 存储库:

    git clone git@github.com:stolostron/governance-policy-framework.git
    Copy to Clipboard Toggle word wrap
  2. 通过更新策略模式定义自定义控制器策略。您的策略可能类似以下内容:

    metadata:
      name: samplepolicies.policies.open-cluster-management.io
    spec:
      group: policy.open-cluster-management.io
      names:
        kind: SamplePolicy
        listKind: SamplePolicyList
        plural: samplepolicies
        singular: samplepolicy
    Copy to Clipboard Toggle word wrap
  3. 更新策略控制器以监视 SamplePolicy kind。运行以下命令:

    for file in $(find . -name "*.go" -type f); do  sed -i "" "s/SamplePolicy/g" $file; done
    for file in $(find . -name "*.go" -type f); do  sed -i "" "s/samplepolicy-controller/samplepolicy-controller/g" $file; done
    Copy to Clipboard Toggle word wrap
  4. 通过完成以下步骤重新编译并运行策略控制器:

    1. 登录到您的集群。
    2. 选择用户图标,然后点击 Configure client
    3. 将配置信息复制并粘贴到您的命令行中,然后按 Enter 键。
    4. 运行以下命令以应用您的策略 CRD 并启动控制器:

      export GO111MODULE=on
      
      kubectl apply -f deploy/crds/policy.open-cluster-management.io_samplepolicies_crd.yaml
      
      export WATCH_NAMESPACE=<cluster_namespace_on_hub>
      
      go run cmd/manager/main.go
      Copy to Clipboard Toggle word wrap

      您可能会收到以下输出来表示控制器在运行:

      {“level”:”info”,”ts”:1578503280.511274,”logger”:”controller-runtime.manager”,”msg”:”starting metrics server”,”path”:”/metrics”}
      {“level”:”info”,”ts”:1578503281.215883,”logger”:”controller-runtime.controller”,”msg”:”Starting Controller”,”controller”:”samplepolicy-controller”}
      {“level”:”info”,”ts”:1578503281.3203468,”logger”:”controller-runtime.controller”,”msg”:”Starting workers”,”controller”:”samplepolicy-controller”,”worker count”:1}
      Waiting for policies to be available for processing…
      Copy to Clipboard Toggle word wrap
    5. 创建策略,验证控制器是否已检索策略,并在集群中应用策略。运行以下命令:

      kubectl apply -f deploy/crds/policy.open-cluster-management.io_samplepolicies_crd.yaml
      Copy to Clipboard Toggle word wrap

      应用策略时,会出现一条消息来指示您的自定义控制器监控并检测到策略。这个信息可能类似以下内容:

    {"level":"info","ts":1578503685.643426,"logger":"controller_samplepolicy","msg":"Reconciling SamplePolicy","Request.Namespace":"default","Request.Name":"example-samplepolicy"}
    {"level":"info","ts":1578503685.855259,"logger":"controller_samplepolicy","msg":"Reconciling SamplePolicy","Request.Namespace":"default","Request.Name":"example-samplepolicy"}
    Available policies in namespaces:
    namespace = kube-public; policy = example-samplepolicy
    namespace = default; policy = example-samplepolicy
    namespace = kube-node-lease; policy = example-samplepolicy
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令,检查 status 字段中的合规详情:

    kubectl describe SamplePolicy example-samplepolicy -n default
    Copy to Clipboard Toggle word wrap

    您的输出可能类似以下内容:

    status:
      compliancyDetails:
        example-samplepolicy:
          cluster-wide:
          - 5 violations detected in namespace `cluster-wide`, there are 0 users violations
            and 5 groups violations
          default:
          - 0 violations detected in namespace `default`, there are 0 users violations
            and 0 groups violations
          kube-node-lease:
          - 0 violations detected in namespace `kube-node-lease`, there are 0 users violations
            and 0 groups violations
          kube-public:
          - 1 violations detected in namespace `kube-public`, there are 0 users violations
            and 1 groups violations
      compliant: NonCompliant
    Copy to Clipboard Toggle word wrap
  6. 更改策略规则和策略逻辑,为您的策略控制器引入新规则。完成以下步骤:

    1. 通过更新 SamplePolicySpec 在 YAML 文件中添加新字段 。您的规格应该和以下类似:

      spec:
        description: SamplePolicySpec defines the desired state of SamplePolicy
        properties:
          labelSelector:
            additionalProperties:
              type: string
            type: object
          maxClusterRoleBindingGroups:
            type: integer
          maxClusterRoleBindingUsers:
            type: integer
          maxRoleBindingGroupsPerNamespace:
            type: integer
          maxRoleBindingUsersPerNamespace:
            type: integer
      Copy to Clipboard Toggle word wrap
    2. 使用新字段在 samplepolicy_controller.go 中更新 SamplePolicySpec 的数据结构。
    3. 使用新的路径更新 samplepolicy_controller.go 文件中的 PeriodicallyExecSamplePolicies 函数来运行策略控制器。查看 PeriodicallyExecSamplePolicies 字段的示例,请参阅 stolostron/multicloud-operators-policy-controller
    4. 重新编译并运行策略控制器。请参阅编写策略控制器

您的策略控制器可以正常工作。

2.3.5.2. 将控制器部署到集群中

将自定义策略控制器部署到集群,并将策略控制器与监管仪表板集成。完成以下步骤:

  1. 运行以下命令构建策略控制器镜像:

    make build
    docker build . -f build/Dockerfile -t <username>/multicloud-operators-policy-controller:latest
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令将镜像推送到您选择的仓库中。例如,运行以下命令将镜像 push 到 Docker Hub:

    docker login
    
    docker push <username>/multicloud-operators-policy-controller
    Copy to Clipboard Toggle word wrap
  3. 配置 kubectl 以指向由 Red Hat Advanced Cluster Management for Kubernetes 管理的集群。
  4. 替换 operator 清单以使用内置镜像名称,并更新命名空间以监视策略。命名空间必须是集群的命名空间。您的清单可能类似以下内容:

    sed -i "" 's|stolostron/multicloud-operators-policy-controller|ycao/multicloud-operators-policy-controller|g' deploy/operator.yaml
    sed -i "" 's|value: default|value: <namespace>|g' deploy/operator.yaml
    Copy to Clipboard Toggle word wrap
  5. 运行以下命令更新 RBAC 角色:

    sed -i "" 's|samplepolicies|testpolicies|g' deploy/cluster_role.yaml
    sed -i "" 's|namespace: default|namespace: <namespace>|g' deploy/cluster_role_binding.yaml
    Copy to Clipboard Toggle word wrap
  6. 将策略控制器部署到集群中:

    1. 运行以下命令为集群设置服务帐户:

      kubectl apply -f deploy/service_account.yaml -n <namespace>
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令来为 operator 创建 RBAC:

      kubectl apply -f deploy/role.yaml -n <namespace>
      
      kubectl apply -f deploy/role_binding.yaml -n <namespace>
      Copy to Clipboard Toggle word wrap
    3. 为您的策略控制器设置 RBAC。运行以下命令:

      kubectl apply -f deploy/cluster_role.yaml
      kubectl apply -f deploy/cluster_role_binding.yaml
      Copy to Clipboard Toggle word wrap
    4. 运行以下命令来设置自定义资源定义(CRD):

      kubectl apply -f deploy/crds/policies.open-cluster-management.io_samplepolicies_crd.yaml
      Copy to Clipboard Toggle word wrap
    5. 运行以下命令来部署 multicloud-operator-policy-controller:

      kubectl apply -f deploy/operator.yaml -n <namespace>
      Copy to Clipboard Toggle word wrap
    6. 运行以下命令验证控制器是否正常工作:

      kubectl get pod -n <namespace>
      Copy to Clipboard Toggle word wrap
  7. 您必须通过为控制器创建一个 策略模板 来集成您的策略控制器。如需更多信息,请参阅通过控制台创建集群安全策略
2.3.5.2.1. 扩展控制器部署

策略控制器部署不支持删除。您可以扩展部署,以更新部署应用到哪些 pod。完成以下步骤:

  1. 登录到受管集群。
  2. 导航到自定义策略控制器的部署。
  3. 扩展部署。当将部署扩展到零个 pod 时,策略控制程序部署将被禁用。

如需有关部署的更多信息,请参阅 OpenShift Container Platform 部署

您的策略控制器已部署并在集群中集成。如需更多信息,请参阅策略控制器

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat