OpenShift

OpenShift ImageStream指向的镜像是否为内部镜像仓库

ImageStream是OpenShift中的一个特有的资源。在DeploymentConfig/BuildConfig中使用ImageStream和ImageStreamTag时经常会有这样的疑惑:究竟它指向的镜像有没有pull到OpenShift内部的镜像仓库呢?我们使用DeploymentConfig发布应用时,集群会从内部镜像仓库中pull镜像,还是从指向的外部镜像仓库中拉取?
大家来看一下下面这个例子:

$ oc import-image openshift/jenkins:v3.10 --from=docker.io/openshift/jenkins-2-centos7:v3.10 --confirm

猜一猜,以上这条命令是否会将镜像拉取到内部镜像仓库?
答案是否定的,内部镜像仓库并不会拉取镜像本身,只是获取镜像的元数据,将创建的ImageStreamTag openshift/jenkins:v3.10指向镜像docker.io/openshift/jenkins-2-centos7:v3.10。这里的关键就是ImageStream[Tag]的一个配置项:referencePolicy.type。导入镜像时,referencePolicy.type默认为source。
所以如果需要将导入镜像到ImageStream[Tag],并将它自动拉取到内部镜像仓库,需要设置referencePolicy.type为local,在DeploymentConfig第一次部署拉取镜像时,镜像也会导入到私有镜像仓库中。

apiVersion: v1
kind: ImageStream
metadata:
  ...
  tags:
    - ...
      referencePolicy:
        type: Local

在使用oc import-image时需要添加参数--reference-policy='local',如下

$ oc import-image openshift/jenkins:v3.10 --reference-policy='local' --from=docker.io/openshift/jenkins-2-centos7:v3.10 --confirm

或者是通过docker push将镜像推送到镜像仓库

$ docker pull docker.io/openshift/jenkins-2-centos7:v3.10 
$ docker tag docker.io/openshift/jenkins-2-centos7:v3.10 docker-registry-default.example.com/openshift/jenkins-2-centos7:v3.10 
$ docker login -p `oc whoami -t`  -e unused -u unused docker-registry-default.example.com
$ docker push docker-registry-default.example.com/openshift/jenkins-2-centos7:v3.10