As 7 melhores práticas para a operação de contêineres segundo o Google

Nota do tradutor.: O autor do artigo original é Théo Chamley, arquiteto de soluções em nuvem do Google. Neste post do blog do Google Cloud, ele apresentou um resumo conciso de um guia mais detalhado da sua empresa, chamado “Melhores Práticas para Operar Contêineres”. Nele, especialistas do Google reuniram as melhores práticas para a operação de contêineres no contexto do uso do Google Kubernetes Engine e além, abordando uma ampla gama de temas: da segurança ao monitoramento e log. Então, quais práticas na utilização de contêineres são consideradas mais importantes pelo Google?

As 7 melhores práticas para a operação de contêineres segundo o Google

Kubernetes Engine (um serviço baseado em Kubernetes para executar aplicações em contêiner no Google Cloud — nota do tradutor.) — uma das melhores maneiras de executar cargas de trabalho que precisam de escalabilidade. Kubernetes garante o funcionamento perfeito da maioria das aplicações, desde que estejam containerizadas. Mas se você quer que a aplicação seja fácil de gerenciar e aproveitar todas as vantagens do Kubernetes, é necessário seguir as melhores práticas. Elas simplificarão a operação da aplicação, seu monitoramento e depuração, além de aumentar a segurança.

Neste artigo, vamos percorrer a lista do que é importante saber e fazer para o funcionamento eficaz dos contêineres no Kubernetes. Para quem deseja se aprofundar nos detalhes, vale a pena ler o material Melhores Práticas para Operar Contêineres, além de conferir nosso post anterior sobre construção de contêineres.

1. Use os mecanismos nativos de contêiner para log

Se a aplicação está rodando em um cluster Kubernetes, não é necessário muito para os logs. Um sistema de logging centralizado provavelmente já está integrado ao cluster utilizado. No caso do uso do Kubernetes Engine, isso é gerenciado pelo Stackdriver Logging. (Nota do tradutor.: E se você estiver usando uma instalação própria do Kubernetes, recomendamos considerar nossa solução de código aberto — loghouse.) Não complique sua vida e utilize os mecanismos nativos de log do contêiner. Escreva logs em stdout e stderr — eles serão automaticamente capturados, armazenados e indexados.

Se desejado, você também pode escrever logs em formato JSON.. Essa abordagem permitirá adicionar facilmente metadados a eles. E junto com isso, haverá a possibilidade de busca pelos logs no Stackdriver Logging usando esses metadados.

2. Certifique-se de que os contêineres sejam stateless e imutáveis

Para o funcionamento adequado dos contêineres em um cluster Kubernetes, eles devem ser stateless e imutáveis. Quando essas condições são atendidas, o Kubernetes pode realizar seu trabalho, criando e destruindo entidades de aplicação quando e onde necessário.

Stateless significa que qualquer estado (dados persistentes de qualquer tipo) é armazenado fora do contêiner. Para isso, dependendo das necessidades, diferentes tipos de armazenamento externo podem ser utilizados: Armazenamento em Nuvem, Discos Persistentes, Redis, Cloud SQL ou outros bancos de dados gerenciados. (Nota do tradutor.: Para mais informações, consulte também nosso artigo “Operadores para Kubernetes: como executar aplicações stateful».)

Imutável significa que o contêiner não será modificado durante sua vida útil: nenhuma atualização, patch ou alteração na configuração. Se você precisar atualizar o código do aplicativo ou aplicar um patch, crie uma nova imagem e faça o deploy dela. É recomendável manter a configuração do contêiner (porta para escuta, opções do ambiente de execução etc.) externa — em Secrets e ConfigMaps. Eles podem ser atualizados sem a necessidade de criar uma nova imagem de contêiner. Para a fácil criação de pipelines de construção de imagens, você pode usar Cloud Build. (Nota do tradutor.: Para estes fins, utilizamos a ferramenta Open Source dapp.)

As 7 melhores práticas para a operação de contêineres segundo o Google
Exemplo de atualização da configuração do Deployment no Kubernetes usando ConfigMap, montado nos pods como configuração

3. Evite contêineres privilegiados

