初始化任务
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-containers
或 quarkus.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 文件包含所需的 Role
和 RoleBinding
资源。
如果出于任何原因,init 容器或 Job 需要其他权限,则可以使用 Kubernetes RBAC 配置 进行配置。
应用程序、init 容器和 Job 使用相同的 |