从图像流在 OpenShift Origin 中部署特定图像标签
Deploying a specific image tag in OpenShift Origin from image stream
我已经配置了我的 Gitlab CI 管道,以便它们使用 Docker-in-Docker 构建一个 OCI 图像并将其上传到 Gitlab 自己的注册表。
现在,我想将 CI 管道中构建的图像部署到 OpenShift Origin。注册表中的所有图像都带有 $CI_COMMIT_SHORT_SHA
标记(即:我不使用 "latest")。
我该怎么做?
这是我目前尝试过的方法:
before_script:
- oc login --server="$OPENSHIFT_SERVER" --token="$OPENSHIFT_TOKEN"
- oc project myproject
script:
- oc tag registry.gitlab.com/myproject/backend:$CI_COMMIT_SHORT_SHA backend:$CI_COMMIT_SHORT_SHA
- oc import-image backend:$CI_COMMIT_SHORT_SHA
- oc set image dc/backend backend=myproject/backend:$CI_COMMIT_SHORT_SHA
- oc rollout latest backend
在 oc set image
之前似乎一切正常。我希望它更改部署配置以使用指定的图像标记 ($CI_COMMIT_SHORT_SHA
),但似乎配置并没有真正修改,因此,部署仍然部署旧的(以前的)图像。
我错过了什么?有没有更好的方法从私有注册表部署特定标签?
更新
这是我的部署配置:
kind: DeploymentConfig
apiVersion: apps.openshift.io/v1
metadata:
annotations:
openshift.io/generated-by: OpenShiftNewApp
selfLink: /apis/apps.openshift.io/v1/namespaces/myproject/deploymentconfigs/backend
resourceVersion: '38635053'
name: backend
uid: 02809a3d-...
creationTimestamp: '2019-10-14T23:04:43Z'
generation: 7
namespace: myproject
labels:
app: backend
spec:
strategy:
type: Rolling
rollingParams:
updatePeriodSeconds: 1
intervalSeconds: 1
timeoutSeconds: 600
maxUnavailable: 25%
maxSurge: 25%
resources: {}
activeDeadlineSeconds: 21600
triggers:
- type: ConfigChange
- type: ImageChange
imageChangeParams:
automatic: true
containerNames:
- backend
from:
kind: ImageStreamTag
namespace: myproject
name: 'backend:094971ea'
lastTriggeredImage: >-
registry.gitlab.com/myproject/backend@sha256:ebce...
replicas: 1
revisionHistoryLimit: 10
test: false
selector:
app: backend
deploymentconfig: backend
template:
metadata:
creationTimestamp: null
labels:
app: backend
deploymentconfig: backend
annotations:
openshift.io/generated-by: OpenShiftNewApp
spec:
containers:
- name: backend
image: >-
registry.gitlab.com/myproject/backend@sha256:ebce...
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
securityContext: {}
schedulerName: default-scheduler
status:
observedGeneration: 7
details:
message: image change
causes:
- type: ImageChange
imageTrigger:
from:
kind: DockerImage
name: >-
registry.gitlab.com/myproject/backend@sha256:ebce...
availableReplicas: 1
unavailableReplicas: 0
latestVersion: 4
updatedReplicas: 1
conditions:
- type: Available
status: 'True'
lastUpdateTime: '2019-10-14T23:57:51Z'
lastTransitionTime: '2019-10-14T23:57:51Z'
message: Deployment config has minimum availability.
- type: Progressing
status: 'True'
lastUpdateTime: '2019-10-16T20:09:20Z'
lastTransitionTime: '2019-10-16T20:09:17Z'
reason: NewReplicationControllerAvailable
message: replication controller "backend-4" successfully rolled out
replicas: 1
readyReplicas: 1
"solve" 的一种方法是 ImageChange 触发器侦听特定提交 ID 以外的内容。 docker 中不作为标记存在的某些逻辑名称。说 "default"。
如果你这样做,那么在你的脚本中你唯一需要做的就是
- oc tag registry.gitlab.com/myproject/backend:$CI_COMMIT_SHORT_SHA backend:default
OpenShift 随后会负责更新 DeploymentConfig 中的映像并为您推出新的部署。
OP 询问不使用最新版本的原因。 Latest 有点像 "magical",因为如果您在没有标签的情况下推送到注册表中的图像,它将将该标签命名为 latest。这使得它很容易被意外覆盖。
所以假设您使用 "latest" 作为您在 ImageStream 中收听的标签。如果有人导入 imageStream 会发生什么?它将获取最新的标签并覆盖您手动标记的内容。
如果您希望在您的管道中使用这种控件,请使用我上面所说的 docker 注册表中不存在的 ImageStreamTag 名称。
我已经配置了我的 Gitlab CI 管道,以便它们使用 Docker-in-Docker 构建一个 OCI 图像并将其上传到 Gitlab 自己的注册表。
现在,我想将 CI 管道中构建的图像部署到 OpenShift Origin。注册表中的所有图像都带有 $CI_COMMIT_SHORT_SHA
标记(即:我不使用 "latest")。
我该怎么做?
这是我目前尝试过的方法:
before_script:
- oc login --server="$OPENSHIFT_SERVER" --token="$OPENSHIFT_TOKEN"
- oc project myproject
script:
- oc tag registry.gitlab.com/myproject/backend:$CI_COMMIT_SHORT_SHA backend:$CI_COMMIT_SHORT_SHA
- oc import-image backend:$CI_COMMIT_SHORT_SHA
- oc set image dc/backend backend=myproject/backend:$CI_COMMIT_SHORT_SHA
- oc rollout latest backend
在 oc set image
之前似乎一切正常。我希望它更改部署配置以使用指定的图像标记 ($CI_COMMIT_SHORT_SHA
),但似乎配置并没有真正修改,因此,部署仍然部署旧的(以前的)图像。
我错过了什么?有没有更好的方法从私有注册表部署特定标签?
更新
这是我的部署配置:
kind: DeploymentConfig
apiVersion: apps.openshift.io/v1
metadata:
annotations:
openshift.io/generated-by: OpenShiftNewApp
selfLink: /apis/apps.openshift.io/v1/namespaces/myproject/deploymentconfigs/backend
resourceVersion: '38635053'
name: backend
uid: 02809a3d-...
creationTimestamp: '2019-10-14T23:04:43Z'
generation: 7
namespace: myproject
labels:
app: backend
spec:
strategy:
type: Rolling
rollingParams:
updatePeriodSeconds: 1
intervalSeconds: 1
timeoutSeconds: 600
maxUnavailable: 25%
maxSurge: 25%
resources: {}
activeDeadlineSeconds: 21600
triggers:
- type: ConfigChange
- type: ImageChange
imageChangeParams:
automatic: true
containerNames:
- backend
from:
kind: ImageStreamTag
namespace: myproject
name: 'backend:094971ea'
lastTriggeredImage: >-
registry.gitlab.com/myproject/backend@sha256:ebce...
replicas: 1
revisionHistoryLimit: 10
test: false
selector:
app: backend
deploymentconfig: backend
template:
metadata:
creationTimestamp: null
labels:
app: backend
deploymentconfig: backend
annotations:
openshift.io/generated-by: OpenShiftNewApp
spec:
containers:
- name: backend
image: >-
registry.gitlab.com/myproject/backend@sha256:ebce...
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
securityContext: {}
schedulerName: default-scheduler
status:
observedGeneration: 7
details:
message: image change
causes:
- type: ImageChange
imageTrigger:
from:
kind: DockerImage
name: >-
registry.gitlab.com/myproject/backend@sha256:ebce...
availableReplicas: 1
unavailableReplicas: 0
latestVersion: 4
updatedReplicas: 1
conditions:
- type: Available
status: 'True'
lastUpdateTime: '2019-10-14T23:57:51Z'
lastTransitionTime: '2019-10-14T23:57:51Z'
message: Deployment config has minimum availability.
- type: Progressing
status: 'True'
lastUpdateTime: '2019-10-16T20:09:20Z'
lastTransitionTime: '2019-10-16T20:09:17Z'
reason: NewReplicationControllerAvailable
message: replication controller "backend-4" successfully rolled out
replicas: 1
readyReplicas: 1
"solve" 的一种方法是 ImageChange 触发器侦听特定提交 ID 以外的内容。 docker 中不作为标记存在的某些逻辑名称。说 "default"。
如果你这样做,那么在你的脚本中你唯一需要做的就是
- oc tag registry.gitlab.com/myproject/backend:$CI_COMMIT_SHORT_SHA backend:default
OpenShift 随后会负责更新 DeploymentConfig 中的映像并为您推出新的部署。
OP 询问不使用最新版本的原因。 Latest 有点像 "magical",因为如果您在没有标签的情况下推送到注册表中的图像,它将将该标签命名为 latest。这使得它很容易被意外覆盖。
所以假设您使用 "latest" 作为您在 ImageStream 中收听的标签。如果有人导入 imageStream 会发生什么?它将获取最新的标签并覆盖您手动标记的内容。
如果您希望在您的管道中使用这种控件,请使用我上面所说的 docker 注册表中不存在的 ImageStreamTag 名称。