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-containers
或 quarkus.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
操作。这是自动完成的,生成的清单包括所需的 Role
和 RoleBinding
资源。
如果出于任何原因,初始化容器或作业需要其他权限,它们可以通过 Kubernetes RBAC configuration 进行配置。
Note:应用程序、初始化容器和作业使用相同的 ServiceAccount
,因此共享相同的权限。
Extension providing Initialization Tasks
当前,此功能由以下扩展使用:- Flyway- Liquibase- Liquibase MongoDB