Você não executa aplicativos como root em seus servidores, certo? Se um invasor conseguir acessar o aplicativo, ele terá acesso com privilégios de root. As mesmas considerações se aplicam para não executar contêineres privilegiados. Se for necessário alterar configurações no host, você pode conceder ao contêiner permissões específicas capabilities usando a opção securityContext no Kubernetes. Se for necessário alterar sysctls, o Kubernetes possui uma anotação separada para isso. Em geral, tente aproveitar ao máximo init- e contêineres sidecar para realizar essas operações privilegiadas. Eles não precisam estar disponíveis para o tráfego interno ou externo.

Se você administrar um cluster, pode recorrer a Política de Segurança de Pod para restrições na aplicação de contêineres privilegiados.

4. Evite executar como root

Os contêineres privilegiados já foram discutidos, mas será ainda melhor se, além disso, você não executar aplicativos dentro do contêiner como root. Se um invasor encontrar uma vulnerabilidade remota com a possibilidade de execução de código em um aplicativo com permissões de root e conseguir sair dos limites do contêiner por meio de uma vulnerabilidade até então desconhecida, ele obterá acesso root no host.

A melhor maneira de evitar isso é, em primeiro lugar, não executar nada como root. Para isso, você pode usar a diretiva USUÁRIO em Dockerfile ou runAsUser no Kubernetes. O administrador do cluster também pode configurar um comportamento forçado usando Política de Segurança de Pod.

5. Torne o aplicativo fácil de monitorar

Assim como o registro, o monitoramento é uma parte essencial da gestão de aplicativos. Uma solução popular para monitoramento na comunidade Kubernetes é Prometheus — um sistema que automaticamente descobre pods e serviços que precisam ser monitorados. (Nota do tradutor.: Veja também nosso relatório detalhado sobre monitoramento com Prometheus e Kubernetes.) Stackdriver é capaz de monitorar clusters Kubernetes e inclui sua própria versão do Prometheus para monitoramento de aplicativos.

As 7 melhores práticas para a operação de contêineres segundo o Google
O painel de monitoramento do Kubernetes no Stackdriver

O Prometheus espera que o aplicativo exponha métricas em um endpoint HTTP. Para isso, estão disponíveis bibliotecas cliente do Prometheus.O mesmo formato é utilizado por outras ferramentas como OpenCensus e Istio.

6. Torne o estado de saúde do aplicativo acessível

A gestão do aplicativo em produção ajuda sua capacidade de informar seu estado para todo o sistema. O aplicativo está em execução? Está em ordem? Está pronto para receber tráfego? Como está se comportando? A forma mais comum de abordar esse problema é a implementação de checagens de saúde (health checks). O Kubernetes possui dois tipos delas: liveness e readiness probes.

Para o liveness probe (checagem de vitalidade) o aplicativo deve ter um endpoint HTTP que retorne a resposta "200 OK" se estiver funcionando e suas principais dependências forem atendidas. Para o readiness probe (checagem de prontidão) O aplicativo deve ter outro endpoint HTTP que retorne uma resposta "200 OK" se o aplicativo estiver em bom estado, os passos de inicialização foram concluídos e qualquer solicitação correta não resulta em erro. O Kubernetes direcionará o tráfego para o contêiner somente se o aplicativo estiver pronto de acordo com essas verificações. Os dois endpoints podem ser combinados se não houver diferença entre os estados de viabilidade (liveness) e prontidão (readiness).

Você pode ler mais sobre isso no artigo correspondente de Sandeep Dinesh, Developer Advocate do Google: "Práticas recomendadas do Kubernetes: Configurando verificações de saúde com sondas de prontidão e viabilidade».

7. Escolha cuidadosamente a versão da imagem

A maioria das imagens públicas e privadas utiliza um sistema de versionamento semelhante ao descrito em Práticas Recomendadas para Construir Contêineres. Se a imagem aplicar um sistema próximo ao versionamento semântico, é necessário considerar a especificidade da rotulagem. Por exemplo, a tag latest pode mudar frequentemente de uma imagem para outra — não se pode depender dela se você precisar de compilações e instalações previsíveis e reprodutíveis.

Você pode usar a tag X.Y.Z ela quase sempre permanece a mesma, mas nesse caso é importante acompanhar todos os patches e atualizações da imagem. Se a imagem utilizada tiver a tag X.Y, essa é uma boa opção de meio-termo. Ao escolhê-la, você recebe automaticamente patches e, ao mesmo tempo, se baseia em uma versão estável do aplicativo.

P.S. do tradutor

Confira também em nosso blog:

Fonte: habr.com

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