Nota perev. : Este artigo continua o ciclo de materiais de um escritor técnico do Google, trabalhando na documentação de Kubernetes (Andrew Chen) e diretor de engenharia de software da SAP (Dominik Tornow). Seu objetivo é explicar de forma clara e clara o básico do Kubernetes. Da última vez que traduzimos um artigo sobre alta disponibilidade , agora falaremos sobre um conceito tão básico no Kubernetes, como pod.
O Kubernetes é um mecanismo de orquestração de contêiner projetado para executar aplicativos em contêiner em vários nós, geralmente chamado de cluster. Nestas publicações, usamos uma abordagem de modelagem de sistemas para melhorar o entendimento do Kubernetes e seus conceitos subjacentes. Recomenda-se aos leitores que já tenham um entendimento básico do Kubernetes.
Os pods são os componentes básicos do Kubernetes, mas mesmo usuários experientes do Kubernetes nem sempre conseguem explicar o que é.
Esta publicação oferece um modelo de pensamento conciso que esclarece as características definidoras dos pods do Kubernetes. Por uma questão de brevidade, tive que omitir alguns outros recursos dos Pods, como
testes de disponibilidade e disponibilidade , compartilhamento de recursos
(incluindo o compartilhamento de namespace recentemente exibido - aprox. Transl. ) , Trabalhar com a rede.
Definição de
Um pod é uma solicitação para executar um ou mais contêineres em um único nó.
Um pod é definido pela apresentação de uma solicitação para
executar um ou mais contêineres em um único nó, e esses contêineres compartilham acesso a recursos como volumes de armazenamento e a pilha de rede.
No entanto, na vida cotidiana, o termo "pod" pode ser usado no sentido dessa
solicitação e no sentido da
coleção de contêineres iniciados em resposta à solicitação. Portanto, na publicação, usaremos a palavra "pod" quando falarmos sobre a solicitação e, para o segundo caso, usar a expressão "conjunto de contêineres".
Os pods são considerados os blocos de construção básicos do Kubernetes porque todas as cargas de trabalho no Kubernetes - por exemplo,
Implantações ,
ReplicaSets e
Jobs - podem ser expressas como pods.
Pod é o
único objeto no Kubernetes que faz com que os contêineres sejam executados.
Sem vagem - sem recipiente!
Esquema 1. Implantação, ReplicaSet, pod e contêineresArquitetura Kubernetes
Esquema 2. Pods, Scheduler e KubeletNesta ilustração, os objetos e componentes correspondentes são destacados. Os pods são representados como
objetos de pod do Kubernetes e trabalham com eles:
Objetos Kubernetes
Figura 3. Objetos KubernetesEsta ilustração mostra os objetos do Kubernetes responsáveis por trabalhar com o pod:
- o objeto de pod real (Pod Object) ;
- Objeto de ligação
- Objeto de nó
O objeto Pod define o conjunto de contêineres que serão iniciados e a
política de reinicialização desejada no caso de uma falha do contêiner, além de monitorar o estado de inicialização.
O objeto de ligação vincula o
objeto de pod ao
objeto de
nó , ou seja, atribui um pod ao host para lançamento posterior.
Objeto de nó representa um nó em um cluster Kubernetes.
Processamento de pod
Esquema 4. Processando pod'aQuando um pod é criado por um usuário ou controlador como o
ReplicaSet Controller ou
Job Controller , o Kubernetes processa o pod em duas etapas:
- O planejador está planejando um pod,
- Kubelet lança o casulo.
Planejamento de pods
Figura 5. Ciclo de controle do agendador do KubernetesA tarefa do
Agendador no Kubernetes é agendar um pod, ou seja, atribuir a ele um nó adequado no cluster Kubernetes para inicialização subsequente.
Associando um objeto de pod a um objeto de nóUm pod é atribuído a um nó (ou
se liga a ele) se e somente se houver um objeto de ligação que possui:
- o espaço para nome é igual ao espaço para nome do pod,
- o nome é igual ao nome do pod,
- o tipo de destino é igual a
Node
, - o nome do destino é igual ao nome do nó.
(Os amantes da aventura podem dar uma olhada na essência do Kelsey Hightower no GitHub, intitulada "
Criando e agendando um pod manualmente "
, um guia passo a passo sobre como criar manualmente um objeto de ligação.)
Lançamento do pod
Diagrama 6. Ciclo de controle de KubeletA tarefa do Kubelet é iniciar o pod, o que significa essencialmente lançar um conjunto de contêineres de pod. O lançamento do pod Kubelet ocorre em duas fases: inicialização e estágio principal.
Como regra, um conjunto de contêineres durante a fase de inicialização realiza trabalhos preparatórios, como a preparação do diretório e da estrutura de arquivos necessários. E o conjunto de contêineres na fase principal já executa as tarefas "mais importantes".
Na vida cotidiana, embora isso não esteja totalmente correto, o termo “pod” geralmente implica um conjunto de contêineres na fase principal ou um significado ainda mais restrito do contêiner “mais importante” da fase principal.
Esquema 7.1. Iniciando um pod, fase de inicialização (init) e fase principal (principal)Durante a inicialização, o Kubelet inicia sequencialmente os contêineres de acordo com as especificações do
.Spec.InitContainers
e na ordem especificada na lista. Para iniciar o pod com sucesso e levando em consideração a política de reinicialização, seus contêineres init devem iniciar e concluir com êxito.
Durante a fase principal, a Kubelet lança simultaneamente os contêineres de acordo com as especificações do
.Spec.Containers
. Aqui, para o lançamento bem-sucedido do pod e levando em consideração a política de reinicialização, seus principais contêineres devem ser iniciados e concluídos com êxito ou funcionar por tempo ilimitado.
Esquema 7.2. Pod de execução, detalhes deste processoNo caso de uma falha do contêiner, quando o contêiner parar de funcionar com um
código de saída diferente de zero (0), o Kubelet poderá reiniciar o contêiner de acordo com a política de reinicialização do pod. Esta política tem um dos seguintes significados:
Always
,
OnFailure
,
Never
.
A política de reinicialização do pod possui semântica diferente para contêineres init e contêineres principais: se o lançamento de contêineres init deve levar à conclusão, os contêineres principais podem não terminar.
Política de reinicialização para contêiner initO contêiner inicial será reiniciado (ou seja, implicará o lançamento de um novo contêiner com a mesma especificação) após a conclusão de seu trabalho somente se as seguintes condições forem atendidas:
- O código de saída do contêiner relata um erro e
OnFailure
política de reinicialização OnFailure
é Always
ou OnFailure
.
Política de reinicialização para o contêiner principalO contêiner principal será reiniciado (ou seja, implica o lançamento de um novo contêiner com a mesma especificação) após a conclusão de seu trabalho somente se as seguintes condições forem atendidas:
- política de reinicialização definida como
Always
ou - A política de reinicialização é definida como
OnFailure
e o código de saída do contêiner relata um erro.
Diagrama 8. Exemplo de uma linha do tempo com um ponto vermelho, simbolizando uma falha do contêinerA ilustração mostra uma possível linha do tempo de lançamento do pod com duas especificações para contêineres init e duas especificações para contêineres principais. Também mostra a criação (de acordo com a política de reinicialização) do novo
contêiner Main Container 1.2 após um problema com o lançamento do
Main Container 1.1 .
Fases do pod
Diagrama 9. Interação do Kubelet com o objeto pod e o tempo de execução do contêiner (tempo de execução do contêiner)O Kubelet recebe as especificações de pod para
.Spec.InitContainers
e
.Spec.Containers
, inicia o conjunto especificado de contêineres e atualiza os valores de
.Status.InitContainerStatuses
para
.Status.InitContainerStatuses
e
.Status.ContainerStatuses
.
O Kubelet
.Status.ContainerStatuses
e
.Status.ContainerStatuses
em um único valor -
.Status.Phase
.
A fase do pod é uma projeção do estado dos contêineres a partir de um conjunto de contêineres, depende de:
- estados e códigos de saída dos contêineres init,
- estados e códigos de saída dos principais contêineres.
Esquema 10. Fases da cápsulaPendente
Fase pendenteUm pod está em fase de espera se e somente se:
- nenhum dos contêineres do pod init está no estado
Terminated
com um erro ( Failure
); - todos os principais contêineres de pod estão no estado
Waiting
.
Running
Fase de execuçãoO pod está na fase de trabalho se e somente se:
- todos os contêineres do pod init estão no estado
Terminated
com êxito; - pelo menos um contêiner de pod principal está no estado
Running
; - nenhum dos contêineres do pod principal está no estado
Terminated
com uma Failure
.
Êxito
Fase de SucessoO pod está em uma fase de sucesso se e somente se:
- todos os contêineres do pod init estão no estado
Terminated
com êxito; - todos os principais contêineres de pod estão no estado
Terminated
com êxito.
Falha
Fase de falhaUm pod está em uma fase de falha se e somente se:
- todos os contêineres de pod estão no estado
Terminated
; - pelo menos um dos contêineres de pod está no estado
Terminated
com um erro ( Failure
).
Desconhecido
Além das fases descritas acima, o pod pode estar em uma fase desconhecida, o que indica a impossibilidade de determinar sua fase atual.
Coleta de lixo para vagens
Diagrama 11. Ciclo de controle do coletor de lixo de podApós o planejamento e o lançamento do pod, um controlador especial no Kubernetes - o
Controlador de Coletor de Lixo do
Pod - é responsável por remover os objetos do pod do
Kubernetes Object Store .
Conclusão
Pod é o componente básico do Kubernetes: pod é definido como a representação de uma solicitação para iniciar um ou mais contêineres em um único nó. Após a criação do pod, o Kubernetes o processa em dois estágios: primeiro, o
Agendador agenda o pod e, em seguida, o Kubelet o lança. Ao longo de seu ciclo de vida, o pod passa por diferentes fases, relatando o status - ou, mais precisamente, o estado de seu conjunto de contêineres - ao usuário e ao sistema.
PS do tradutor
Leia também em nosso blog: