9.2. 配置镜像 registry 设置
您可以通过编辑 image.config.openshift.io/cluster
自定义资源(CR)来配置镜像 registry 设置。当对 registry 的更改应用到 image.config.openshift.io/cluster
CR 时,Machine Config Operator (MCO) 执行以下顺序操作:
- 对节点进行 cordon 操作
- 通过重启 CRI-O 应用更改
取消记录节点
注意MCO 在检测到更改时不会重启节点。
流程
编辑
image.config.openshift.io/cluster
自定义资源:$ oc edit image.config.openshift.io/cluster
以下是
image.config.openshift.io/cluster
CR 示例:apiVersion: config.openshift.io/v1 kind: Image 1 metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: allowedRegistriesForImport: 2 - domainName: quay.io insecure: false additionalTrustedCA: 3 name: myconfigmap registrySources: 4 allowedRegistries: - example.com - quay.io - registry.redhat.io - image-registry.openshift-image-registry.svc:5000 - reg1.io/myrepo/myapp:latest insecureRegistries: - insecure.com status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
- 1
Image
:包含有关如何处理镜像的集群范围信息。规范且唯一有效的名称是cluster
。- 2
allowedRegistriesForImport
:限制普通用户可从中导入镜像的容器镜像 registry。将此列表设置为您信任包含有效镜像且希望应用程序能够从中导入的 registry。有权从 API 创建镜像或ImageStreamMappings
的用户不受此策略的影响。通常只有集群管理员具有适当权限。- 3
additionalTrustedCA
:引用包含镜像流导入、Pod 镜像拉取、openshift-image-registry
pullthrough 和构建期间受信任的额外证书颁发机构(CA)的配置映射。此配置映射的命名空间为openshift-config
。ConfigMap 的格式是使用 registry 主机名作为键,使用 PEM 证书作为值,用于每个要信任的额外 registry CA。- 4
registrySources
:包含用于决定容器运行时在访问构建和 pod 的镜像时是否允许或阻止个别 registry 的配置。可以设置allowedRegistries
参数或blockedRegistries
参数,但不能同时设置这两个参数。您还可以定义是否允许访问允许使用镜像短名称的不安全的 registry。本例使用allowedRegistries
参数,该参数定义允许使用的 registry。不安全 registryinsecure.com
也被允许。registrySources
参数不包含内部集群 registry 的配置。
注意当定义
allowedRegistries
参数时,除非明确列出,否则所有 registry (包括 registry.redhat.io 和 quay.io registry 和默认的 OpenShift 镜像 registry)都会被阻断。如果使用参数,为了避免 pod 失败,您必须将registry.redhat.io
和quay.io
registry 以及internalRegistryHostname
添加到allowedRegistries
列表中,因为环境中有效负载镜像需要它们。不要将registry.redhat.io
和quay.io
registry 添加到blockedRegistries
列表中。使用
allowedRegistries
、blockedRegistries
或insecureRegistries
参数时,您可以在 registry 中指定单独的存储库。例如:reg1.io/myrepo/myapp:latest
。应避免使用不安全的外部 registry,以减少可能的安全性风险。
要检查是否应用了更改,请列出您的节点:
$ oc get nodes
输出示例
NAME STATUS ROLES AGE VERSION ip-10-0-137-182.us-east-2.compute.internal Ready,SchedulingDisabled worker 65m v1.26.0 ip-10-0-139-120.us-east-2.compute.internal Ready,SchedulingDisabled control-plane 74m v1.26.0 ip-10-0-176-102.us-east-2.compute.internal Ready control-plane 75m v1.26.0 ip-10-0-188-96.us-east-2.compute.internal Ready worker 65m v1.26.0 ip-10-0-200-59.us-east-2.compute.internal Ready worker 63m v1.26.0 ip-10-0-223-123.us-east-2.compute.internal Ready control-plane 73m v1.26.0
9.2.1. 添加特定的 registry
您可以通过编辑 image.config.openshift.io/cluster
自定义资源(CR)在 registry 中添加允许进行镜像拉取(pull)和推送(push)操作的 registry 列表(可选)。OpenShift Container Platform 会将对此 CR 的更改应用到集群中的所有节点。
在拉取或推送镜像时,容器运行时会搜索 image.config.openshift.io/cluster
CR 的 registrySources
参数中列出的 registry。如果您在 allowedRegistries
参数下创建了 registry 列表,则容器运行时仅搜索这些 registry。不在列表中的 registry 会被阻断。
当定义 allowedRegistries
参数时,除非明确列出,否则所有 registry (包括 registry.redhat.io
和 quay.io
registry 和默认的 OpenShift 镜像 registry)都会被阻断。如果使用参数,为了避免 pod 失败,您必须将 registry.redhat.io
和 quay.io
registry 以及 internalRegistryHostname
添加到 allowedRegistries
列表中,因为环境中有效负载镜像需要它们。对于断开连接的集群,还应添加镜像的 registry。
流程
编辑
image.config.openshift.io/cluster
自定义资源:$ oc edit image.config.openshift.io/cluster
以下是一个带有允许列表的
image.config.openshift.io/cluster
CR 示例:apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: registrySources: 1 allowedRegistries: 2 - example.com - quay.io - registry.redhat.io - reg1.io/myrepo/myapp:latest - image-registry.openshift-image-registry.svc:5000 status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
注意可以设置
allowedRegistries
参数或blockedRegistries
参数,但不能同时设置这两个参数。Machine Config Operator(MCO)会监控
image.config.openshift.io/cluster
资源以了解对 registry 的任何更改。当 MCO 检测到更改时,它会在机器配置池(MCP)的节点中触发推出部署。允许的 registry 列表用于更新每个节点上的/etc/containers/policy.json
文件中的镜像签名策略。对/etc/containers/policy.json
文件的更改不需要节点排空。
验证
输入以下命令获取节点列表:
$ oc get nodes
输出示例
NAME STATUS ROLES AGE VERSION <node_name> Ready control-plane,master 37m v1.27.8+4fab27b
运行以下命令在节点上进入 debug 模式:
$ oc debug node/<node_name>
出现提示时,在终端中输入
chroot /host
:sh-4.4# chroot /host
输入以下命令检查 registry 是否已添加到策略文件中:
sh-5.1# cat /etc/containers/policy.json | jq '.'
以下策略表示,仅允许来自 example.com、quay.io 和 registry.redhat.io registry 中的镜像拉取和推送镜像:
例 9.1. 镜像签名策略文件示例
{ "default":[ { "type":"reject" } ], "transports":{ "atomic":{ "example.com":[ { "type":"insecureAcceptAnything" } ], "image-registry.openshift-image-registry.svc:5000":[ { "type":"insecureAcceptAnything" } ], "insecure.com":[ { "type":"insecureAcceptAnything" } ], "quay.io":[ { "type":"insecureAcceptAnything" } ], "reg4.io/myrepo/myapp:latest":[ { "type":"insecureAcceptAnything" } ], "registry.redhat.io":[ { "type":"insecureAcceptAnything" } ] }, "docker":{ "example.com":[ { "type":"insecureAcceptAnything" } ], "image-registry.openshift-image-registry.svc:5000":[ { "type":"insecureAcceptAnything" } ], "insecure.com":[ { "type":"insecureAcceptAnything" } ], "quay.io":[ { "type":"insecureAcceptAnything" } ], "reg4.io/myrepo/myapp:latest":[ { "type":"insecureAcceptAnything" } ], "registry.redhat.io":[ { "type":"insecureAcceptAnything" } ] }, "docker-daemon":{ "":[ { "type":"insecureAcceptAnything" } ] } } }
如果您的集群使用 registrySources.insecureRegistries
参数,请确保将任何不安全的 registry 包含在允许的列表中。
例如:
spec: registrySources: insecureRegistries: - insecure.com allowedRegistries: - example.com - quay.io - registry.redhat.io - insecure.com - image-registry.openshift-image-registry.svc:5000
9.2.2. 阻塞特定的 registry
您可以通过编辑 image.config.openshift.io/cluster
自定义资源(CR)来阻止任何 registry 以及 registry 中的单独存储库。OpenShift Container Platform 会将对此 CR 的更改应用到集群中的所有节点。
在拉取或推送镜像时,容器运行时会搜索 image.config.openshift.io/cluster
CR 的 registrySources
参数中列出的 registry。如果您在 blockedRegistries
参数下创建了 registry 列表,则容器运行时不会搜索这些 registry。允许所有其他 registry。
为防止 pod 失败,请不要将 registry.redhat.io
和 quay.io
registry 添加到 blockedRegistries
列表中,因为环境中有效负载镜像需要它们。
流程
编辑
image.config.openshift.io/cluster
自定义资源:$ oc edit image.config.openshift.io/cluster
以下是一个带有块列表的
image.config.openshift.io/cluster
CR 示例:apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: registrySources: 1 blockedRegistries: 2 - untrusted.com - reg1.io/myrepo/myapp:latest status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
注意可以设置
blockedRegistries
registry 或allowedRegistries
registry,但不能同时设置这两个 registry。Machine Config Operator(MCO)会监控
image.config.openshift.io/cluster
资源以了解对 registry 的任何更改。当 MCO 检测到更改时,它会排空节点,应用更改,并对节点进行 uncordon 处理。节点返回Ready
状态后,在每个节点上的/etc/containers/registries.conf
文件中会显示对被阻断的 registry 的更改。
验证
输入以下命令获取节点列表:
$ oc get nodes
输出示例
NAME STATUS ROLES AGE VERSION <node_name> Ready control-plane,master 37m v1.27.8+4fab27b
运行以下命令在节点上进入 debug 模式:
$ oc debug node/<node_name>
出现提示时,在终端中输入
chroot /host
:sh-4.4# chroot /host
输入以下命令检查 registry 是否已添加到策略文件中:
sh-5.1# cat etc/containers/registries.conf
以下示例显示,在进行镜像拉取和推送时,不使用
untrusted.com
:输出示例
unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] [[registry]] prefix = "" location = "untrusted.com" blocked = true
9.2.2.1. 阻塞一个 payload registry
在镜像配置中,您可以使用 ImageContentSourcePolicy
(ICSP) 对象在断开连接的环境中阻断上游 payload registry。以下示例步骤演示了如何阻止 quay.io/openshift-payload
payload registry。
流程
使用
ImageContentSourcePolicy
(ICSP) 对象创建镜像配置,以便将 payload 镜像到您的实例中 registry。以下示例 ICSP 文件对 payloadinternal-mirror.io/openshift-payload
进行了镜像:apiVersion: operator.openshift.io/v1alpha1 kind: ImageContentSourcePolicy metadata: name: my-icsp spec: repositoryDigestMirrors: - mirrors: - internal-mirror.io/openshift-payload source: quay.io/openshift-payload
对象部署到节点上后,通过检查
/etc/containers/registries.conf
文件来验证镜像配置是否已设置:输出示例
[[registry]] prefix = "" location = "quay.io/openshift-payload" mirror-by-digest-only = true [[registry.mirror]] location = "internal-mirror.io/openshift-payload"
使用以下命令来编辑
image.config.openshift.io
自定义资源文件:$ oc edit image.config.openshift.io cluster
要阻断 payload registry,请在
image.config.openshift.io
自定义资源文件中添加以下配置:spec: registrySources: blockedRegistries: - quay.io/openshift-payload
验证
通过检查节点上的
/etc/containers/registries.conf
文件,验证上游 payload registry 是否被阻止。输出示例
[[registry]] prefix = "" location = "quay.io/openshift-payload" blocked = true mirror-by-digest-only = true [[registry.mirror]] location = "internal-mirror.io/openshift-payload"
9.2.3. 允许不安全的 registry
您可以通过编辑 image.config.openshift.io/cluster
自定义资源(CR)来添加不安全的 registry 及 registry 中的特定存储库(可选)。OpenShift Container Platform 会将对此 CR 的更改应用到集群中的所有节点。
没有使用有效 SSL 证书或不需要 HTTPS 连接的 registry 被视为是不安全的 registry。
应避免使用不安全的外部 registry,以减少可能的安全性风险。
流程
编辑
image.config.openshift.io/cluster
自定义资源:$ oc edit image.config.openshift.io/cluster
以下是一个带有不安全 registry 列表的
image.config.openshift.io/cluster
CR 示例:apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: registrySources: 1 insecureRegistries: 2 - insecure.com - reg4.io/myrepo/myapp:latest allowedRegistries: - example.com - quay.io - registry.redhat.io - insecure.com 3 - reg4.io/myrepo/myapp:latest - image-registry.openshift-image-registry.svc:5000 status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
注意当定义
allowedRegistries
参数时,除非明确列出,否则所有 registry (包括 registry.redhat.io 和 quay.io registry 和默认的 OpenShift 镜像 registry)都会被阻断。如果使用参数,为了避免 pod 失败,将所有 registry(包括registry.redhat.io
和quay.io
registry)和internalRegistryHostname
添加到allowedRegistries
列表中,因为环境中有效负载镜像需要它们。对于断开连接的集群,还应添加镜像的 registry。Machine Config Operator(MCO)会监控
image.config.openshift.io/cluster
CR 是否有对 registry 的更改,然后在检测到更改时排空并取消记录节点。节点返回Ready
状态后,改为在每个节点的/etc/containers/registries.conf
文件中列出的不安全和受阻 registry。
验证
要检查 registry 是否已添加到策略文件中,请在节点上使用以下命令:
$ cat /etc/containers/registries.conf
以下示例表示来自
insecure.com
registry 的镜像是不安全的,并允许进行镜像拉取和推送。输出示例
unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] [[registry]] prefix = "" location = "insecure.com" insecure = true
9.2.4. 添加允许镜像短名称的 registry
您可以通过编辑 image.config.openshift.io/cluster
自定义资源(CR)来添加 registry 来搜索镜像短名称。OpenShift Container Platform 会将对此 CR 的更改应用到集群中的所有节点。
镜像简短名称允许您搜索镜像,而无需在 pull spec 中包含完全限定域名。例如: 您可以使用 rhel7/etcd
而不是 registry.access.redhat.com/rhe7/etcd
。
在无法使用完整路径的情况下,您可以使用简短名称。例如,如果您的集群引用了 DNS 频繁变化的多个内部 registry,则需要更新 pull spec 中的完全限定域名并进行每次更改。在这种情况下,使用镜像简短名称可能很有用。
在拉取或推送镜像时,容器运行时会搜索 image.config.openshift.io/cluster
CR 的 registrySources
参数中列出的 registry。如果您在 containerRuntimeSearchRegistries
参数下创建了 registry 列表,则容器运行时会搜索这些 registry。
强烈建议不要将镜像短名称与公共 registry 搭配使用,因为如果公共 registry 需要身份验证,则镜像可能无法部署。将完全限定镜像名称与公共 registry 搭配使用。
红帽内部或私有 registry 通常支持使用镜像短名称。
如果您在 containerRuntimeSearchRegistries
参数下列出公共 registry (包括 registry.redhat.io
、docker.io
和 quay.io
registry),您可以将凭证公开给列表上的所有 registry,并存在对网络和 registry 进行攻击的风险。因为您只能有一个 pull secret 用于拉取镜像,所以由全局 pull secret 定义,该 secret 用于对该列表中的每个 registry 进行身份验证。因此,如果您在列表中包含公共 registry,则会出现安全风险。
如果每个公共 registry 需要不同的凭证,且集群不会在全局 pull secret 中列出公共 registry,则无法在 containerRuntimeSearchRegistries
参数下列出多个公共 registry。
对于需要身份验证的公共 registry,只有在 registry 具有其凭证存储在全局 pull secret 中时,才能使用镜像短名称。
Machine Config Operator(MCO)会监控 image.config.openshift.io/cluster
资源以了解对 registry 的任何更改。当 MCO 检测到更改时,它会排空节点,应用更改,并对节点进行 uncordon 处理。节点返回 Ready
状态后,如果添加了 containerRuntimeSearchRegistries
参数,MCO 会在每个带有列出 registry 的节点的 /etc/containers/registries.conf.d
目录中创建一个文件。该文件覆盖 /etc/containers/registries.conf
文件中的非全限定搜索 registry 的默认列表。没有办法回退到非全限定搜索 registry 的默认列表。
containerRuntimeSearchRegistries
参数只适用于 Podman 和 CRI-O 容器引擎。列表中的 registry 只能用于 pod 规格,不能用于构建和镜像流。
流程
编辑
image.config.openshift.io/cluster
自定义资源:$ oc edit image.config.openshift.io/cluster
以下是
image.config.openshift.io/cluster
CR 示例:apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: "2019-05-17T13:44:26Z" generation: 1 name: cluster resourceVersion: "8302" selfLink: /apis/config.openshift.io/v1/images/cluster uid: e34555da-78a9-11e9-b92b-06d6c7da38dc spec: allowedRegistriesForImport: - domainName: quay.io insecure: false additionalTrustedCA: name: myconfigmap registrySources: containerRuntimeSearchRegistries: 1 - reg1.io - reg2.io - reg3.io allowedRegistries: 2 - example.com - quay.io - registry.redhat.io - reg1.io - reg2.io - reg3.io - image-registry.openshift-image-registry.svc:5000 ... status: internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
注意当定义
allowedRegistries
参数时,除非明确列出,否则所有 registry (包括registry.redhat.io
和quay.io
registry 和默认的 OpenShift 镜像 registry)都会被阻断。如果使用此参数,为了避免 pod 失败,请将所有 registry(包括registry.redhat.io
和quay.io
registry)和internalRegistryHostname
添加到allowedRegistries
列表中,因为环境中有效负载镜像需要它们。对于断开连接的集群,还应添加镜像的 registry。
验证
输入以下命令获取节点列表:
$ oc get nodes
输出示例
NAME STATUS ROLES AGE VERSION <node_name> Ready control-plane,master 37m v1.27.8+4fab27b
运行以下命令在节点上进入 debug 模式:
$ oc debug node/<node_name>
出现提示时,在终端中输入
chroot /host
:sh-4.4# chroot /host
输入以下命令检查 registry 是否已添加到策略文件中:
sh-5.1# cat /etc/containers/registries.conf.d/01-image-searchRegistries.conf
输出示例
unqualified-search-registries = ['reg1.io', 'reg2.io', 'reg3.io']
9.2.5. 为镜像 registry 访问配置额外的信任存储
Image.config.openshift.io/cluster
自定资源可包含对配置映射的引用,该配置映射包含要在镜像 registry 访问期间被信任的额外证书颁发机构。
先决条件
- 证书颁发机构(CA)必须经过 PEM 编码。
流程
您可以在openshift-config
命名空间中创建配置映射,并在 image.config.openshift.io
子定义资源中的 AdditionalTrustedCA
中使用其名称,以提供与外部 registry 联系时可以被信任的额外CA。
对于每个要信任的额外 registry CA,配置映射键是带有要信任此 CA 的端口的 registry 的主机名,而 PEM 证书内容是要信任的每个额外 registry CA。
镜像 registry CA 配置映射示例
apiVersion: v1
kind: ConfigMap
metadata:
name: my-registry-ca
data:
registry.example.com: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
registry-with-port.example.com..5000: | 1
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
- 1
- 如果 registry 带有端口,如
registry-with-port.example.com:5000
,:
需要被..
替换。
您可以按照以下过程配置其他CA。
配置其他CA:
$ oc create configmap registry-config --from-file=<external_registry_address>=ca.crt -n openshift-config
$ oc edit image.config.openshift.io cluster
spec: additionalTrustedCA: name: registry-config