Initialization tasks

通常,Quarkus 扩展会执行一些初始化任务,这些任务旨在运行一次。例如,Flyway 或 Liquibase 初始化属于该类。但是,当需要更多的应用程序实例来运行应用程序的可伸缩性时,会发生什么情况?或者当应用程序重新启动时会发生什么情况? 这两个用例都很常见的一个常见环境就是 Kubernetes。为了解决这些挑战,Quarkus 允许将这些任务外部化为 Kubernetes Jobs,并使用 init containers 以确保只有在初始化作业完成后,应用程序实例才会启动。使用此方法,即使应用程序有多个副本,初始化逻辑也只会运行一次。 这种方法反映在 Kubernetes extension 生成的清单中。

Disabling the feature

可以显式地禁用每个任务中的特性(默认情况下启用)。可以通过将以下属性设置为 false 来更改默认行为:

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

或在 OpenShift 上:

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

Note:本指南中的所有配置选项都适用于 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

Controlling the generated job

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

QUARKUS_INIT_AND_EXIT=true

图像、图像提取政策、服务帐户、卷、挂载和附加环境变量从部署资源继承/复制。对原始部署资源的任何自定义(通过配置或扩展)也会反映在作业中。

Controlling the generated init container

生成的初始化容器的名称默认`wait-for-${task name}`。鉴于初始化容器是与实际应用程序相同的 Pod 的一部分,它将获取与应用程序相同的服务帐户(因此权限)和卷。可以使用初始化容器的配置选项(请参见 quarkus.kubernetes.init-containersquarkus.openshift.init-containers)进一步自定义容器。

示例:

若要将图像提取政策设置为 IfNotPresent 在等待 flyway 作业的初始化容器上:

quarkus.kubernetes.init-containers.wait-for-flyway.image-pull-policy=IfNotPresent

若要设置自定义命令(例如 custom-wait-for)在等待 flyway 作业的初始化容器上:

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

Orchestration of the initialization tasks

在作业完成之前,部署资源不应该启动。Kubernetes 用户中使用的典型模式是使用初始化容器实现此目的。一个`wait for`作业完成的初始化容器足以实现该要求。

Using a custom wait-for container image

若要更改默认`groundnuty/k8s-wait-for:no-root-v1.7` 的 wait-for 图像,可以使用:

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

若要更改特定初始化容器(例如 wait-for-flway)的 wait-for 图像,可以使用:

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

Configuring permissions

为了让一个初始化容器能够执行 wait for job,它需要能够对作业资源执行 get 操作。这是自动完成的,生成的清单包括所需的 RoleRoleBinding 资源。

如果出于任何原因,初始化容器或作业需要其他权限,它们可以通过 Kubernetes RBAC configuration 进行配置。

Note:应用程序、初始化容器和作业使用相同的 ServiceAccount,因此共享相同的权限。

Extension providing Initialization Tasks

当前,此功能由以下扩展使用:- Flyway- Liquibase- Liquibase MongoDB