O que são contêineres de provisionamento do Kubernetes e quando você deve usá-los?
Os contêineres de provisionamento são o mecanismo do Kubernetes para provisionar novos pods. Os contêineres de inicialização são iniciados e fechados antes dos contêineres de aplicativos principais do pod, permitindo que os scripts de bootstrap sejam executados em ordem sequencial.
Neste artigo, mostraremos como adicionar contêineres de inicialização a um pod e veremos alguns casos de uso comuns. Embora os contêineres init sejam configurados de maneira semelhante aos contêineres normais, eles têm algumas diferenças devido à sua finalidade especial.
O papel dos contêineres de inicialização
Os contêineres de provisionamento resolvem os problemas associados à inicialização de aplicativos na primeira execução. Normalmente, os serviços dependem da conclusão bem-sucedida de um script de instalação antes que possam ser totalmente iniciados.
Em sistemas menores, você pode adicionar o script a uma imagem de contêiner de aplicativo existente. No entanto, isso não é o ideal, pois adiciona outra responsabilidade à imagem. Você pode até ter vários estágios separados, cada um com suas próprias dependências e relacionamentos. Adicionar todas essas operações únicas à sua imagem de contêiner principal pode criar rapidamente uma complexidade inchada que é difícil de manter.
Os contêineres de inicialização resolvem esse problema, permitindo que você execute contêineres personalizados antes do início dos contêineres de aplicativos do pod. Cada módulo pode ter vários contêineres de inicialização; eles são garantidos para serem executados sequencialmente, somente depois que o anterior for concluído com êxito.
O Kubernetes inicia os pods regulares após a conclusão de todos os contêineres de inicialização. Se um contêiner de inicialização falhar, ele será reiniciado antes da conclusão. Se o Pod restartPolicy
estiver definido como Never
, o Pod será marcado como com falha.
Adicionando contêineres de inicialização a um pod
Os contêineres de inicialização são definidos em spec.initContainers
um campo de manifesto de pod. Isso é muito semelhante à spec.containers
definição usual.
Aqui está um exemplo de um pod com dois contêineres init conectados:
Use o Kubectl para adicionar um pod ao cluster:
$ kubectl apply -f pod.yaml
pod/init-containers-pod created
Agora, extraia os logs associados a cada um dos contêineres init para garantir que eles foram iniciados:
$ kubectl logs init-containers-pod -c first-init-container
Este é o primeiro contêiner de inicialização
$ kubectl logs init-containers-pod -c second-init-container
This is the second init container
Você pode usar a maioria das propriedades disponíveis para manifestos de contêiner do Kubernetes no initContainers
campo. Isso inclui volumes, portas, variáveis de ambiente e contextos de segurança.
Os contêineres de inicialização também oferecem suporte a limites de recursos, mas são tratados de maneira diferente dos contêineres normais. O maior valor dos limites de recursos declarados por todos os contêineres de provisionamento é escolhido como limite efetivo do módulo, a menos que seja menor que a soma dos limites dos contêineres de aplicativos do módulo. Este valor calculado será utilizado para fins de planejamento.
Uma das limitações do provisionamento de contêineres é a falta de suporte para probes. Você não pode atribuir campos a objetos livenessProbe
, readinessProbe
, ou container em um campo. Os contêineres de inicialização são um mecanismo separado que você pode usar no lugar de, ou em conjunto com, probes anexados aos contêineres do seu aplicativo principal.startupProbe
initContainers
Erros comuns
Existem alguns erros comuns ao usar contêineres init. Aqui estão alguns detalhes a serem lembrados:
- Os contêineres de inicialização são executados sempre que o pod é reiniciado. Isso significa que suas operações de contêiner de inicialização devem ser idempotentes para que possam ser executadas duas vezes no mesmo pod. Se um pod for reiniciado, todos os seus contêineres de inicialização serão executados novamente.
- Não há suporte para alterações
initContainers
no campo Pod, com uma exceção. Você pode alterarimage
o campo. Isso reiniciará o módulo e iniciará novos contêineres de inicialização. - Os nomes dos contêineres de inicialização devem ser exclusivos em todos os contêineres em um pod. Isso inclui outros contêineres de inicialização e os contêineres do seu aplicativo. Você verá um erro de validação YAML em seu console se tentar aplicar um manifesto que viole essa regra.
- Os pods têm uma
Initialized: False
condição quando os contêineres init estão em execução. Isso é visível sobConditions
o título na inicializaçãokubectl describe my-pod
.
Você também pode verificar se os contêineres de inicialização do pod foram concluídos usando kubectl get
o comando:
$ kubectl get init-containers-pod
NOME PRONTO STATUS REINICIA IDADE
init-containers-pod 0/1 Init:1/2 0 1m
Nesse caso, STATUS
a coluna indica que o módulo possui dois contêineres de inicialização, um dos quais concluído com êxito. Depois que todos os contêineres de inicialização forem concluídos, o Kubernetes iniciará os contêineres do aplicativo e o status do pod mudará para Running
.
Quando usar contêineres de inicialização
Os contêineres de provisionamento são ideais quando você precisa inicializar novas implantações do seu aplicativo de alguma forma. Eles atendem a tarefas de pré-requisitos especiais que dependem de ferramentas fora de sua imagem de contêiner principal.
Aqui estão algumas situações em que você pode querer usar contêineres init:
- Criando arquivos de configuração a partir de variáveis de ambiente.
- Pré-preenchimento de caches usados pelo seu aplicativo.
- Migrando e preenchendo uma instância de banco de dados.
- Baixe e instale plug-ins de aplicativos no volume.
- Bloquear a inicialização do aplicativo até que as dependências (como bancos de dados ou APIs externas) estejam disponíveis.
Outra maneira de realizar algumas dessas tarefas é usar uma avaliação Ready ou Run . No entanto, há uma diferença na intenção: os probes são projetados principalmente para comunicar o estado do contêiner ao Kubernetes, enquanto os contêineres de provisionamento são projetados para executar ações durante a inicialização do pod.
Resumo
Os contêineres de inicialização são uma maneira de executar rotinas de inicialização de primeira execução em um pod do Kubernetes. Eles podem ser usados para bloquear ou atrasar o lançamento de um contêiner de aplicativo enquanto você espera que as dependências fiquem disponíveis ou os scripts de bootstrap sejam concluídos.
A funcionalidade dos contêineres de inicialização às vezes se sobrepõe às verificações de inicialização e prontidão. Você pode usar um probe quando a ação que deseja executar é basicamente bloquear a execução do aplicativo até que uma condição seja atendida. Eles contam com seu script já existente na imagem de contêiner do seu aplicativo. Um contêiner de inicialização é a melhor escolha se você deseja executar ações especiais sem sobrecarregar a imagem principal com utilitários de uso único.
Deixe um comentário