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 结构 复制链接链接已复制到粘贴板!
2.3.1.2. 配置策略示例 复制链接链接已复制到粘贴板!
2.3.1.3. 配置策略 YAML 标 复制链接链接已复制到粘贴板!
字段 | 描述 |
---|---|
apiVersion |
必需。将值设置为 |
kind |
必需。将值设为 |
metadata.name | 必需。策略的名称。 |
spec | 必需。有关监控哪些配置策略以及如何进行修复的规格。 |
spec.namespace |
命名空间对象或资源是必需的。策略应用到的 hub 集群中的命名空间。至少为 |
spec.remediationAction |
必需。指定您的策略的修复。输入 |
spec.remediationAction.severity |
必需。当策略不合规时,指定严重性。使用以下参数值: |
spec.remediationAction.complianceType | 必需。用于列出必须被评估或应用到受管集群的角色的预期行为和任何 Kubernetes 对象。您必须使用以下操作动词作为参数值:
|
spec.evaluationInterval.compliant |
可选。用于定义策略处于合规状态时的评估频率。该值的格式必须是一个持续时间,它是带有时间单元后缀的数字序列。例如: |
spec.evaluationInterval.noncompliant |
可选。用于定义策略处于不合规状态时的频率。与 |
请参阅 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 表中的元素:
2.3.2.1.1. 证书策略控制器 YAML 表 复制链接链接已复制到粘贴板!
字段 | 描述 |
---|---|
apiVersion |
必需。将值设置为 |
kind |
必需。将值设为 |
metadata.name | 必需。用于标识策略的名称。 |
metadata.namespace | 必需。创建了策略的受管集群内命名空间。 |
metadata.labels |
可选。在证书策略中, |
spec | 必需。有关要监控和刷新哪些证书的规格。 |
spec.namespaceSelector |
必需。要将策略应用到的受管集群命名空间。输入
• 当您创建多个证书策略并将其应用到同一受管集群时,必须为每个策略
• 如果证书策略控制器的 |
spec.remediationAction |
必需。指定您的策略的修复。将参数值设置为 |
spec.severity |
可选。当策略不合规时,会告知用户的严重性。使用以下参数值: |
spec.minimumDuration |
必需。如果没有指定值,则默认为 |
spec.minimumCADuration |
可选。设定一个与其他证书不同的值来标识可能很快过期的签名证书。如果没有指定参数值,则 CA 证书过期时间作为 |
spec.maximumDuration | 可选。指定一个值来标识创建的时间超过您所期望的限制值的证书。参数使用 Golang 的持续时间格式。如需更多信息,请参阅 Golang 解析持续时间。 |
spec.maximumCADuration | 可选。创建一个值来标识创建的时间超过您定义的限制值的签名的证书。参数使用 Golang 的持续时间格式。如需更多信息,请参阅 Golang 解析持续时间。 |
spec.allowedSANPattern | 可选。正则表达式,必须与您证书中定义的每个 SAN 条目匹配。这个参数会根据特征检查 DNS 名称。如需更多信息,请参阅 Golang 郑则表达式语法。 |
spec.disallowedSANPattern |
可选。正则表达式,不能与证书中定义的任何 SAN 条目匹配。这个参数根据模式检查 DNS 名称。 如需更多信息,请参阅 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 表中的参数:
2.3.3.2. IAM 策略 YAML 表 复制链接链接已复制到粘贴板!
查看以下参数表以获详细信息:
字段 | 描述 |
---|---|
apiVersion |
必需。将值设置为 |
kind |
必需。将值设为 |
metadata.name | 必需。用于标识策略资源的名称。 |
spec | 必需。添加策略的配置详情。 |
spec.clusterRole |
可选。要监控的集群角色(如 |
spec.severity |
可选。当策略不合规时,会告知用户的严重性。使用以下参数值: |
spec.remediationAction |
可选。指定您的策略的修复。输入 |
spec.ignoreClusterRoleBindings |
可选。正则表达式(regex)值列表,指示要忽略的集群角色绑定名称。这些正则表达式值必须遵循 Go regexp 语法。默认情况下,所有具有以 |
spec.maxClusterRoleBindingUsers | 必需。在策略被视为不合规前可用的 IAM rolebinding 的最大数量。 |
2.3.3.3. IAM 策略示例 复制链接链接已复制到粘贴板!
请参阅 policy-limitclusteradmin.yaml
查看 IAM 策略示例。如需更多信息,请参阅管理安全策略。
如需更多主题,请参阅策略控制器。
2.3.4. 策略控制器 复制链接链接已复制到粘贴板!
策略控制器将策略状态范围聚合到同一命名空间中定义的策略。创建策略集合(PolicySet
),以对同一命名空间中的策略进行分组。PolicySet
中的所有策略都放在选定集群中,方法是创建一个 PlacementBinding
来绑定 PolicySet
和 Placement
。策略集已部署到 hub 集群。
另外,当策略是多个策略集的一部分时,现有和新的 Placement
资源保留在策略中。当用户从策略集合中删除策略时,策略不会应用到在策略集合中选择的集群,但放置会保留。策略控制器只检查包括策略设置放置的集群中的违反情况。
注: Red Hat Advanced Cluster Management 强化示例策略集使用集群放置。如果使用集群放置,请将包含策略的命名空间绑定到受管集群集。有关使用集群放置的详情,请参阅在集群中部署策略。
在以下部分了解更多有关策略设置结构的详细信息:
2.3.4.1. 策略设置 YAML 结构 复制链接链接已复制到粘贴板!
您的策略集可能类似以下 YAML 文件:
2.3.4.2. 策略设置表 复制链接链接已复制到粘贴板!
查看以下参数表以获详细信息:
字段 | 描述 |
---|---|
apiVersion |
必需。将值设为 |
kind |
必需。将值设为 |
metadata.name | 必需。用于标识策略资源的名称。 |
spec | 必需。添加策略的配置详情。 |
spec.policies | 可选。要在策略集合中分组的策略列表。 |
2.3.4.3. 策略示例 复制链接链接已复制到粘贴板!
请参阅管理安全策略部分中的创建策略部分。另外,查看 stable PolicySets
,它要求策略生成器用于部署,PolicySets- Stable。请参阅策略生成器文档。
2.3.5. 创建自定义策略控制器(已弃用) 复制链接链接已复制到粘贴板!
了解如何编写、应用、查看和更新您的自定义策略控制器。您可以为策略控制器创建 YAML 文件,以部署到集群中。查看以下部分以创建策略控制器:
2.3.5.1. 编写一个策略控制器 复制链接链接已复制到粘贴板!
使用位于 Govern-policy-framework
存储库中的策略控制器框架。完成以下步骤来创建策略控制器:
运行以下命令克隆
governance-policy-framework
存储库:git clone git@github.com:stolostron/governance-policy-framework.git
git clone git@github.com:stolostron/governance-policy-framework.git
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过更新策略模式定义自定义控制器策略。您的策略可能类似以下内容:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更新策略控制器以监视
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
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 Copied! Toggle word wrap Toggle overflow 通过完成以下步骤重新编译并运行策略控制器:
- 登录到您的集群。
- 选择用户图标,然后点击 Configure client。
- 将配置信息复制并粘贴到您的命令行中,然后按 Enter 键。
运行以下命令以应用您的策略 CRD 并启动控制器:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可能会收到以下输出来表示控制器在运行:
{“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…
{“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 Copied! Toggle word wrap Toggle overflow 创建策略,验证控制器是否已检索策略,并在集群中应用策略。运行以下命令:
kubectl apply -f deploy/crds/policy.open-cluster-management.io_samplepolicies_crd.yaml
kubectl apply -f deploy/crds/policy.open-cluster-management.io_samplepolicies_crd.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 应用策略时,会出现一条消息来指示您的自定义控制器监控并检测到策略。这个信息可能类似以下内容:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,检查
status
字段中的合规详情:kubectl describe SamplePolicy example-samplepolicy -n default
kubectl describe SamplePolicy example-samplepolicy -n default
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您的输出可能类似以下内容:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 更改策略规则和策略逻辑,为您的策略控制器引入新规则。完成以下步骤:
通过更新
SamplePolicySpec
在 YAML 文件中添加新字段 。您的规格应该和以下类似:Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
使用新字段在 samplepolicy_controller.go 中更新
SamplePolicySpec
的数据结构。 -
使用新的路径更新
samplepolicy_controller.go
文件中的PeriodicallyExecSamplePolicies
函数来运行策略控制器。查看PeriodicallyExecSamplePolicies
字段的示例,请参阅 stolostron/multicloud-operators-policy-controller。 - 重新编译并运行策略控制器。请参阅编写策略控制器
您的策略控制器可以正常工作。
2.3.5.2. 将控制器部署到集群中 复制链接链接已复制到粘贴板!
将自定义策略控制器部署到集群,并将策略控制器与监管仪表板集成。完成以下步骤:
运行以下命令构建策略控制器镜像:
make build docker build . -f build/Dockerfile -t <username>/multicloud-operators-policy-controller:latest
make build docker build . -f build/Dockerfile -t <username>/multicloud-operators-policy-controller:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令将镜像推送到您选择的仓库中。例如,运行以下命令将镜像 push 到 Docker Hub:
docker login docker push <username>/multicloud-operators-policy-controller
docker login docker push <username>/multicloud-operators-policy-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
配置
kubectl
以指向由 Red Hat Advanced Cluster Management for Kubernetes 管理的集群。 替换 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
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 Copied! Toggle word wrap Toggle overflow 运行以下命令更新 RBAC 角色:
sed -i "" 's|samplepolicies|testpolicies|g' deploy/cluster_role.yaml sed -i "" 's|namespace: default|namespace: <namespace>|g' deploy/cluster_role_binding.yaml
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 Copied! Toggle word wrap Toggle overflow 将策略控制器部署到集群中:
运行以下命令为集群设置服务帐户:
kubectl apply -f deploy/service_account.yaml -n <namespace>
kubectl apply -f deploy/service_account.yaml -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来为 operator 创建 RBAC:
kubectl apply -f deploy/role.yaml -n <namespace> kubectl apply -f deploy/role_binding.yaml -n <namespace>
kubectl apply -f deploy/role.yaml -n <namespace> kubectl apply -f deploy/role_binding.yaml -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为您的策略控制器设置 RBAC。运行以下命令:
kubectl apply -f deploy/cluster_role.yaml kubectl apply -f deploy/cluster_role_binding.yaml
kubectl apply -f deploy/cluster_role.yaml kubectl apply -f deploy/cluster_role_binding.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来设置自定义资源定义(CRD):
kubectl apply -f deploy/crds/policies.open-cluster-management.io_samplepolicies_crd.yaml
kubectl apply -f deploy/crds/policies.open-cluster-management.io_samplepolicies_crd.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来部署
multicloud-operator-policy-controller
:kubectl apply -f deploy/operator.yaml -n <namespace>
kubectl apply -f deploy/operator.yaml -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令验证控制器是否正常工作:
kubectl get pod -n <namespace>
kubectl get pod -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
您必须通过为控制器创建一个
策略模板
来集成您的策略控制器。如需更多信息,请参阅通过控制台创建集群安全策略。
2.3.5.2.1. 扩展控制器部署 复制链接链接已复制到粘贴板!
策略控制器部署不支持删除。您可以扩展部署,以更新部署应用到哪些 pod。完成以下步骤:
- 登录到受管集群。
- 导航到自定义策略控制器的部署。
- 扩展部署。当将部署扩展到零个 pod 时,策略控制程序部署将被禁用。
如需有关部署的更多信息,请参阅 OpenShift Container Platform 部署。
您的策略控制器已部署并在集群中集成。如需更多信息,请参阅策略控制器。