The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.

Tarefas de inicialização

Muitas vezes, há tarefas de inicialização executadas pelas extensões do Quarkus que devem ser executadas uma única vez. Por exemplo, a inicialização do Flyway ou do Liquibase se enquadra nessa categoria. Mas o que acontece quando as necessidades de dimensionamento de um aplicativo exigem a execução de mais instâncias do aplicativo? Ou o que acontece quando o aplicativo é reiniciado?

Um ambiente comum em que ambos os casos são bastante comuns é o Kubernetes. Para enfrentar esses desafios, o Quarkus permite a externalização de tais tarefas como trabalhos no Kubernetes e utiliza contêineres de inicialização para garantir que uma instância de aplicativo seja iniciada apenas quando os trabalhos de inicialização forem concluídos. Com essa abordagem, mesmo que um aplicativo tenha várias réplicas, a lógica de inicialização só será executada uma vez.

Essa abordagem é refletida nos manifestos gerados pela extensão do Kubernetes .

Desabilitando a funcionalidade

O recurso pode ser explicitamente desativado por tarefa (ativado por padrão). O comportamento padrão pode ser alterado definindo-se a seguinte propriedade como false :

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

ou no OpenShift:

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

Nota : todas as opções de configuração neste guia estão disponíveis tanto no OpenShift quanto no Kubernetes. O restante do guia usará o prefixo de configuração do Kubernetes (prefixo quarkus.kubernetes ), mas todas as opções de configuração também estão disponíveis para o OpenShift (prefixo quarkus.openshift ).

No caso de precisarmos desativar uma tarefa específica, podemos usar a seguinte propriedade:

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

O nome da tarefa é o nome da extensão que executa a inicialização. Exemplos:

Para a Flyway:

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

Para a Liquibase:

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

Para o Liquibase Mongodb:

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

Controle do trabalho gerado

O contêiner do trabalho é bastante semelhante ao contêiner do aplicativo, e a única coisa que muda são as variáveis de ambiente configuradas. Mais especificamente, a seguinte variável de ambiente é adicionada para dizer ao trabalho para sair logo após a inicialização.

QUARKUS_INIT_AND_EXIT=true

A imagem, a política de pull de imagem, a conta de serviço, os volumes, as montagens e as variáveis de ambiente adicionais são herdadas/copiadas do recurso de implementação. Qualquer personalização do recurso de implementação original (por meio de configuração ou extensão) também será refletida no trabalho.

Controle do contêiner de inicialização gerado

O nome do contêiner de inicialização gerado é wait-for-${task name} por padrão. Como o contêiner de inicialização faz parte do mesmo pod que o aplicativo real, ele obterá a mesma conta de serviço (e, portanto, as mesmas permissões) e os mesmos volumes que o aplicativo. É possível personalizar ainda mais o contêiner usando as opções de configuração dos contêineres de inicialização (consulte quarkus.kubernetes.init-containers ou quarkus.openshift.init-containers ).

Exemplos:

Para definir a imagePullPolicy como IfNotPresent no contêiner de inicialização que aguarda o trabalho flyway :

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

Para definir um comando personalizado (como custom-wait-for ) no contêiner de inicialização que aguarda o trabalho flyway :

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

Orquestração das tarefas de inicialização

O recurso de implantação não deve ser iniciado até que o trabalho tenha sido concluído. O padrão típico usado entre os usuários do Kubernetes é o uso de contêineres de inicialização para conseguir isso. Um contêiner de inicialização que wait for o trabalho a ser concluído é suficiente para atender esse requisito.

Usando uma imagem de contêiner wait-for personalizada

Para alterar a imagem wait-for que, por padrão, é groundnuty/k8s-wait-for:no-root-v1.7 , você pode usar:

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

Para alterar a imagem wait-for de um determinado contêiner de inicialização (por exemplo, wait-for-flway ), você pode usar:

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

Configuração de permissões

Para que um contêiner de inicialização possa executar o wait for job , ele precisa ser capaz de realizar operações get no recurso de trabalho. Isso é feito automaticamente e os manifestos gerados incluem os recursos Role e RoleBinding necessários.

Se, por algum motivo, forem necessárias permissões adicionais para o contêiner de inicialização ou para o trabalho, elas poderão ser configuradas por meio da configuração RBAC do Kubernetes .

Nota : O aplicativo, o contêiner de inicialização e o trabalho usam o mesmo ServiceAccount e, portanto, compartilham as mesmas permissões.

Extensão que fornece tarefas de inicialização

Atualmente, esse recurso é usado pelas seguintes extensões: - Flyway - Liquibase - Liquibase MongoDB

Conteúdo Relacionado