2

在不使用图像流的情况下,我的 CronJob 工作正常。

该作业每 15 分钟运行一次,并且始终拉取标记的图像,例如my-cron:stable.

由于图像总是被拉取并且计划告诉集群何时运行我的工作,我从知道我的图像有更新版本中获得什么?

如果图像发生更改并且我的作业有一个正在运行的实例,我希望使用图像的当前版本来完成作业。

在下一次计划运行中,更新的图像被拉出 ( AlwaysPull)。因此,对于 cron 作业的图像流,我似乎没有获得太多跟踪更改。

4

2 回答 2

2

根据https://docs.openshift.com/container-platform/4.7/openshift_images/image-streams-manage.html,ImageStream仅触发 BuildConfigs 和 DeploymentConfigs 。上游 kubernetes 没有 ImageStream 的概念,因此没有触发 'vanilla' 资源类型。CronJob 用于 openshift 和 kubernetes(apiVersion:batch/v1beta1),AFAIK 访问镜像流的唯一方法是使用内部注册表的完整路径,这不太方便。如果更新了镜像流,您的 cronjob 将不会重新启动或不会停止,因为从 kubernetes 的角度来看,只有在触发 cronjob 时才会拉取镜像,然后它只是等待作业完成。

正如我所看到的 - 你没有从使用图像流中获得太多,因为要点之一,使用触发器的能力,不能用于 cronjobs。在 CronJobs 中使用它的唯一原因是如果您出于某种原因直接推送到内部注册表,但这也是一种不好的做法。

请参阅以下链接以供参考:

在这里引用redhat解决方案:

解析度

在项目内部使用图像流运行 cronjob 时,指定图像的完整路径:

[...]
spec:
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            image: docker-registry.default.svc:5000/my-app-namespace/cronjob-image:latest
            name: cronjob-image
[...]

请注意,您也可以在图像之后放置 ':latest'(或特定标签)。

在此示例中,cronjob 将使用来自项目 my-app-namespace 的图像流 cronjob-image:

$ oc get is -n my-app-namespace [...]
imagestream.image.openshift.io/cronjob-image  
docker-registry.default.svc:5000/my-app-namespace/cronjob-image  
latest   27 minutes ago

根本原因

指定的图像没有内部 docker 注册表的完整路径。如果不使用完整路径(即只放置 cronjob-image,OpenShift 将无法找到它。[...]

于 2021-02-26T15:56:34.077 回答
1

通过使用 ImageStream 引用,您可以避免在 Cron 作业定义中包含容器映像存储库主机名主机名和端口以及项目名称。

docker 存储库参考如下所示:

image-registry.openshift-image-registry.svc:5000/my-project/my-is:latest

放置在 Cron 作业上的等效注释的值如下所示:

[
  {
    "from": {
      "kind": "ImageStreamTag",
      "name": "my-is:latest"
    },
    "fieldPath": "spec.jobTemplate.spec.template.spec.containers[?(@.name==\"my-container\")].image"
  }
]

一方面,这更长。另一方面,它包含较少的冗余信息。

因此,与其他类型的 kubernetes 资源相比,Image Streams 并没有为 Cron Jobs 添加大量功能。但是,如果您将 Cron Job YAML 保存在 Git 中并希望将其应用于多个不同的项目,则不必对项目名称进行硬编码可能会受益。


image.openshift.io/triggers包含 pod 的 Kubernetes 原生资源可以通过添加注释来响应图像流标签更新而自动更新。

这个注解可以放在 CronJobs、Deployments、StatefulSets、DaemonSets、Jobs、ReplicationControllers 等上。

最简单的方法是使用oc命令。

$ oc set triggers cronjob/my-cronjob
NAME                 TYPE    VALUE  AUTO
cronjobs/my-cronjob  config         true

$ oc set triggers cronjob/my-cronjob --from-image=my-is:latest -c my-container
cronjob.batch/my-cronjob updated

$ oc set triggers cronjob/my-cronjob
NAME                 TYPE    VALUE                        AUTO
cronjobs/my-cronjob  config                               true
cronjobs/my-cronjob  image   my-is:latest (my-container)  true

oc set triggers命令的效果是将注释添加到 CronJob,我们可以使用以下命令进行检查:

$ oc get cronjob/my-cronjob -o json | jq '.metadata.annotations["image.openshift.io/triggers"]' -r | jq
[
  {
    "from": {
      "kind": "ImageStreamTag",
      "name": "my-is:latest"
    },
    "fieldPath": "spec.jobTemplate.spec.template.spec.containers[?(@.name==\"my-container\")].image"
  }
]

这在图像 - 触发图像流更改上的更新中有所记录- 但文档中的语法似乎是错误的,因此oc set triggers如果您发现您手工编写的注释不起作用,请使用。

于 2021-03-24T13:46:39.113 回答