Como o Airbnb simplificou o fluxo de trabalho do Kubernetes para mais de 1.000 engenheiros

Como o Airbnb simplificou o fluxo de trabalho do Kubernetes para mais de 1.000 engenheiros

Melanie Cebula, engenheiro de infra-estrutura na Airbnb, deu uma palestra na Qcon Londres sobre a ferramental e estratégias adotadas pela Airbnb para apoiar mais de 1.000 engenheiros simultaneamente a configurar e a implementar mais de 250 serviços críticos para Kubernetes (com uma frequência de cerca de 500 deploys por dia em média). Também foi fundamental a automação de fluxos de trabalho comuns para engenheiros e o uso das mesmas ferramentas em todos os ambientes.

O kube-gen é a ferramenta interna do Airbnb que pode obter os parâmetros de  serviços (definidos em um único arquivo YAML) e gerar a configuração completa do serviço do Kubernetes, adicionando toda a configuração padrão necessária. No passado, o Airbnb utilizou mecanismos de herança de arquivos para configuração (como em livros de receitas do Chef) levava efeitos de falha de infraestrutura em cascata. Portanto, um dos objetivos era reduzir o raio de explosão (blast radius) de possíveis erros usando modelos YAML para configuração de serviço.

O outro grande objetivo do kube-gen era abstrair as complexidades de configuração e ferramentas do Kubernetes para permitir que as equipes de engenharia mantivessem a propriedade de seus serviços, com os níveis de isolamento necessários (parcialmente garantidos pelos namespaces gerados automaticamente baseados em nomes de ambiente padronizados), mas sem longa curva de aprendizado (long learning curve). Embora o kube-gen não esteja disponível publicamente, pois aborda o contexto especifico do Airbnb, o Cebula apontou algumas alternativas de código aberto: helm (gerenciamento de pacotes), kustomize (configuração via file inheritance) e kapitan (configuração via templating).

Imagem: arquivos de configuração de serviço no YAML personalizado são traduzidos nos arquivos de configuração necessários no Kubernetes (um conjunto por ambiente definido no YAML personalizado) e aplicados ao cluster do Kubernetes (crédito: Melanie Cebula, Airbnb).

Outras estratégias para promover configurações de serviços homogêneas e fáceis de evoluir incluem a criação de um novo repositório de service skeleton em um comando, validação no tempo de construção e implantação de arquivos de configuração (não apenas sintaxe, mas também problemas conhecidos em valores fornecidos como nome ou proprietário inválido no projeto) e versionando a configuração de serviço (gerada).

O repositório git de um serviço recém-criado inclui arquivos padrões de aplicativos e de infraestrutura (inclusive CI/CD), preenchimento automático com padrões e boas práticas (como a escalabilidade automática por padrão ou geração de documentação). As configurações do serviço de controle de versão (com um campo especifico no arquivo YAML) permitem marcar versões com problemas (para que elas nunca sejam reimplantadas) – podem ser problemas no próprio Kube-gen ou serviço específico – além de distribuir diferentes versões em diferentes canais (por exemplo, estável vs beta).

Figura: exemplos de arquivos YAML de configuração de serviço do Airbnb, incluindo um campo de versão (crédito: Melanie Cebula, Airbnb)

 

K é outra ferramenta interna do Airbnb. K é principalmente um wrapper opinativo para o kubectl que também filtra a saída detalhada de alguns kubectl. K também suporta algumas funcionalidades extras, como agrupar a ferramenta kube-gen mencionada anteriormente e building/pushing as imagens do Docker.

O objetivo dessa ferramenta era automatizar fluxos de trabalho comuns, simplificando e padronizando o trabalho de engenharia, abstraindo parte da complexidade das ferramentas do Kubernetes. Mas também levou os desenvolvedores e engenheiros de infraestrutura a falar uma linguagem comum e usar as mesmas ferramentas, o que fortaleceu a colaboração, de acordo com o Cebula.

Um fluxo de trabalho típico seria começar com k generate para gerar arquivos do Kubernetes, depois k build para construir imagens do Docker e enviar para o registro e, finalmente, implementar para criar espaços de nomes do Kubernetes e aplicar os arquivos do Kubernetes, aguardando um status de implantação final. Os serviços são criados e implantados da mesma maneira, independentemente do ambiente (ou seja, uma máquina local, IC, preparação ou produção). Também é possível executar o k diagnose, que conta com alguns plugins criados pelo Airbnb: kubectl diagnose e kubectl podevents. O objetivo era automatizar etapas manuais comuns ao depurar um problema de implementação: coletar informações sobre contêineres não-prontos, localizar eventos de conjuntos relacionados e obter os registros desses contêineres.

Finalmente, o Cebula, mencionou alguns desafios remanescentes para a adoção da jornada Kubernetes do Airbnb, em particular relacionadas à migração de milhares de serviços existentes que exigem melhor suporte e escalonamento multicluster (alguns serviços usam centenas de réplicas), manipulando mais serviços com alto nível de memória e movimentando toda a configuração para um modelo de fluxo de trabalho GitOps com controladores personalizados (custom controllers).

Fonte: InfoQ