在某些情况下,您可能需要将 OpenShift Container Platform 集群从连接集群转换为断开连接的集群。
断开连接的集群,也称为受限集群,没有与互联网的活动连接。因此,您必须镜像注册表和安装介质的内容。您可以在可以访问互联网和封闭网络的主机上创建此镜像注册表,或者将镜像复制到可以在网络边界之间移动的设备上。
本主题描述了将现有连接集群转换为断开连接集群的常规流程。
您可以将 OpenShift Container Platform 安装和后续产品更新所需的镜像镜像到容器镜像注册表,例如 Red Hat Quay、JFrog Artifactory、Sonatype Nexus Repository 或 Harbor。如果您无法访问大型容器注册表,则可以使用 *Red Hat OpenShift 的镜像注册表*,这是一个包含在 OpenShift Container Platform 订阅中的小型容器注册表。
您可以使用任何支持 Docker v2-2 的容器注册表,例如 Red Hat Quay、*Red Hat OpenShift 的镜像注册表*、Artifactory、Sonatype Nexus Repository 或 Harbor。无论您选择哪个注册表,将内容从 Red Hat 托管的互联网站点镜像到隔离的镜像注册表的流程都是相同的。镜像内容后,您可以配置每个集群以从您的镜像注册表检索此内容。
OpenShift 镜像注册表不能用作目标注册表,因为它不支持在镜像过程中所需的无标签推送。 |
如果选择不是 *Red Hat OpenShift 的镜像注册表* 的容器注册表,则您配置的集群中的每一台机器都必须能够访问它。如果注册表不可访问,则安装、更新或正常的操作(例如工作负载迁移)可能会失败。因此,您必须以高可用性的方式运行镜像注册表,并且镜像注册表至少必须与您的 OpenShift Container Platform 集群的生产可用性相匹配。
使用 OpenShift Container Platform 镜像填充镜像注册表时,您可以遵循两种方案。如果您有一台主机既可以访问互联网和镜像注册表,又无法访问集群节点,则可以直接从该主机镜像内容。此过程称为 *连接镜像*。如果您没有这样的主机,则必须将镜像镜像到文件系统,然后将该主机或可移动介质带入您的受限环境。此过程称为 *断开连接镜像*。
对于镜像注册表,要查看已拉取镜像的来源,您必须查看 CRI-O 日志中的 尝试访问
日志条目。其他查看镜像拉取源的方法(例如在节点上使用 crictl images
命令)会显示未镜像的镜像名称,即使镜像是从镜像位置拉取的。
Red Hat 不对与 OpenShift Container Platform 一起使用的第三方注册表进行测试。 |
已安装 oc
客户端。
正在运行的集群。
已安装的镜像注册表,这是一个支持 Docker v2-2 的容器镜像注册表,位于将托管 OpenShift Container Platform 集群的位置,例如以下注册表之一
如果您订阅了 Red Hat Quay,请参阅有关部署 Red Hat Quay 的文档 用于概念验证目的 或 使用 Quay Operator。
镜像存储库必须配置为共享镜像。例如,Red Hat Quay 存储库需要 组织 才能共享镜像。
访问互联网以获取必要的容器镜像。
断开集群连接之前,您必须将镜像镜像或复制到断开连接的集群中的每个节点都可以访问的镜像注册表。为了镜像镜像,您必须通过以下方式准备集群:
将镜像注册表的证书添加到主机上的受信任 CA 列表中。
创建一个包含镜像拉取密钥(来自 cloud.openshift.com
令牌)的 .dockerconfigjson
文件。
配置允许镜像镜像的凭据
将镜像注册表的 CA 证书(采用简单的 PEM 或 DER 文件格式)添加到受信任的 CA 列表中。例如:
$ cp </path/to/cert.crt> /usr/share/pki/ca-trust-source/anchors/
</path/to/cert.crt>
指定证书在本地文件系统中的路径。
更新 CA 信任。例如,在 Linux 中:
$ update-ca-trust
从全局拉取密钥中提取 .dockerconfigjson
文件
$ oc extract secret/pull-secret -n openshift-config --confirm --to=.
.dockerconfigjson
编辑 .dockerconfigjson
文件以添加镜像注册表和身份验证凭据,并将其另存为新文件
{"auths":{"<local_registry>": {"auth": "<credentials>","email": "[email protected]"}}},"<registry>:<port>/<namespace>/":{"auth":"<token>"}}}
其中
<local_registry>
指定镜像注册表用于提供内容的注册表域名,以及可选的端口。
auth
指定镜像注册表的 base64 编码用户名和密码。
<registry>:<port>/<namespace>
指定镜像注册表详细信息。
<token>
指定镜像注册表的 base64 编码 username:password
。
例如
$ {"auths":{"cloud.openshift.com":{"auth":"b3BlbnNoaWZ0Y3UjhGOVZPT0lOMEFaUjdPUzRGTA==","email":"[email protected]"},
"quay.io":{"auth":"b3BlbnNoaWZ0LXJlbGVhc2UtZGOVZPT0lOMEFaUGSTd4VGVGVUjdPUzRGTA==","email":"[email protected]"},
"registry.connect.redhat.com"{"auth":"NTE3MTMwNDB8dWhjLTFEZlN3VHkxOSTd4VGVGVU1MdTpleUpoYkdjaUailA==","email":"[email protected]"},
"registry.redhat.io":{"auth":"NTE3MTMwNDB8dWhjLTFEZlN3VH3BGSTd4VGVGVU1MdTpleUpoYkdjaU9fZw==","email":"[email protected]"},
"registry.svc.ci.openshift.org":{"auth":"dXNlcjpyWjAwWVFjSEJiT2RKVW1pSmg4dW92dGp1SXRxQ3RGN1pwajJhN1ZXeTRV"},"my-registry:5000/my-namespace/":{"auth":"dXNlcm5hbWU6cGFzc3dvcmQ="}}}
正确配置集群后,您可以将镜像从外部存储库镜像到镜像存储库。
镜像 Operator Lifecycle Manager (OLM) 镜像
$ oc adm catalog mirror registry.redhat.io/redhat/redhat-operator-index:v{product-version} <mirror_registry>:<port>/olm -a <reg_creds>
其中
product-version
指定与要安装的 OpenShift Container Platform 版本相对应的标签,例如 4.8
。
mirror_registry
指定要将 Operator 内容镜像到的目标注册表的完全限定域名 (FQDN) 和命名空间,其中 <namespace>
是注册表上的任何现有命名空间。
reg_creds
指定修改后的 .dockerconfigjson
文件的位置。
例如
$ oc adm catalog mirror registry.redhat.io/redhat/redhat-operator-index:v4.8 mirror.registry.com:443/olm -a ./.dockerconfigjson --index-filter-by-os='.*'
镜像任何其他 Red Hat 提供的 Operator 的内容
$ oc adm catalog mirror <index_image> <mirror_registry>:<port>/<namespace> -a <reg_creds>
其中
index_image
指定要镜像的目录的索引镜像。
mirror_registry
指定要将 Operator 内容镜像到的目标注册表的 FQDN 和命名空间,其中 <namespace>
是注册表上的任何现有命名空间。
reg_creds
可选:如果需要,指定注册表凭据文件的位置。
例如
$ oc adm catalog mirror registry.redhat.io/redhat/community-operator-index:v4.8 mirror.registry.com:443/olm -a ./.dockerconfigjson --index-filter-by-os='.*'
镜像 OpenShift Container Platform 镜像存储库
$ oc adm release mirror -a .dockerconfigjson --from=quay.io/openshift-release-dev/ocp-release:v<product-version>-<architecture> --to=<local_registry>/<local_repository> --to-release-image=<local_registry>/<local_repository>:v<product-version>-<architecture>
其中
product-version
指定与要安装的 OpenShift Container Platform 版本相对应的标签,例如 4.8.15-x86_64
。
architecture
指定服务器的架构类型,例如 x86_64
。
local_registry
指定镜像存储库的注册表域名。
本地镜像仓库
指定要在您的注册表中创建的仓库名称,例如 ocp4/openshift4
。
例如
$ oc adm release mirror -a .dockerconfigjson --from=quay.io/openshift-release-dev/ocp-release:4.8.15-x86_64 --to=mirror.registry.com:443/ocp/release --to-release-image=mirror.registry.com:443/ocp/release:4.8.15-x86_64
info: Mirroring 109 images to mirror.registry.com/ocp/release ...
mirror.registry.com:443/
ocp/release
manifests:
sha256:086224cadce475029065a0efc5244923f43fb9bb3bb47637e0aaf1f32b9cad47 -> 4.8.15-x86_64-thanos
sha256:0a214f12737cb1cfbec473cc301aa2c289d4837224c9603e99d1e90fc00328db -> 4.8.15-x86_64-kuryr-controller
sha256:0cf5fd36ac4b95f9de506623b902118a90ff17a07b663aad5d57c425ca44038c -> 4.8.15-x86_64-pod
sha256:0d1c356c26d6e5945a488ab2b050b75a8b838fc948a75c0fa13a9084974680cb -> 4.8.15-x86_64-kube-client-agent
…..
sha256:66e37d2532607e6c91eedf23b9600b4db904ce68e92b43c43d5b417ca6c8e63c mirror.registry.com:443/ocp/release:4.5.41-multus-admission-controller
sha256:d36efdbf8d5b2cbc4dcdbd64297107d88a31ef6b0ec4a39695915c10db4973f1 mirror.registry.com:443/ocp/release:4.5.41-cluster-kube-scheduler-operator
sha256:bd1baa5c8239b23ecdf76819ddb63cd1cd6091119fecdbf1a0db1fb3760321a2 mirror.registry.com:443/ocp/release:4.5.41-aws-machine-controllers
info: Mirroring completed in 2.02s (0B/s)
Success
Update image: mirror.registry.com:443/ocp/release:4.5.41-x86_64
Mirror prefix: mirror.registry.com:443/ocp/release
根据需要镜像其他注册表
$ oc image mirror <online_registry>/my/image:latest <mirror_registry>
有关镜像 Operator 目录的更多信息,请参阅 镜像 Operator 目录。
有关 oc adm catalog mirror
命令的更多信息,请参阅 OpenShift CLI 管理员命令参考。
创建镜像并将其镜像到镜像注册表后,必须修改集群,以便 Pod 可以从镜像注册表拉取镜像。
您必须
将镜像注册表凭据添加到全局拉取密钥。
将镜像注册表服务器证书添加到集群。
创建ImageContentSourcePolicy
自定义资源 (ICSP),它将镜像注册表与源注册表关联。
将镜像注册表凭据添加到集群全局拉取密钥
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<pull_secret_location> (1)
1 | 提供新的拉取密钥文件的路径。 |
例如
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=.mirrorsecretconfigjson
将 CA 签名的镜像注册表服务器证书添加到集群中的节点
创建一个包含镜像注册表服务器证书的 ConfigMap。
$ oc create configmap <config_map_name> --from-file=<mirror_address_host>..<port>=$path/ca.crt -n openshift-config
例如
S oc create configmap registry-config --from-file=mirror.registry.com..443=/root/certs/ca-chain.cert.pem -n openshift-config
使用 ConfigMap 更新image.config.openshift.io/cluster
自定义资源 (CR)。OpenShift Container Platform 会将这些更改应用于集群中的所有节点。
$ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"<config_map_name>"}}}' --type=merge
例如
$ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-config"}}}' --type=merge
创建一个 ICSP 以将容器拉取请求从在线注册表重定向到镜像注册表
创建ImageContentSourcePolicy
自定义资源
apiVersion: operator.openshift.io/v1alpha1
kind: ImageContentSourcePolicy
metadata:
name: mirror-ocp
spec:
repositoryDigestMirrors:
- mirrors:
- mirror.registry.com:443/ocp/release (1)
source: quay.io/openshift-release-dev/ocp-release (2)
- mirrors:
- mirror.registry.com:443/ocp/release
source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
1 | 指定镜像镜像注册表和仓库的名称。 |
2 | 指定包含已镜像内容的在线注册表和仓库。 |
创建 ICSP 对象
$ oc create -f registryrepomirror.yaml
imagecontentsourcepolicy.operator.openshift.io/mirror-ocp created
OpenShift Container Platform 会将这些更改应用于集群中的所有节点。
验证是否已添加镜像注册表的凭据、CA 和 ICSP
登录到一个节点
$ oc debug node/<node_name>
在调试 shell 中将/host
设置为根目录
sh-4.4# chroot /host
检查config.json
文件中的凭据
sh-4.4# cat /var/lib/kubelet/config.json
{"auths":{"brew.registry.redhat.io":{"xx=="},"brewregistry.stage.redhat.io":{"auth":"xxx=="},"mirror.registry.com:443":{"auth":"xx="}}} (1)
1 | 确保镜像注册表和凭据存在。 |
更改到certs.d
目录
sh-4.4# cd /etc/docker/certs.d/
列出certs.d
目录中的证书
sh-4.4# ls
image-registry.openshift-image-registry.svc.cluster.local:5000 image-registry.openshift-image-registry.svc:5000 mirror.registry.com:443 (1)
1 | 确保镜像注册表在列表中。 |
检查 ICSP 是否已将镜像注册表添加到registries.conf
文件
sh-4.4# cat /etc/containers/registries.conf
unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]
[[registry]]
prefix = ""
location = "quay.io/openshift-release-dev/ocp-release"
mirror-by-digest-only = true
[[registry.mirror]]
location = "mirror.registry.com:443/ocp/release"
[[registry]]
prefix = ""
location = "quay.io/openshift-release-dev/ocp-v4.0-art-dev"
mirror-by-digest-only = true
[[registry.mirror]]
location = "mirror.registry.com:443/ocp/release"
registry.mirror
参数指示在原始注册表之前搜索镜像注册表。
退出节点。
sh-4.4# exit
在将集群与网络断开连接之前,请确保您的集群按预期运行,并且所有应用程序都按预期运行。
使用以下命令检查集群的状态
确保您的 Pod 正在运行
$ oc get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system apiserver-watcher-ci-ln-47ltxtb-f76d1-mrffg-master-0 1/1 Running 0 39m
kube-system apiserver-watcher-ci-ln-47ltxtb-f76d1-mrffg-master-1 1/1 Running 0 39m
kube-system apiserver-watcher-ci-ln-47ltxtb-f76d1-mrffg-master-2 1/1 Running 0 39m
openshift-apiserver-operator openshift-apiserver-operator-79c7c646fd-5rvr5 1/1 Running 3 45m
openshift-apiserver apiserver-b944c4645-q694g 2/2 Running 0 29m
openshift-apiserver apiserver-b944c4645-shdxb 2/2 Running 0 31m
openshift-apiserver apiserver-b944c4645-x7rf2 2/2 Running 0 33m
...
确保您的节点处于就绪状态
$ oc get nodes
NAME STATUS ROLES AGE VERSION
ci-ln-47ltxtb-f76d1-mrffg-master-0 Ready master 42m v1.30.3
ci-ln-47ltxtb-f76d1-mrffg-master-1 Ready master 42m v1.30.3
ci-ln-47ltxtb-f76d1-mrffg-master-2 Ready master 42m v1.30.3
ci-ln-47ltxtb-f76d1-mrffg-worker-a-gsxbz Ready worker 35m v1.30.3
ci-ln-47ltxtb-f76d1-mrffg-worker-b-5qqdx Ready worker 35m v1.30.3
ci-ln-47ltxtb-f76d1-mrffg-worker-c-rjkpq Ready worker 34m v1.30.3
镜像所有必需的仓库并配置您的集群以作为断开连接的集群工作后,您可以将集群与网络断开连接。
当集群失去互联网连接时,Insights Operator 会降级。您可以通过暂时禁用 Insights Operator来避免此问题,直到您可以恢复它。 |
将集群与网络断开连接必然会导致集群失去互联网连接。Insights Operator 会降级,因为它需要访问Red Hat Insights。
本主题介绍如何从降级的 Insights Operator 中恢复。
编辑您的.dockerconfigjson
文件以删除cloud.openshift.com
条目,例如
"cloud.openshift.com":{"auth":"<hash>","email":"[email protected]"}
保存文件。
使用编辑后的.dockerconfigjson
文件更新集群密钥
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=./.dockerconfigjson
验证 Insights Operator 是否不再降级
$ oc get co insights
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE
insights 4.5.41 True False False 3d
如果要重新连接断开的集群并从在线注册表拉取镜像,请删除集群的 ImageContentSourcePolicy (ICSP) 对象。没有 ICSP,对外部注册表的拉取请求将不再重定向到镜像注册表。
查看集群中的 ICSP 对象
$ oc get imagecontentsourcepolicy
NAME AGE
mirror-ocp 6d20h
ocp4-index-0 6d18h
qe45-index-0 6d15h
删除在断开集群连接时创建的所有 ICSP 对象
$ oc delete imagecontentsourcepolicy <icsp_name> <icsp_name> <icsp_name>
例如
$ oc delete imagecontentsourcepolicy mirror-ocp ocp4-index-0 qe45-index-0
imagecontentsourcepolicy.operator.openshift.io "mirror-ocp" deleted
imagecontentsourcepolicy.operator.openshift.io "ocp4-index-0" deleted
imagecontentsourcepolicy.operator.openshift.io "qe45-index-0" deleted
等待所有节点重新启动并返回到就绪状态,并验证registries.conf
文件是否指向原始注册表而不是镜像注册表
登录到一个节点
$ oc debug node/<node_name>
在调试 shell 中将/host
设置为根目录
sh-4.4# chroot /host
检查registries.conf
文件
sh-4.4# cat /etc/containers/registries.conf
unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] (1)
1 | 由您删除的 ICSP 创建的registry 和registry.mirror 条目将被删除。 |