文章目录
环境:
- OpenShift 4.5
- 在本地运行Docker Registry,访问证书位于“${REGISTRY_PATH}/certs/registry.crt”。也可使用《https://blog.csdn.net/weixin_43902588/article/details/109544040》获取本地Registry的访问证书。
- 从hub.docker.com导入busybox镜像,假设镜像访问地址为“registry.example.internal:5000/apps/busybox”。
OpenShift如何访问外部Registry的Image
无论是外部Registry还是内部Registry,OpenShift是通过ImageStream访问这些Registry上的Image的。无论是手动创建ImageStream对象还是在部署应用过程中通过Deployment自动创建ImageStream对象,OpenShift必须能通过ImageStream对象中的信息访问到对应实际的Image。
全局ImageStream
本地ImageStream
通过openshift项目中的全局ImageStream访问外部Image
通常我们在安装OpenShift的会选择一种安装方式:离线安装或在线安装。
- 在线安装:在安装环境可以访问到registry.redhat.io、quay.io等网站,并有账号从这些网站上按需下载Image。在线安装完后,我们可以通过openshift项目中的预配置的ImageStream自动访问registry.redhat.io、quay.io等红帽官方Image。
- 离线安装:在安装环境无法访问到registry.redhat.io,quay.io等网站,只能先将安装使用到的Image下载并导入本地的Image Registry环境中。在离线安装完后是无法通过openshift项目中的预配置的ImageStream自动访问registry.redhat.io、quay.io等红帽官方Image。如果OpenShift始终不能访问外网,那么解决方案是先将用到的外部Image手动下载,然后Import到本地Image Registry中,再修改openshift项目中的预配置的ImageStream对象,将其指向导入到本地Image Registry的Image。
不同安装方式的差异
在线安装环境
如果是在线安装的OpenShift,缺省pull-secret包含如下内容。通过该pull-secret,OpenShift就可以登录 “quay.io”、“cloud.openshift.com”、“registry.connect.redhat.com”、“registry.redhat.io”,并 pull 到 Image。通过base64 decode,可查看访问外部Registry的认证本体。
$ oc get secret/pull-secret -n openshift-config -o template='{{index .data ".dockerconfigjson"}}' | base64 -d | jq
{
"auths": {
"cloud.openshift.com": {
"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K2Jlbm9jZWxvdHVwcm9hcmNvbTFyeXRwcjl2aW1seGp2bGRiN3dkbDRxY2picDpJM0xSQUE4U0hUSFQzUlhBVzNIVEhSQVFRR0E1Nk5FUVVOQVFHSDdIOVpBTk9PWTJKSlROTzNWQUhFR0dGNDdM",
"email": "ben@ocelotuproar.com"
},
"quay.io": {
"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K2Jlbm9jZWxvdHVwcm9hcmNvbTFyeXRwcjl2aW1seGp2bGRiN3dkbDRxY2picDpJM0xSQUE4U0hUSFQzUlhBVzNIVEhSQVFRR0E1Nk5FUVVOQVFHSDdIOVpBTk9PWTJKSlROTzNWQUhFR0dGNDdM",
"email": "ben@ocelotuproar.com"
},
"registry.connect.redhat.com": {
"auth": "NTI4OTQ0NzB8dWhjLTFSWVRQcjl2SU1MWEpWTERCN1dETDRxY2pCcDpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSmtPR0ZsTVRsalkySmtOVEEwTldNelltUTBabVprWlRKbVpEVTJOREl5TWlKOS5wYkN3WUphTVRfTWk4RW9sbTZ3MzE1WmgyUEZXdDA0b1YzbVdXQzJQTnhhVEVkUnZLNFhVWWQtSVhwV1VaT2N6R0Q5MlFBUU02a1AzazFieXRDejdEUUtQZmtMclFwelh6dDNkbzM1OE4zVkhoMmVVR1RwVG5XLVV3UW5mSjBFN3Etb3RNeTZBZFgxamRPRDVldnV3X2pCb3RnMllMUC1DN3RSZGtYdzFWR3NHM3dyN2I1V2loUDRydFVZR2hLT1l3UE1yWGtQaFRSZEstYUFxdmMzMkVkVVZUOG9GX1hKS1dVaXFuc1VKZ0pidERYVE52SWtNb1NhUTRrQm16UFRUMTJVcjVvNFFTVkVBSVNjczdDaUVTOWhQam5ycUJYUzJlZWFSQlVNZDZxS05ONGljZmhLTTlzVnJ4eXRFRXY0cm5SQmVkM1M0ZWlhVGNmX1pGSnV1eDk4RU1XcXVDQ3I4aG1fOEdmcFJQSW4yYVZvcl9ESkd2MlBYWi0tZHdVaTNncHc5QkRQQzhQQXVKZVE4WkRyZEo0WXVhMElKaGp6NGtMY3FpY3NUMHNmcU5Idl9qdzhCUmpad1YtN2FJd3A2TlgwUWJSaXRvYnNDcmhKX1VQUGxMVXN3NzJxU3B4UERTU25NRjluTHRROTA2RXBMamtFa05TNHIxRDd5UkdpTUsxa2I4WjRQdkNzZTVrZWxfdHNJcU10aDdHX1hOZ1RUeGxfeUFrYXVOM0pxMF9YYTA0VW1zeVphRUdURVpfV3hBLWtQZ01JWko4VHFHUENsOGIwLXBFVGJHdHItbVlDVHY1a0Z1Um1iQV9qZEk4YTN4UW1HUzBTVzhwLUZfUENHS2hvSXg2SmRmTTVsSmVZTmlxeHRrUWxWLXVzckxnVWNSdTZNX3JfR1gxVQ==",
"email": "ben@ocelotuproar.com"
},
"registry.redhat.io": {
"auth": "NTI4OTQ0NzB8dWhjLTFSWVRQcjl2SU1MWEpWTERCN1dETDRxY2pCcDpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSmtPR0ZsTVRsalkySmtOVEEwTldNelltUTBabVprWlRKbVpEVTJOREl5TWlKOS5wYkN3WUphTVRfTWk4RW9sbTZ3MzE1WmgyUEZXdDA0b1YzbVdXQzJQTnhhVEVkUnZLNFhVWWQtSVhwV1VaT2N6R0Q5MlFBUU02a1AzazFieXRDejdEUUtQZmtMclFwelh6dDNkbzM1OE4zVkhoMmVVR1RwVG5XLVV3UW5mSjBFN3Etb3RNeTZBZFgxamRPRDVldnV3X2pCb3RnMllMUC1DN3RSZGtYdzFWR3NHM3dyN2I1V2loUDRydFVZR2hLT1l3UE1yWGtQaFRSZEstYUFxdmMzMkVkVVZUOG9GX1hKS1dVaXFuc1VKZ0pidERYVE52SWtNb1NhUTRrQm16UFRUMTJVcjVvNFFTVkVBSVNjczdDaUVTOWhQam5ycUJYUzJlZWFSQlVNZDZxS05ONGljZmhLTTlzVnJ4eXRFRXY0cm5SQmVkM1M0ZWlhVGNmX1pGSnV1eDk4RU1XcXVDQ3I4aG1fOEdmcFJQSW4yYVZvcl9ESkd2MlBYWi0tZHdVaTNncHc5QkRQQzhQQXVKZVE4WkRyZEo0WXVhMElKaGp6NGtMY3FpY3NUMHNmcU5Idl9qdzhCUmpad1YtN2FJd3A2TlgwUWJSaXRvYnNDcmhKX1VQUGxMVXN3NzJxU3B4UERTU25NRjluTHRROTA2RXBMamtFa05TNHIxRDd5UkdpTUsxa2I4WjRQdkNzZTVrZWxfdHNJcU10aDdHX1hOZ1RUeGxfeUFrYXVOM0pxMF9YYTA0VW1zeVphRUdURVpfV3hBLWtQZ01JWko4VHFHUENsOGIwLXBFVGJHdHItbVlDVHY1a0Z1Um1iQV9qZEk4YTN4UW1HUzBTVzhwLUZfUENHS2hvSXg2SmRmTTVsSmVZTmlxeHRrUWxWLXVzckxnVWNSdTZNX3JfR1gxVQ==",
"email": "ben@ocelotuproar.com"
}
}
}
离线安装环境
当时在安装OpenShift的时候使用的是离线安装方式,在离线安装OpenShift后,openshift-config项目中的pull-secret只包含了安装OpenShift过程中使用到的访问本地Image Registry的认证信息,如下面只有登录内部 Image Registry 的登录信息(“registry.example.internal:5000”域名访问地址可能会有差异)。
- 首先我们可以查看OpenShift用来从外部Registry拉Image的访问认证,该认证存放在名为pull-secret的secret中。
$ oc describe secret/pull-secret -n openshift-config
Name: pull-secret
Namespace: openshift-config
Labels: <none>
Annotations: <none>
Type: kubernetes.io/dockerconfigjson
Data
====
.dockerconfigjson: 2734 bytes
- 执行以下命令可查看pull-secret中的认证信息。
$ oc get secret/pull-secret -n openshift-config -o template='{{index .data ".dockerconfigjson"}}' | base64 -d | jq
{
"auths": {
"registry.example.internal:5000": {
"auth":"b3BlbnNoaWZ0OnJlZGhhdA=="
}
}
}
如果在离线安装完成OpenShift后又可以访问外网了,此时当查看这些ImageStream的时候,会提示下图的错误。由于没有将访问registry.redhat.io、quay.io等网站的secret配置到OpenShift里,因此会提示没有访问这些网站上的Image的权限。
为openshift项目的全局ImageStream配置访问红帽官方Registry的pull secret
如果开始离线安装的OpenShift事后又可以访问外网了,我们可以通过以下方法将访问红帽registry.redhat.io、quay.io等网站的pull secret配置追加到OpenShift中,这样openshift项目中的全局ImageStream就能够从红帽官方pull到Image。需要注意的是,全局openshift项目是使用openshift-config项目中的名为pull-secret的Secret对象访问的红帽网站的Image的。
下载pull secret并生成新的pull secret
- 从https://cloud.redhat.com/openshift/install/pull-secret下载“pull secret”到本地的redhat-pull-secret.json文件。
- 将redhat-pull-secret.json中的数据和前面获得OpenShift已有的pull-secret中的数据(经过base64 decode后)合并为all-pull-secret.json文件。
将新的pull secret导入到OpenShift
- 执行以下命令,将新的all-pull-secret.json中的数据更新至OpenShift中的pull-secret对象。
$ oc set data secret/pull-secret -n openshift-config --from-file=.dockerconfigjson=<PATH>/all-pull-secret.json
- 查看更新后的pull-secret,确认有访问 “quay.io”、“cloud.openshift.com”、“registry.connect.redhat.com”、“registry.redhat.io”和内部Image registry的认证信息。
$ oc get secret/pull-secret -n openshift-config -o template='{{index .data ".dockerconfigjson"}}' | base64 -d | jq
- 另外还可进入到OpenShift集群节点,确认pull secret的配置已经写入每个节点的“/var/lib/kubelet/config.json”文件中。
$ oc deubg node/<NODE_NAME>
sh-4.4# chroot /host
sh-4.4# more /var/lib/kubelet/config.json | jq
确认新的pull secret已经生效
当新的pull secret生效后,OpenShift就可以访问到registry.redhat.io、quay.io等网站,并获取其红帽提供的官方镜像了。
- 在openshift项目中找到名为mysql的ImageStream,确认所有Tag指向的镜像都有有效的Identifier,并可以看到最近的更新时间。
- 在OpenShift控制台上进到Developer模式。点击+Add,然后在点击“Container Image”,此时会进入以下“Deploy Image”页面。确认可以从“Image stream tag from internal registry”选项下分别选中openshift项目,httpd的ImageStream和latest的Tag,最后点击Create按钮。
- 在Topology中查看部署情况,成功后如下图。可以通过Route下面的链接访问部署好的Apache HTTP页面。证明已经可以通过该pull secret从registry.redhat.io上pull到使用的Image了。
在一般项目中访问外部Registry的Image
直接访问红帽官方registry.redhat.io的Image
如果项目本地没有pull secret
如果我们在应用项目中直接访问红帽官方registry.redhat.io上的镜像(即不通过全局openshift项目里的已有ImageStream使用registry.redhat.io上的Image),看看会发生什么?
- 执行以下命令,确认会由于没有访问registry.redhat.io的认证授权导致import-image失败。
$ oc new project apache-http
$ oc import-image registry.redhat.io/rhscl/httpd-24-rhel7 -n apache-http --confirm
error: tag latest failed: Internal error occurred: registry.redhat.io/rhscl/httpd-24-rhel7:latest: Get https://registry.redhat.io/v2/rhscl/httpd-24-rhel7/manifests/latest: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: https://access.redhat.com/RegistryAuthentication
imagestream.image.openshift.io/httpd-24-rhel7 imported with errors
Name: httpd-24-rhel7
Namespace: apache-http
Created: Less than a second ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2020-11-21T08:24:38Z
Image Repository: image-registry.openshift-image-registry.svc:5000/apache-http/httpd-24-rhel7
Image Lookup: local=false
Unique Images: 0
Tags: 1
latest
tagged from registry.redhat.io/rhscl/httpd-24-rhel7
! error: Import failed (InternalError): Internal error occurred: registry.redhat.io/rhscl/httpd-24-rhel7:latest: Get https://registry.redhat.io/v2/rhscl/httpd-24-rhel7/manifests/latest: unauthorized: Please login to the Red Hat Registry using your Customer Portal credentials. Further instructions can be found here: https://access.redhat.com/RegistryAuthentication
Less than a second ago
- 除了以上步骤可以验证外,还可以进入OpenShift控制台的Developer视图,通过依次点击“+Add”、“Container Image”,然后在下图的Deploy Image页面中直接部署外部容器镜像“registry.redhat.io/rhscl/httpd-24-rhel7”,页面也会提示访问权限失败的错误。
为一般项目配置访问红帽官方Registry的pull secret
- 用浏览器打开https://access.redhat.com/terms-based-registry,然后用redhat的订阅账号登录。
- 在以下“Registry Service Accounts”页面中点击“New Service Account”按钮。
- 在下图的“Create a New Registry Service Account”页面里提供Name即可,然后点击CREATE按钮。
- 在“Token Information”页面中切换到“OpenShift Secret”。然后根据提示,将secret内容复制到my-pull-security-secret.yml中,然后再执行以下命令,在你的项目中创建Secret对象。另外也可参照下图第3步,直接在pod的yaml配置中使用该Secret对象以获取红帽官方Registry的容器镜像。
$ oc create -f my-pull-security-secret.yml -n apache-http
5. 执行命令,查看创建的11485319-my-pull-security-pull-secret对象。
$ oc get secret -n apache-http
NAME TYPE DATA AGE
11485319-my-pull-security-pull-secret kubernetes.io/dockerconfigjson 1 2m31s
builder-dockercfg-w6d9d kubernetes.io/dockercfg 1 13m
builder-token-nz655 kubernetes.io/service-account-token 4 13m
builder-token-z7kz9 kubernetes.io/service-account-token 4 13m
default-dockercfg-szrdv kubernetes.io/dockercfg 1 13m
default-token-bkg44 kubernetes.io/service-account-token 4 13m
default-token-dqr8t kubernetes.io/service-account-token 4 13m
deployer-dockercfg-vklnr kubernetes.io/dockercfg 1 13m
deployer-token-p9srj kubernetes.io/service-account-token 4 13m
deployer-token-w6769 kubernetes.io/service-account-token 4 13m
- 执行import-image命令,在当前项目直接从红帽官网registry.redhat.io/rhscl/httpd-24-rhel7镜像创建对应的ImageStream。
$ oc import-image registry.redhat.io/rhscl/httpd-24-rhel7 -n apache-http --confirm
imagestream.image.openshift.io/httpd-24-rhel7 imported
Name: httpd-24-rhel7
Namespace: apache-http
Created: Less than a second ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2020-11-21T11:14:30Z
Image Repository: image-registry.openshift-image-registry.svc:5000/apache-http/httpd-24-rhel7
Image Lookup: local=false
Unique Images: 1
Tags: 1
latest
tagged from registry.redhat.io/rhscl/httpd-24-rhel7
* registry.redhat.io/rhscl/httpd-24-rhel7@sha256:6df4e25ab52799d356715b1a0eaacc5b2ba9d5ba653b7de21b4689e402940887
Less than a second ago
Image Name: httpd-24-rhel7:latest
Docker Image: registry.redhat.io/rhscl/httpd-24-rhel7@sha256:6df4e25ab52799d356715b1a0eaacc5b2ba9d5ba653b7de21b4689e402940887
Name: sha256:6df4e25ab52799d356715b1a0eaacc5b2ba9d5ba653b7de21b4689e402940887
Created: Less than a second ago
Annotations: image.openshift.io/dockerLayersOrder=ascending
Image Size: 121.1MB in 4 layers
Layers: 76.41MB sha256:2b63304f1869b42027cc113af46692a963e05ef7867c88d36ef9c75ffc2fdfc7
1.807kB sha256:d518f7038c56d881774a7a29c5eb0c5dab9a9c5223a989b818ec4f2ca864867c
7.231MB sha256:3811c17826fed41d93a6e6bcfb6a048828f5f72e3032bb61e8f7cd0785995bfc
37.48MB sha256:c250bba8807e6ce11bed5c942e045aee7c5e5f1e1759b2b29243ae0781336b5a
。。。。。。
- 如果不是通过人工操作而是要在pod中能够pull到Image,那么需要将上面的Pull Secret添加到本项目的ServiceAccount中。
$ oc get sa -n apache-http
NAME SECRETS AGE
builder 2 38m
default 2 38m
deployer 2 38m
$ oc describe sa default
Name: default
Namespace: apache-http
Labels: <none>
Annotations: <none>
Image pull secrets: default-dockercfg-szrdv
Mountable secrets: default-token-bkg44
default-dockercfg-szrdv
Tokens: default-token-bkg44
default-token-dqr8t
Events: <none>
# 将前面创建的11485319-my-pull-security-pull-secret加入到名为default的ServiceAccount中。
$ oc secrets link default 11485319-my-pull-security-pull-secret --for=pull
# 将前面创建的11485319-my-pull-security-pull-secret加入到名为build的ServiceAccount中,可执行S2I builds和oc new-build。
$ oc secrets link builder redhat-registry-secret
直接访问本地Docker Registry的Image
如果没有配置访问本地Docker Registry的证书
- 创建项目
$ oc new-project busybox
- 进入OpenShift控制台的Developer视图,通过依次点击“+Add”、“Container Image”,然后在下图的Deploy Image页面中直接部署外部容器镜像“registry.example.internal:5000/apps/busybox”,页面会提示访问权限失败的错误。
将访问本地Docker Registry的证书配置到OpenShift可信证书中
- 执行命令,将访问本地Docker Registry的证书配置到OpenShift可信证书中。注意其中“registry.${DOMAIN}…5000”是本地Registry的访问域名(注意将 “:” 改成 “…”)。
$ oc create configmap registry-crt -n openshift-config --from-file=registry.${DOMAIN}..5000=${REGISTRY_PATH}/certs/registry.crt
$ oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA":{"name":"registry-crt"}}}' --type=merge
- 最后再次在“Deploy Image”页面上部署“registry.example.internal:5000/apps/busybox”。确认已经可以访问本地Registry上的镜像了。
参考
https://medium.com/@salih.sipahi1/use-your-own-external-registry-with-openshift-container-platform-8bafff3f660
https://tomd.xyz/openshift-red-hat-registry/#enhancement
https://docs.openshift.com/container-platform/4.6/builds/setting-up-trusted-ca.html
https://dzone.com/articles/pulling-images-from-external-container-registry-to
https://cloudowski.com/articles/why-managing-container-images-on-openshift-is-better-than-on-kubernetes/
https://docs.openshift.com/container-platform/4.6/openshift_images/image-streams-manage.html#images-imagestream-import-images-private-registry_image-streams-managing
https://docs.openshift.com/container-platform/4.5/openshift_images/managing_images/using-image-pull-secrets.html
https://docs.openshift.com/container-platform/4.6/builds/setting-up-trusted-ca.html
https://docs.openshift.com/container-platform/4.6/registry/configuring-registry-operator.html
https://docs.openshift.com/container-platform/4.6/registry/configuring_registry_storage/configuring-registry-storage-baremetal.html#configuring-registry-storage-baremetal