Como é garantida a alta disponibilidade no Kubernetes

Nota perev. : O artigo original foi escrito por 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 clara e claramente as noções básicas de organização e implementação de alta disponibilidade no Kubernetes. Parece-nos que os autores tiveram sucesso, por isso estamos felizes em compartilhar a tradução.



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.

O Kubernetes é um mecanismo de orquestração de contêiner escalável e confiável. A escalabilidade aqui é determinada pela capacidade de resposta na presença de carga, e a confiabilidade é determinada pela capacidade de resposta na presença de falhas.

Observe que a escalabilidade e a confiabilidade do Kubernetes não significam a escalabilidade e a confiabilidade do aplicativo em execução. O Kubernetes é uma plataforma escalável e confiável, mas todos os aplicativos do K8s ainda precisam passar por certas etapas para se tornar um e evitar gargalos e pontos únicos de falha.

Por exemplo, se o aplicativo for implantado como ReplicaSet ou Deployment, o Kubernetes (re) planeja e (re) lança pods afetados por falhas no nó. No entanto, se o aplicativo for implantado como um pod, o Kubernetes não executará nenhuma ação no caso de uma falha no nó. Portanto, embora o próprio Kubernetes permaneça operacional, a capacidade de resposta do seu aplicativo depende da arquitetura e das decisões de implantação escolhidas.

Esta publicação foca na confiabilidade do Kubernetes. Ela fala sobre como o Kubernetes mantém a capacidade de resposta na presença de falhas.

Arquitetura Kubernetes



Esquema 1. Mestre e trabalhador

No nível conceitual, os componentes do Kubernetes são agrupados em duas classes distintas: componentes mestre e componentes trabalhador .

Os mestres são responsáveis ​​por gerenciar tudo, exceto a execução das lareiras. Os componentes do assistente incluem:


Os trabalhadores são responsáveis ​​por gerenciar a execução das lareiras. Eles têm um componente:


Os trabalhadores são trivialmente confiáveis: uma falha temporária ou permanente de qualquer trabalhador no cluster não afeta o mestre ou outros trabalhadores do cluster. Se o aplicativo for implantado adequadamente, o Kubernetes (re) planeja e (re) inicia qualquer um afetado pela falha do trabalhador.

Configuração de assistente único



Esquema 2. Configuração com um único mestre

Em uma configuração de mestre único, o cluster Kubernetes consiste em um mestre e muitos trabalhadores. Os últimos estão diretamente conectados ao assistente do kube-apiserver e interagem com ele.

Nesta configuração, a capacidade de resposta do Kubernetes depende de:

  • o único mestre
  • conectando trabalhadores a um único mestre.

Como o único mestre é um ponto único de falha, essa configuração não pertence à categoria de alta disponibilidade.

Configuração multi-assistente



Esquema 3. Configuração com muitos mestres

Em uma configuração com vários assistentes, o cluster Kubernetes consiste em muitos assistentes e muitos trabalhadores. Os funcionários se conectam ao kube-apiserver de qualquer mestre e interagem com ele por meio de um balanceador de carga altamente acessível.

Nesta configuração, o Kubernetes é independente de:

  • o único mestre
  • conectando trabalhadores a um único mestre.

Como não há um ponto único de falha nessa configuração, ela é considerada altamente acessível.

Líder e seguidor em Kubernetes


Em uma configuração multi-assistente, vários kube-controller-manager e kube-schedulers estão envolvidos. Se dois componentes modificarem os mesmos objetos, poderão surgir conflitos.

Para evitar possíveis conflitos, o Kubernetes implementa o padrão " mestre-escravo " (líder / seguidor) para o kube-controller-manager e o kube-scheduler. Cada grupo escolhe um líder (ou líder) , e os demais membros do grupo assumem o papel de seguidores. A qualquer momento, apenas um líder está ativo e os seguidores são passivos.


Figura 4. Assistente de componente de implantação redundante em detalhes

Esta ilustração mostra um exemplo detalhado no qual o kube-controller-1 e o kube-scheduler-2 são líderes entre os gerenciadores de controladores de kube e os planejadores de kube. Como cada grupo escolhe seu próprio líder, eles não precisam estar no mesmo mestre.

Seleção de leads


Um novo líder é selecionado pelos membros do grupo no momento do lançamento ou no caso de um líder cair. Lead - um membro com o chamado arrendamento de líder (status de líder atualmente "arrendado").


Diagrama 5. O processo de seleção do componente principal do assistente

Esta ilustração demonstra o processo de seleção principal para o kube-controller-manager e o kube-scheduler. A lógica desse processo é a seguinte:

' ' , :
-
-

' ' , :
- leader lease
-
- holderIdentity 'self'


Rastreamento líder


Os status atuais do líder para o kube-controller-manager e o kube-scheduler são permanentemente armazenados no armazenamento de objetos do kube-system como objetos de terminais no espaço de nomes do kube-system do kube-system . Como dois objetos Kubernetes não podem ter o mesmo nome, tipo (tipo) e espaço para nome ao mesmo tempo, só pode haver um ponto de extremidade para o kube-scheduler e o kube-controller-manager.

Demonstração usando o utilitário do console kubectl :

 $ kubectl get endpoints -n kube-system NAME ENDPOINTS AGE kube-scheduler <none> 30m kube-controller-manager <none> 30m 

O kube-scheduler e o kube-controller-manager do endpoint armazenam informações de líder na anotação control-plane.alpha.kubernetes.io/leader :

 $ kubectl describe endpoints kube-scheduler -n kube-system Name: kube-scheduler Annotations: control-plane.alpha.kubernetes.io/leader= { "holderIdentity": "scheduler-2", "leaseDurationSeconds": 15, "acquireTime": "2018-01-01T08:00:00Z" "renewTime": "2018-01-01T08:00:30Z" } 

Embora o Kubernetes garanta que haverá um mestre por vez, o Kubernetes não garante que dois ou mais componentes do assistente não acreditem erroneamente que eles estão liderando atualmente - esse estado é conhecido como cérebro dividido .

Uma discussão instrutiva sobre o tópico do cérebro dividido e as possíveis soluções pode ser encontrada no artigo Como fazer o bloqueio distribuído de Martin Kleppmann.

O Kubernetes não usa nenhuma contramedida cerebral dividida. Em vez disso, ele confia em sua capacidade de lutar pelo estado desejado ao longo do tempo, o que mitiga as conseqüências das decisões de conflito.

Conclusão


Em uma configuração multimestre, o Kubernetes é um mecanismo de orquestração de contêiner escalável e confiável. Nesta configuração, o Kubernetes fornece confiabilidade usando uma variedade de assistentes e muitos trabalhadores. Muitos mestres trabalham no padrão mestre / escravo, e os trabalhadores trabalham em paralelo. O Kubernetes possui seu próprio processo de seleção de host, no qual as informações do host são armazenadas como objetos de terminais .

Para obter informações sobre como preparar um cluster de alta disponibilidade do Kubernetes para operação, consulte a documentação oficial .

Sobre publicação


Esta publicação faz parte de uma iniciativa conjunta do CNCF, Google e SAP para melhorar o entendimento do Kubernetes e seus conceitos subjacentes.

PS do tradutor


Leia também em nosso blog:

Source: https://habr.com/ru/post/pt427283/


All Articles