OpenShift CronJob 能否从 ImageStream 中受益?

如何解决OpenShift CronJob 能否从 ImageStream 中受益?

我的 CronJob 工作正常,无需使用图像流。

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

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

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

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

解决方法

ImageStream 仅触发 BuildConfigs 和 DeploymentConfigs,根据 https://docs.openshift.com/container-platform/4.7/openshift_images/image-streams-manage.html 。 上游 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 将使用镜像流 cronjob-image 来自项目 my-app-namespace:

$ 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

根本原因

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

,

通过使用 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 中并希望将其应用于多个不同的项目,则不必对项目名称进行硬编码,您可能会受益。


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

这个注解可以放在 CronJobs、Deployment、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","fieldPath": "spec.jobTemplate.spec.template.spec.containers[?(@.name==\"my-container\")].image"
  }
]

这在 Images - Triggering updates on image stream changes 中有说明 - 但文档中的语法似乎是错误的,因此如果您发现手写注释不起作用,请使用 oc set triggers

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?