2.5. 策略合规历史记录(技术预览)
如果您希望以可查询的格式进行 Red Hat Advanced Cluster Management for Kubernetes 策略合规事件的长期存储,策略合规历史记录 API 是一个可选的技术预览功能。您可以使用 API 获取其他详情,如 spec
字段审核并排除您的策略,并在策略从集群中删除或从集群中删除时获取合规事件。策略合规历史记录 API 也可以生成以逗号分隔的策略合规事件表,以帮助您进行审计和故障排除。
策略合规历史记录 API 也可以生成以逗号分隔的值(CSV)电子表格,以进行进一步审核和故障排除。
2.5.1. 先决条件
策略合规历史记录 API 需要版本 13 或更高版本的 PostgreSQL 服务器。
有些红帽支持的选项包括使用
registry.redhat.io/rhel9/postgresql-15
容器镜像、registry.redhat.io/rhel8/postgresql-13
容器镜像、postgresql-server
RPM 或postgresql/server
模块。有关设置和配置您选择的路径,请查看相关的官方红帽文档。策略合规历史记录 API 与任何标准 PostgreSQL 兼容,不仅限于官方红帽支持的产品。- 此 PostgreSQL 服务器必须可从 Red Hat Advanced Cluster Management hub 集群访问。如果 PostgreSQL 服务器在 hub 集群外部运行,请确保路由和防火墙配置允许 hub 集群连接到 PostgreSQL 服务器的端口 5432。如果在 PostgreSQL 配置中被覆盖,此端口可能是不同的值。
2.5.2. 启用合规性历史记录 API
配置受管集群,将策略合规事件记录到 API。您可以在所有集群或集群子集中启用它。完成以下步骤:
将 PostgreSQL 服务器配置为集群管理员。如果您在 Red Hat Advanced Cluster Management hub 集群中部署了 PostgreSQL,则临时端口转发 PostgreSQL 端口以使用
psql
命令。运行以下命令:oc -n <PostgreSQL namespace> port-forward <PostgreSQL pod name> 5432:5432
在不同的终端中,在本地连接到 PostgreSQL 服务器,使用以下命令:
psql 'postgres://postgres:@127.0.0.1:5432/postgres'
使用以下 SQL 语句为您的 Red Hat Advanced Cluster Management hub 集群创建用户和数据库:
CREATE USER "rhacm-policy-compliance-history" WITH PASSWORD '<replace with password>'; CREATE DATABASE "rhacm-policy-compliance-history" WITH OWNER="rhacm-policy-compliance-history";
创建
governance-policy-database
Secret
资源,将此数据库用于策略合规历史记录 API。运行以下命令:oc -n open-cluster-management create secret generic governance-policy-database \ 1 --from-literal="user=rhacm-policy-compliance-history" \ --from-literal="password=rhacm-policy-compliance-history" \ --from-literal="host=<replace with host name of the Postgres server>" \ 2 --from-literal="dbname=ocm-compliance-history" \ --from-literal="sslmode=verify-full" \ --from-file="ca=<replace>" 3
- 1
- 添加安装 Red Hat Advanced Cluster Management 的命名空间。默认情况下,Red Hat Advanced Cluster Management 安装在
open-cluster-management
命名空间中。 - 2
- 添加 PostgresQL 服务器的主机名。如果您在 Red Hat Advanced Cluster Management hub 集群中部署了 PostgreSQL 服务器,且没有在集群外公开,您可以将
Service
对象用于主机值。格式为 <service name>.<namespace>.svc
。请注意,此方法取决于 Red Hat Advanced Cluster Management hub 集群的网络策略。 - 3
- 您必须在为 PostgreSQL 服务器的 TLS 证书签名的
ca
data 字段中指定证书颁发机构证书文件。如果没有提供这个值,您必须相应地更改 sslmode 值,但不推荐这样做,因为它降低了数据库连接的安全性。
添加
cluster.open-cluster-management.io/backup
标签,以备份 Red Hat Advanced Cluster Management hub 集群恢复操作的Secret
资源。运行以下命令:oc -n open-cluster-management label secret governance-policy-database cluster.open-cluster-management.io/backup=""
对于 PostgreSQL 连接的更多自定义,请直接使用
connectionURL
data 字段,并以 PostgreSQL 连接 URI 格式提供值。密码中的特殊字符必须采用 URL 编码。一个选项是使用 Python 来生成密码的 URL 编码格式。例如,如果密码是$uper<Secr&t%
>,请运行以下 Python 命令获取输出%24uper%3CSecr%26t%25%3E
:python -c 'import urllib.parse; import sys; print(urllib.parse.quote(sys.argv[1]))' '$uper<Secr&t%>'
在创建
governance-policy-database
Secret
后,运行 命令以测试策略合规历史记录 API。OpenShiftRoute
对象会自动在同一命名空间中创建。如果 Red Hat Advanced Cluster Management hub 集群上的路由没有使用可信证书,您可以选择在 curl 命令中提供-k
标志来跳过 TLS 验证,但不建议这样做:curl -H "Authorization: Bearer $(oc whoami --show-token)" \ "https://$(oc -n open-cluster-management get route governance-history-api -o jsonpath='{.spec.host}')/api/v1/compliance-events"
如果成功,curl 命令会返回类似如下的值:
{"data":[],"metadata":{"page":1,"pages":0,"per_page":20,"total":0}}
如果它不成功,则 curl 命令可能会返回这两个消息之一:
{"message":"The database is unavailable"}
{"message":"Internal Error"}
如果您收到消息,使用以下命令查看
open-cluster-management
命名空间中的 Kubernetes 事件:oc -n open-cluster-management get events --field-selector reason=OCMComplianceEventsDBError
如果您从事件收到说明来查看
governance-policy-propagator
日志,请运行以下命令:oc -n open-cluster-management logs -l name=governance-policy-propagator -f
您可能会收到一条错误消息,指示用户、密码或数据库被错误指定。请参见以下消息示例:
2024-03-05T12:17:14.500-0500 info compliance-events-api complianceeventsapi/complianceeventsapi_controller.go:261 The database connection failed: pq: password authentication failed for user "rhacm-policy-compliance-history"
-
使用以下命令更新
governance-policy-database
Secret
资源,使其包含正确的 PostgreSQL 连接设置:
oc -n open-cluster-management edit secret governance-policy-database
2.5.3. 设置合规性历史记录 API URL
设置策略合规历史记录 API URL,以在受管集群上启用该功能。完成以下步骤:
使用以下命令检索策略合规历史记录 API 的外部 URL:
echo "https://$(oc -n open-cluster-management get route governance-history-api -o=jsonpath='{.spec.host}')"
输出可能类似以下信息,以及 Red Hat Advanced Cluster Management hub 集群的域名:
https://governance-history-api-open-cluster-management.apps.openshift.redhat.com
创建一个类似以下示例的
AddOnDeploymentConfig
对象:apiVersion: addon.open-cluster-management.io/v1alpha1 kind: AddOnDeploymentConfig metadata: name: governance-policy-framework namespace: open-cluster-management spec: customizedVariables: - name: complianceHistoryAPIURL value: <replace with URL from previous command>
-
将
value
参数值替换为您的合规性历史记录外部 URL。
-
将
2.5.3.1. 在所有受管集群中启用
在所有受管集群中启用合规历史记录 API,以记录来自受管集群的合规事件。完成以下步骤:
将
governance-policy-framework
ClusterManagementAddOn
对象配置为使用以下命令使用AddOnDeploymentConfig
:oc edit ClusterManagementAddOn governance-policy-framework
添加或更新
spec.supportedConfigs
数组。您的资源可能有以下配置:- group: addon.open-cluster-management.io resource: addondeploymentconfigs defaultConfig: name: governance-policy-framework namespace: open-cluster-management
2.5.3.2. 启用单个受管集群
在单一受管集群中启用合规历史记录 API,以记录来自受管集群的合规事件。完成以下步骤:
在受管集群命名空间中配置
governance-policy-framework
ManagedClusterAddOn
资源。使用以下命令,从 Red Hat Advanced Cluster Management hub 集群中运行以下命令:oc -n <manage-cluster-namespace> edit ManagedClusterAddOn governance-policy-framework
-
将 &
lt;manage-cluster-namespace
> 占位符替换为您要启用的受管集群名称。
-
将 &
添加或更新
spec.configs
数组,使其具有类似以下示例的条目:- group: addon.open-cluster-management.io resource: addondeploymentconfigs name: governance-policy-framework namespace: open-cluster-management
要验证配置,请确认受管集群上的部署是否使用
--compliance-api-url
容器参数。运行以下命令:oc -n open-cluster-management-agent-addon get deployment governance-policy-framework -o jsonpath='{.spec.template.spec.containers[1].args}'
输出可能类似以下:
["--enable-lease=true","--hub-cluster-configfile=/var/run/klusterlet/kubeconfig","--leader-elect=false","--log-encoder=console","--log-level=0","--v=-1","--evaluation-concurrency=2","--client-max-qps=30","--client-burst=45","--disable-spec-sync=true","--cluster-namespace=local-cluster","--compliance-api-url=https://governance-history-api-open-cluster-management.apps.openshift.redhat.com"]
任何新的策略合规事件都会记录在策略合规历史记录 API 中。
如果没有为特定受管集群记录策略合规事件,请查看受影响受管集群中的
governance-policy-framework
日志:oc -n open-cluster-management-agent-addon logs deployment/governance-policy-framework -f
此时会显示类似以下消息的日志消息。如果
消息
值为空,策略合规历史记录 API URL 不正确,或者存在网络通信问题:024-03-05T19:28:38.063Z info policy-status-sync statussync/policy_status_sync.go:750 Failed to record the compliance event with the compliance API. Will requeue. {"statusCode": 503, "message": ""}
如果策略合规历史记录 API URL 不正确,使用以下命令编辑 hub 集群上的 URL:
oc -n open-cluster-management edit AddOnDeploymentConfig governance-policy-framework
注: 如果遇到网络通信问题,您必须根据网络基础架构诊断问题。