12.3. 创建集群镜像策略 CR
ClusterImagePolicy 自定义资源(CR)可让集群管理员为整个集群配置 sigstore 签名验证策略。启用后,Machine Config Operator (MCO)会监控 ClusterImagePolicy 对象,并更新集群中所有节点上的 /etc/containers/policy.json 和 /etc/containers/registries.d/sigstore-registries.yaml 文件。
以下示例显示了如何配置 ClusterImagePolicy 对象的一般准则。有关参数的详情,请参阅"关于集群和镜像策略参数"。
默认 openshift 集群镜像策略为所需的 OpenShift Container Platform 镜像提供 sigstore 支持。此集群镜像策略只在启用了技术预览功能的集群中处于活跃状态。您不能删除或修改此集群镜像策略对象。以 openshift 开头的集群镜像策略名称保留给未来系统使用。
默认 openshift 集群镜像策略只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
先决条件
- 您有一个 sigstore 支持的公钥基础架构(PKI)密钥、自带公钥基础架构(BYOPKI)证书或提供 Cosign 公钥和私钥对,用于签名操作。
- 您有一个签名过程来为您的镜像签名。
- 如果使用 Cosign 签名,您可以访问支持 Cosign 签名的 registry。
如果为 OpenShift Container Platform 发行版本镜像存储库配置了 registry 镜像,则
quay.io/openshift-release-dev/ocp-release和quay.io/openshift-release-dev/ocp-v4.0-art-dev,在启用技术预览功能集前,您必须将 OpenShift Container Platform 发行镜像的 sigstore 签名镜像(mirror)到镜像 registry 中。否则,默认的openshift集群镜像策略(对发行版本存储库强制执行签名验证)会阻止 Cluster Version Operator 将 CVO pod 移到新节点,防止节点从功能集更改。您可以使用
oc image mirror命令来镜像签名。例如:oc image mirror quay.io/openshift-release-dev/ocp-release:sha256-1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef.sig \ mirror.com/image/repo:sha256-1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef.sig
$ oc image mirror quay.io/openshift-release-dev/ocp-release:sha256-1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef.sig \ mirror.com/image/repo:sha256-1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef.sigCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用 BYOPKI 证书作为信任的根目录,您可以通过编辑名为
cluster的FeatureGateCR 为集群启用所需的技术预览功能:oc edit featuregate cluster
$ oc edit featuregate clusterCopy to Clipboard Copied! Toggle word wrap Toggle overflow FeatureGateCR 示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 启用所需的
SigstoreImageVerificationPKI功能。
警告在集群中启用
TechPreviewNoUpgrade功能集无法撤消,并会阻止次版本更新。此功能集允许您在测试集群中启用这些技术预览功能,您可以在测试集群中完全测试它们。不要在生产环境集群中启用此功能。
流程
创建类似以下示例的集群镜像策略对象。有关这些参数的具体详情,请参阅"关于镜像策略参数"。
带有公钥策略和
MatchRepoDigestOrExact匹配策略的集群镜像策略对象示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 创建
ClusterImagePolicy对象。 - 2
- 定义分配给此策略的存储库或镜像列表。在集群镜像策略中,确保策略不会阻止在
quay.io/openshift-release-dev/ocp-release和quay.io/openshift-release-dev/ocp-v4.0-dev/ocp-v4.0-art-dev仓库中部署 OpenShift Container Platform 镜像。集群操作需要这些软件仓库中的镜像。 - 3
- 指定定义如何验证镜像的参数。
- 4
- 定义策略的信任根。
- 5
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 Fulcio 证书。这个示例使用带有 Rekor 验证的公钥。
- 6
- 对于公钥策略,以 PEM 格式指定 base64 编码的公钥。最大长度为 8192 个字符。
- 7
- 可选:以 PEM 格式指定 base64 编码的 Rekor 公钥。最大长度为 8192 个字符。
- 8
- 可选:指定以下进程之一来验证签名中的身份和实际镜像身份:
-
MatchRepoDigestOrExact. -
MatchRepository. -
ExactRepository.必须指定exactRepository参数。 -
RemapIdentity。必须指定prefix和signedPrefix参数。
-
BYOPKI 策略和
MatchRepository匹配策略的集群镜像策略对象示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 创建
ClusterImagePolicy对象。 - 2
- 定义分配给此策略的存储库或镜像列表。在集群镜像策略中,确保策略不会阻止在
quay.io/openshift-release-dev/ocp-release和quay.io/openshift-release-dev/ocp-v4.0-dev/ocp-v4.0-art-dev仓库中部署 OpenShift Container Platform 镜像。集群操作需要这些软件仓库中的镜像。 - 3
- 指定定义如何验证镜像的参数。
- 4
- 定义策略的信任根。
- 5
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 Fulcio 证书。这个示例使用 BYOPKI 证书。
- 6
- 对于 BYOPKI 证书,指定
caRootsData。这个参数以 PEM 格式指定 base64 编码的 CA root 证书。最大长度为 8192 个字符。(可选)使用caIntermediatesData,以 PEM 格式指定 base64 编码的中间 CA root 证书。最大长度为 8192 个字符。 - 7
- 指定主题备用名称(SAN),来使用主机名和电子邮件地址验证用户身份:
-
电子邮件.指定在生成证书时指定的电子邮件地址。 -
主机名.指定生成证书时指定的主机名。
-
- 8
- 对于 BYOPKI 证书,请指定
MatchRepository参数,以验证签名中的身份和实际镜像身份。默认签名身份为matchRepoDigestOrExact,它需要签名身份中的摘要引用进行验证。在这种情况下,签名身份使用存储库引用,不包括镜像摘要。
带有 Fulcio 证书策略和
remapIdentity匹配策略的集群镜像策略对象示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 创建
ClusterImagePolicy对象。 - 2
- 定义分配给此策略的存储库或镜像列表。在集群镜像策略中,确保策略不会阻止在
quay.io/openshift-release-dev/ocp-release和quay.io/openshift-release-dev/ocp-v4.0-dev/ocp-v4.0-art-dev仓库中部署 OpenShift Container Platform 镜像。集群操作需要这些软件仓库中的镜像。 - 3
- 指定定义如何验证镜像的参数。
- 4
- 定义策略的信任根。
- 5
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 Fulcio 证书。这个示例使用带有所需 Rekor 验证的 Fulcio 证书。
- 6
- 对于 Fulcio 证书策略,需要以下参数:
-
fulcioCAData: 指定 PEM 格式的 base64 编码的 Fulcio 证书。最大长度为 8192 个字符。 -
fulcioSubject:指定 OIDC 签发者和 Fulcio 身份验证配置的电子邮件。
-
- 7
- 以 PEM 格式指定一个 base64 编码的 Rekor 公钥。当
policyType是FulcioCAWithRekor时,需要此参数。最大长度为 8192 个字符。 - 8
- 可选:指定以下进程之一来验证签名中的身份和实际镜像身份。
-
MatchRepoDigestOrExact. -
MatchRepository. -
ExactRepository.必须指定exactRepository参数。 -
RemapIdentity。必须指定prefix和signedPrefix参数。
-
- 9
- 对于
remapIdentity匹配策略,请指定应与范围镜像前缀匹配的前缀。如果两个匹配项,则将有范围的镜像前缀替换为signedPrefix的值。最大长度为 512 个字符。 - 10
- 对于
remapIdentity匹配策略,请根据需要指定要重新映射的镜像前缀。最大长度为 512 个字符。
创建集群镜像策略对象:
oc create -f <file_name>.yaml
$ oc create -f <file_name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Machine Config Operator (MCO) 更新集群中的机器配置池 (MCP)。在应用更改时,每个节点上的调度会被禁用。
验证
更新集群中的节点后,您可以验证是否已配置了集群镜像策略:
运行以下命令,为节点启动 debug pod:
oc debug node/<node_name>
$ oc debug node/<node_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,将
/host设置为 debug shell 中的根目录:chroot /host/
sh-5.1# chroot /host/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令检查
policy.json文件:cat /etc/containers/policy.json
sh-5.1# cat /etc/containers/policy.jsonCopy to Clipboard Copied! Toggle word wrap Toggle overflow 带有显示新集群镜像策略的公钥的集群镜像策略对象的输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow BYOPKI 证书的集群镜像策略对象的输出示例,显示新的集群镜像策略
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 带有显示新集群镜像策略的 Fulcio 证书的集群镜像策略对象的输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令检查
sigstore-registries.yaml文件:cat /etc/containers/registries.d/sigstore-registries.yaml
sh-5.1# cat /etc/containers/registries.d/sigstore-registries.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 显示添加了范围 registry 的输出示例
docker: example.com: use-sigstore-attachments: true quay.io/openshift-release-dev/ocp-release: use-sigstore-attachments: truedocker: example.com: use-sigstore-attachments: true1 quay.io/openshift-release-dev/ocp-release: use-sigstore-attachments: trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为
true时,指定 sigstore 签名将与镜像一起读取。