Orquestra de Performance

Dificilmente seria errado dizer que o melhor dos homens
encontrar alegria através do sofrimento.
Ludwig van Beethoven

Orquestra de Performance

Sou Sergey, trabalho na Yandex.Money na equipe de pesquisa de desempenho. Quero contar a vocês o início da história sobre nosso caminho até o uso da orquestração - como escolhemos os instrumentos e o que levamos em consideração. Todos os acontecimentos do artigo acontecem em tempo real, então vocês, queridos leitores, estão acompanhando quase ao vivo o desenrolar da situação.

Por que precisamos de um maestro em nossa equipe?

Quem é um maestro? Do frag. diriger - administrar, dirigir, liderar - no mundo da música - é a pessoa que lidera o aprendizado e a execução da música em conjunto. No nosso caso, este lugar é ocupado por sistemas de orquestração e automação.

O seu papel não difere do papel de um maestro na música - são necessários para ajudar a equipa, orientar e organizar a sua execução.

Via de regra, uma equipe possui um determinado conjunto de capacidades – vamos chamá-los de servidores – nas quais implementam seus projetos.

A abordagem para obter e operar esses servidores é variada. Alguns exemplos:

  • A equipe faz uma solicitação, por exemplo, ao grupo de operações, para que lhe forneça recursos com determinados parâmetros.
  • A equipe de operações fornece a quantidade necessária – cloud ou bare metal – e se compromete a mantê-los em boas condições de acordo com o SLA. A configuração também é realizada pela equipe de operações.
  • A equipe recebe apenas recursos de nuvem ou bare metal do grupo de operações e os configura por conta própria.
  • A própria equipe “compra” os recursos e os mantém/configura de forma totalmente independente.

Nossa equipe utiliza servidores que precisam de suporte - atualização do sistema operacional, instalação de novos pacotes, etc.

Para nós, nós os dividimos em dois tipos principais:

  • grupo de tanques,
  • grupo de serviço.

O grupo de tanques consiste em hosts com Yandex.Tank.

O grupo de serviços inclui tudo relacionado à manutenção - são diversos serviços para dar suporte ao ciclo de lançamento, gerar relatórios automáticos, etc.

A certa altura, tudo isso se tornou inconveniente de gerenciar manualmente, e pensamos em automatizar todo o processo, desde o “carregamento” dos servidores até o desenvolvimento, liberação e lançamento do nosso serviço interno.

Por que é necessário um maestro, mesmo que a própria orquestra possa tocar?

Para começar, dominamos o Ansible e começamos a “derramar” nossos servidores bare metal para ficarmos menos dependentes dos administradores de sistema - todos ganham aqui, ganhamos novas habilidades e aliviamos os administradores de parte do trabalho que eles sempre têm o suficiente sem nós . Nós nos esforçamos para desenvolver além de nossa especialidade e autonomia da equipe, tanto quanto possível.

Na empresa, o trabalho com Ansible está configurado e regulamentado há bastante tempo, por isso integrámos facilmente a nossa solução neste processo.

Atualmente, o pool de hosts consiste em três funções do Ansible:

  • a primeira função instala o sistema operacional,
  • o segundo executa configurações básicas para o host, autorização LDAP, por exemplo,
  • e o terceiro instala Yandex.Tank e dependências relacionadas em um contêiner docker.

Passemos aos serviços que utilizamos dentro da equipe.

Para nossas tarefas, usamos Kotlin e Python igualmente, e um pouco mais de Golang. Para unificar o desenvolvimento e implantação de nossos serviços, decidimos empacotá-los em contêineres Docker. Isso lhe dá a liberdade de escolher uma linguagem de programação e ao mesmo tempo regula um formato de entrega uniforme para sua aplicação.

Uma pequena observação sobre o ipv6 no Docker

Alguns dos serviços com os quais interagimos só estão disponíveis via ipv6, então tivemos que descobrir como fazer ipv6 para containers.

De acordo com a documentação do ipv6 no site oficial do Docker, o ipv6 é habilitado adicionando parâmetros ao daemon.json:

{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}

Neste caso, o provedor deverá emitir uma sub-rede ipv6, que você irá cadastrar em fixed-cidr-v6.
No entanto, escolhemos outra opção - NAT ipv6, e aqui está o porquê:

  • Agora janela de encaixe não pode usar apenas com ipv6.
  • Ter um endereço roteável globalmente em cada contêiner significa que todas as portas (mesmo as não publicadas) serão expostas a todos, a menos que uma filtragem adicional seja realizada.
  • proxy userland para publicar portas, iptables apenas para ipv4.

NAT ipv6 é contêiner docker, que gerencia as regras em ip6tables e as edita ao adicionar um novo contêiner.

Para que esta solução funcionasse corretamente, foi necessário realizar uma série de outras manipulações. Certifique-se de inicializar ip6table_nat no sistema. A presença de um módulo instalado no sistema não garante que o módulo será carregado no kernel na inicialização. Encontramos isso quando recebemos este erro ao executar um contêiner com NAT em um novo host:

