O que são contêineres iniciais do Kubernetes e quando devo usá-los?

0
22


Os contêineres de inicialização são um mecanismo do Kubernetes para inicializar novos pods. Os contêineres de inicialização são iniciados e encerrados antes dos contêineres de aplicativos principais do seu pod, oferecendo a oportunidade de executar scripts de inicialização em ordem sequencial.

Neste artigo, mostraremos como adicionar contêineres de inicialização a um pod e considerar 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 especializada.

O papel dos contêineres de inicialização

Os contêineres de inicialização resolvem os desafios associados à inicialização de aplicativos pela primeira vez. É comum que os serviços dependam da conclusão bem-sucedida de um script de configuração antes que possam ser totalmente iniciados.

Em sistemas menores, você pode adicionar o script à imagem de contêiner do seu aplicativo existente. No entanto, isso não é o ideal, pois adiciona outra responsabilidade à imagem. Você pode até ter vários estágios diferentes para concluir, cada um com suas próprias dependências e relacionamentos. Adicionar todas essas operações únicas à sua imagem de contêiner pai pode criar rapidamente uma complexidade inchada que é difícil de manter.

Os contêineres de inicialização resolvem isso permitindo que você execute contêineres especializados antes que os contêineres de aplicativo de um pod sejam iniciados. Cada Pod pode ter vários contêineres iniciais; eles são garantidos para serem executados sequencialmente, somente depois que o anterior for concluído na saída bem-sucedida.

O Kubernetes inicia os contêineres de pod normais após a conclusão de todos os contêineres de inicialização. Se um contêiner de inicialização falhar, ele será reiniciado até ser concluído. quando o pod restartPolicy está configurado para Nevero pod é marcado como com falha.

Adicionar contêineres domésticos a um pod

Os contêineres de inicialização são definidos no spec.initContainers Campo de manifesto do pod. Isso é muito parecido com um normal spec.containers definição.

Veja um exemplo de um Pod com dois contêineres iniciais anexados:

apiVersion: v1
kind: Pod
metadata:
  name: init-containers-pod
spec:
  containers:
    - name: app-container
      image: busybox:latest
      command: ["echo", "Started app"]
  initContainers:
    - name: first-init-container
      image: busybox:latest
      command: ["echo", "This is the first init container"]
    - name: second-init-container
      image: busybox:latest
      command: ["echo", "This is the second init container"]

Use o Kubectl para adicionar o pod ao cluster:

$ kubectl apply -f pod.yaml
pod/init-containers-pod created

Agora recupere os logs associados a cada um dos contêineres de inicialização para confirmar que eles foram executados:

$ kubectl logs init-containers-pod -c first-init-container
This is the first init container

$ 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 em um 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 valor mais alto dos limites de recursos declarados por todos os contêineres de inicialização é selecionado como o limite efetivo para o pod, a menos que seja menor que a soma dos limites nos contêineres do aplicativo no pod. Este valor calculado será utilizado para fins de programação.

Uma limitação dos contêineres init é a falta de suporte para testes. você não pode atribuir livenessProbe, readinessProbequalquer startupProbe campos para objetos de contêiner no initContainers campo. Os contêineres de inicialização são um mecanismo separado que você pode usar em vez de ou em conjunto com sondas conectadas aos contêineres do seu aplicativo principal.

Erros comuns

Existem algumas armadilhas comuns ao usar contêineres init. Aqui estão alguns detalhes para lembrar:

  • Os contêineres de inicialização são executados sempre que seu pod é reiniciado. Isso significa que as operações do seu contêiner de inicialização devem ser idempotentes para que sejam resistentes a serem executadas duas vezes no mesmo Pod. Se o pod for reiniciado, todos os seus contêineres de inicialização serão executados novamente.
  • Alterações em um pod initContainers não são permitidos, com uma exceção. Você pode modificar o image campo. Isso fará com que o pod seja reinicializado e execute seus novos contêineres de inicialização.
  • Os nomes dos contêineres iniciais devem ser exclusivos em todos os contêineres no 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.
  • As vagens possuem Initialized: False condição quando os contêineres init estão em execução. Isso é visível sob o Conditions indo quando você corre kubectl describe my-pod.

Você também pode verificar se os contêineres de inicialização de um pod foram concluídos usando o kubectl get domínio:

$ kubectl get init-containers-pod
NAME                   READY     STATUS    RESTARTS    AGE
init-containers-pod    0/1       Init:1/2  0           1m

Neste caso, o STATUS A coluna mostra que o Pod tem dois contêineres iniciais, um dos quais foi 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 estado do pod mudará para Running.

Quando usar contêineres de inicialização

Os contêineres de inicialização são ideais quando novas implementações de seu aplicativo precisam ser inicializadas de alguma forma. Eles atendem a tarefas de pré-execução dedicadas que dependem de ferramentas fora de sua imagem de contêiner pai.

Aqui estão algumas situações em que você pode usar contêineres init:

  • Geração de arquivos de configuração a partir de variáveis ​​de ambiente.
  • Pré-preenchimento de caches usados ​​pelo seu aplicativo.
  • Migrar e propagar uma instância de banco de dados.
  • Baixe e instale plug-ins de aplicativos em um volume.
  • Bloqueie a inicialização do aplicativo até que as dependências estejam disponíveis (como bancos de dados ou APIs externas).

Outra maneira de realizar algumas dessas tarefas é com uma sonda de configuração ou inicialização. No entanto, há uma diferença na intenção: as sondas são projetadas principalmente para comunicar o estado de um contêiner ao Kubernetes, enquanto os contêineres init são projetados como uma maneira de executar comportamento 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 a inicialização do contêiner do aplicativo enquanto ele aguarda a disponibilidade das dependências ou a conclusão dos scripts de inicialização.

A funcionalidade dos contêineres de inicialização às vezes se sobrepõe aos testes de inicialização e configuração. Você pode usar um probe quando a atividade que deseja realizar está principalmente relacionada ao bloqueio do aplicativo de iniciar até que uma condição seja atendida. Eles são baseados em seu script que já existe na imagem de contêiner do seu aplicativo. Um contêiner de bootstrap é a melhor escolha quando você deseja executar ações especializadas sem sobrecarregar sua imagem principal com utilitários de uso único.