编辑此页面

初始化任务

Quarkus 扩展经常执行一些只需要运行一次的初始化任务。例如,Flyway 或 Liquibase 的初始化就属于这一类。但是,当应用程序的扩展需求需要运行更多应用程序实例时会发生什么?或者当应用程序重启时又会发生什么?

Kubernetes 是这两种情况都比较常见的一个典型环境。为了应对这些挑战,Quarkus 允许将这些任务外部化为 Kubernetes Job,并使用 init 容器 来确保应用程序实例仅在初始化 Job 完成后才启动。通过这种方法,即使应用程序有多个副本,初始化逻辑也只会运行一次。

这种方法反映在 Kubernetes 扩展 生成的 Manifest 文件中。

禁用该功能

该功能可以为每个任务显式禁用(默认启用)。可以通过将以下属性设置为 false 来更改默认行为

quarkus.kubernetes.init-task-defaults.enabled=false

或在 OpenShift 上

quarkus.openshift.init-task-defaults.enabled=false

注意:本指南中的所有配置选项在 OpenShift 和 Kubernetes 上均可用。本指南的其余部分将使用 Kubernetes(quarkus.kubernetes 前缀)配置前缀,但所有配置选项也可用于 OpenShift(quarkus.openshift 前缀)。

在我们需要禁用特定任务的情况下,我们可以使用以下属性

quarkus.kubernetes.init-tasks."<task name>".enabled=false

任务名称是执行初始化的扩展的名称。示例

对于 Flyway

quarkus.kubernetes.init-tasks.flyway.enabled=false

对于 Liquibase

quarkus.kubernetes.init-tasks.liquibase.enabled=false

对于 Liquibase MongoDB

quarkus.kubernetes.init-tasks.liquibase-mongodb.enabled=false

控制生成的 Job

Job 容器与应用程序容器非常相似,唯一改变的是配置的环境变量。更具体地说,会添加以下环境变量,指示 Job 在初始化后立即退出。

QUARKUS_INIT_AND_EXIT=true

镜像、镜像拉取策略、服务账户、卷、挂载点和附加环境变量将从部署资源继承/复制。对原始部署资源的任何自定义(通过配置或扩展)也将反映在 Job 中。

控制生成的 init 容器

默认情况下,生成的 init 容器的名称是 wait-for-${task name}。鉴于 init 容器与实际应用程序属于同一个 Pod,它将获得与应用程序相同的服务账户(因此也具有相同的权限)和卷。可以通过 init 容器的配置选项(请参阅 quarkus.kubernetes.init-containersquarkus.openshift.init-containers)进行进一步的容器自定义。

示例

要在等待 flyway Job 的 init 容器上将 imagePullPolicy 设置为 IfNotPresent

quarkus.kubernetes.init-containers.flyway.image-pull-policy=if-not-present

要在等待 flyway Job 的 init 容器上设置自定义命令(例如 custom-wait-for

quarkus.kubernetes.init-containers.flyway.command=custom-wait-for

初始化任务的编排

部署资源不应在 Job 完成之前启动。Kubernetes 用户之间使用的典型模式是使用 init 容器来实现此目的。一个 等待 Job 完成的 init 容器足以强制执行此要求。

使用自定义 wait-for 容器镜像

默认情况下,wait-for 镜像为 groundnuty/k8s-wait-for:no-root-v1.7。您可以定义其他镜像

quarkus.kubernetes.init-task-defaults.wait-for-container.image=my/wait-for-image:1.0

imagePullPolicy 也可以进行配置

quarkus.kubernetes.init-task-defaults.wait-for-container.image-pull-policy=if-not-present

要更改特定 init 容器(例如等待 flyway Job 的 init 容器)的 wait-for 镜像,您可以使用

quarkus.kubernetes.init-tasks.flyway.wait-for-container.image=my/wait-for-image:1.0

您可以使用以下命令为此特定 init 容器定义 imagePullPolicy

quarkus.kubernetes.init-tasks.flyway.wait-for-container.image-pull-policy=if-not-present

配置权限

为了使 init 容器能够执行 wait for job,它需要能够对 Job 资源执行 get 操作。这会自动完成,生成的 Manifest 文件包含所需的 RoleRoleBinding 资源。

如果出于任何原因,init 容器或 Job 需要其他权限,则可以使用 Kubernetes RBAC 配置 进行配置。

应用程序、init 容器和 Job 使用相同的 ServiceAccount,因此共享相同的权限。

提供初始化任务的扩展

目前,此功能由以下扩展使用

相关内容