2019/01/22 14:59:54 running [/sbin/ip6tables -t filter -N DOCKER --wait]: exit status 3: modprobe: can't change directory to '/lib/modules': No such file or directory
ip6tables v1.6.2: can't initialize ip6tables table `filter': Table does not exist (do you need to insmod?)

O problema foi resolvido após adicionar inicialização à função Ansible usando o módulo modprobe e carregá-lo na inicialização do sistema operacional usando lineinfile:

- name: Add ip6table_nat module
 modprobe:
   name: ip6table_nat
   state: present
- name: Add ip6table_nat to boot
 lineinfile:
   path: /etc/modules
   line: 'ip6table_nat'

A propósito, tem um bom no hub artigo, que descreve de forma breve e clara as vantagens e desvantagens de um ou outro método para executar o ipv6 no docker.

Mas voltemos à nossa pergunta feita no início:
Por que é necessário um maestro, mesmo que a própria orquestra possa tocar?

Agora todos imaginam como jogar no nosso time:

  • o processo de “derramar” servidores foi criado,
  • o desenvolvimento e a implantação de serviços são unificados.

Surge uma questão razoável: como implantar, atualizar e controlar nossos serviços em contêineres Docker de maneira eficiente e automática possível?

Apesar de cada membro da orquestra conhecer a sua parte, ele pode ficar confuso e se desviar da ideia original. Aqui chegamos à conclusão de que sem um maestro a nossa orquestra não ensaiará eficazmente e tocará de forma coerente. O maestro é responsável por todos os parâmetros da performance, garantindo que tudo esteja unido por um único andamento e clima.

Como conseguir um bom maestro com investimento mínimo?

O tema orquestração está bastante desenvolvido no mercado. Mas primeiro vamos falar sobre ferramentas auxiliares que podem ajudar o maestro.

Cônsul - um sistema que oferece duas funções principais:

  • descoberta de serviço,
  • armazenamento distribuído de valores-chave.

Em nossa orquestra, o Consul será responsável por cadastrar os serviços e armazenar suas configurações. Existem duas opções de registro:

  • Ativo é quando o serviço se registra usando a API HTTP;
  • Passivo – o serviço deve ser cadastrado manualmente.

Vault é um repositório que padroniza e unifica o armazenamento seguro e o manuseio de segredos – senhas, certificados.
Aqui estão os benefícios que obteremos ao usar esta ferramenta:

  • Um único centro para criar e armazenar segredos e gerenciar seu ciclo de vida usando a API HTTP.
  • Transit Secrets Engine - criptografia e descriptografia de dados sem salvá-los. A capacidade de transmitir dados de forma criptografada por canais de comunicação não seguros.
  • Políticas de acesso fáceis de configurar.
  • Auditoria de acesso a segredos.
  • A capacidade de criar sua própria CA (Autoridade de Certificação) para gerenciar certificados autoassinados em sua infraestrutura.

Considerando todas as nossas necessidades, duas opções foram adequadas para o papel de maestro - Kubernetes e Nomad.

Kubernetes

Quantos artigos e livros já foram escritos sobre ele (aqui tal, por exemplo), há relatos que escreverei brevemente - esta é uma colheitadeira universal que pode fazer quase tudo. O preço disso é que nem sempre é fácil configurar e manter um cluster no Kubernetes.

Nômade

Ferramenta da HashiCorp, empresa conhecida pelo cônsul e cofre mencionados acima.

Descobrimos que o Nomad é muito mais fácil de instalar e configurar do que o Kubernetes. Um arquivo binário funciona tanto no modo servidor quanto no modo cliente. Ao mesmo tempo, o Nomad cobre toda a lista de tarefas que queremos resolver: gerenciamento de cluster, agendador rápido, suporte multidatacenter. Além disso, ao usar o consul e o vault, obtemos uma integração mais estreita para orquestrar nossos serviços.

O que está em andamento:

  • servidores preparados para implantação do Consul,
  • a configuração do cluster nomad será inserida no Consul, com a ajuda da qual o nomad deverá ser implantado automaticamente,
  • Paralelamente, instalaremos o vault para armazenar segredos.

Pergunta para o público: vale a pena contratar um maestro para essas tarefas ou a orquestra vai bem sem ele? Conte-nos nos comentários o que você pensa sobre isso.

Assine nosso blog e fique em contato - em breve contaremos o que aconteceu no final e se configuramos o cluster nômade da maneira que queríamos.

Venha para o nosso aconchegante bate-papo por telegrama, onde você sempre pode pedir conselhos, ajudar colegas e apenas conversar sobre pesquisas de produtividade e muito mais.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção DDoS, servidores VPS VDS 🔥 Compre hospedagem de sites confiável com proteção contra DDoS, servidores VPS/VDS | ProHoster