7 práticas recomendadas de contêineres do Google

Nota perev. : O autor do artigo original é Théo Chamley, arquiteto do Google Cloud. Nesta publicação do blog Google Cloud, ele apresentou um breve extrato do gerenciamento mais detalhado de sua empresa, chamado " Melhores práticas para operação de contêineres ". Nele, os especialistas do Google reuniram as práticas recomendadas para operar contêineres no contexto do uso do Google Kubernetes Engine e não apenas abordando uma ampla gama de tópicos: da segurança ao monitoramento e registro no diário. Então, quais práticas de contêiner são mais importantes para o Google?



O Kubernetes Engine (serviço baseado no Kubernetes para executar aplicativos em contêiner no Google Cloud - aprox. Transl. ) É uma das melhores maneiras de executar cargas de trabalho que precisam ser dimensionadas. O Kubernetes garantirá o bom funcionamento da maioria dos aplicativos se eles estiverem em contêiner. Mas se você deseja que o aplicativo seja fácil de gerenciar e queira tirar o máximo proveito do Kubernetes, siga as práticas recomendadas. Eles simplificarão a operação do aplicativo, seu monitoramento e depuração, além de melhorar a segurança.

Neste artigo, examinaremos uma lista do que você precisa saber e fazer para o funcionamento eficiente de contêineres no Kubernetes. Aqueles que desejam se aprofundar nos detalhes devem ler o material de práticas recomendadas para operação de contêineres , bem como prestar atenção ao nosso posto de montagem anterior .

1. Use mecanismos de contêiner nativos para log


Se o aplicativo estiver sendo executado em um cluster Kubernetes, não será necessário muito para logs. Um sistema de log centralizado provavelmente já está integrado ao cluster que você está usando. No caso de usar o mecanismo Kubernetes , o Stackdriver Logging é responsável por isso. ( Observação : se você usar sua própria instalação do Kubernetes, recomendamos que você analise com mais detalhes nossa solução de código aberto - loghouse .) Não complique sua vida e use os mecanismos nativos para registrar contêineres. Escreva os logs em stdout e stderr - eles serão automaticamente recebidos, salvos e indexados.

Se desejar, você também pode gravar logs no formato JSON . Essa abordagem facilita a adição de metadados a eles. E com eles no Stackdriver Logging será possível pesquisar os logs usando esses metadados.

2. Garanta que os contêineres sejam apátridas e imutáveis


Para que os contêineres funcionem corretamente em um cluster Kubernetes, eles devem ser sem estado e imutáveis. Quando essas condições forem atendidas, o Kubernetes poderá fazer seu trabalho, criando e destruindo entidades de aplicativos quando e onde necessário.

Sem estado 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 estar envolvidos: armazenamento em nuvem , discos persistentes , Redis , Cloud SQL ou outros bancos de dados gerenciados. ( Nota, traduza : Leia mais sobre isso em nosso artigo " Operadores para o Kubernetes: como executar aplicativos com estado ".)

Imutável significa que o contêiner não será modificado durante sua vida útil: sem atualizações, patches, alterações de configuração. Se você precisar atualizar o código do aplicativo ou aplicar um patch, crie uma nova imagem e implante-a. Recomenda-se mover a configuração do contêiner (porta para escuta, opções para o tempo de execução, etc.) para o exterior - em Secrets e ConfigMaps . Eles podem ser atualizados sem a necessidade de criar uma nova imagem de contêiner. Você pode usar o Cloud Build para criar facilmente pipelines com montagem de imagem. ( Observação : usamos a ferramenta de código aberto dapp para esse fim.)


Exemplo de atualização da configuração de implantação no Kubernetes usando o ConfigMap montado em pods como uma configuração

3. Evite recipientes privilegiados


Você não executa aplicativos como root em seus servidores, certo? Se um invasor invadir o aplicativo, ele obterá acesso root. As mesmas considerações se aplicam à não execução de contêineres privilegiados. Se você quiser alterar as configurações no host, poderá fornecer recursos específicos ao contêiner usando a opção securityContext no Kubernetes. Se você precisar modificar os sysctls , o Kubernetes terá uma anotação separada para isso. Em geral, tente maximizar o uso de containers init e sidecar para executar essas operações privilegiadas. Eles não precisam de acessibilidade para tráfego interno ou externo.

Se você estiver administrando um cluster, poderá usar a Política de Segurança do Pod para restringir o uso de contêineres privilegiados.

4. Evite rodar como root


Já dissemos sobre contêineres privilegiados, 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 capacidade de executar código em um aplicativo com privilégios de root, após o qual ele poderá sair do contêiner através de uma vulnerabilidade ainda desconhecida, ele obterá a raiz no host.

A melhor maneira de evitar isso é não executar nada como raiz em primeiro lugar. Para fazer isso, você pode usar a diretiva USER no Dockerfile ou runAsUser no Kubernetes. O administrador do cluster também pode configurar a imposição usando a Política de Segurança do Pod .

5. Facilite o monitoramento do aplicativo.


Como o registro, o monitoramento é parte integrante do gerenciamento do aplicativo. Uma solução de monitoramento popular na comunidade Kubernetes é o Prometheus , um sistema que detecta automaticamente pods e serviços que exigem monitoramento. ( Nota : Veja também nosso relatório detalhado sobre o monitoramento usando o Prometheus e o Kubernetes.) O Stackdriver pode monitorar clusters do Kubernetes e inclui sua própria versão do Prometheus para monitorar aplicativos.


Painel Kubernetes no Stackdriver

O Prometheus espera que o aplicativo encaminhe métricas para o terminal HTTP. As bibliotecas cliente do Prometheus estão disponíveis para isso. Outras ferramentas como o OpenCensus e o Istio usam o mesmo formato.

6. Disponibilize o estado de integridade do aplicativo.


O gerenciamento de um aplicativo em produção é auxiliado por sua capacidade de relatar seu estado para todo o sistema. O aplicativo está sendo executado? Está tudo bem? Está pronto para receber tráfego? Como ele se comporta? A maneira mais comum de resolver esse problema é implementar verificações de saúde . Kubernetes tem dois tipos: sondas de vivacidade e prontidão .

Para uma análise dinâmica, o aplicativo deve ter um terminal HTTP retornando uma resposta "200 OK" se estiver funcionando e se suas principais dependências forem atendidas. Para o probe de prontidão (verifique a prontidão do serviço), o aplicativo deve ter um terminal HTTP diferente, retornando a resposta "200 OK" se o aplicativo estiver em um estado íntegro, as etapas de inicialização concluídas e qualquer solicitação correta não levar a um erro. O Kubernetes direcionará o tráfego para o contêiner somente se o aplicativo estiver pronto de acordo com essas verificações. Dois pontos finais podem ser combinados se não houver diferença entre animação e prontidão.

Para obter mais informações, consulte o artigo relacionado de Sandeep Dinesh, advogado do desenvolvedor do Google: " Práticas recomendadas do Kubernetes: configurando verificações de saúde com testes de prontidão e vivacidade ".

7. Escolha cuidadosamente a versão da imagem


A maioria das imagens públicas e privadas usa um sistema de identificação semelhante ao descrito em Práticas recomendadas para a construção de contêineres . Se a imagem usar um sistema próximo ao controle de versão semântico , considere as especificidades da marcação. Por exemplo, a tag latest geralmente pode passar de imagem para imagem - você não pode confiar nela se precisar de montagens e instalações previsíveis e reproduzíveis.

Você pode usar a tag XYZ (eles quase sempre são inalterados), mas nesse caso, acompanhe todas as correções e atualizações da imagem. Se sua imagem tiver uma tag XY , essa é uma boa opção para o meio termo. Ao escolher, você recebe automaticamente os patches e, ao mesmo tempo, conta com uma versão estável do aplicativo.

PS do tradutor


Leia também em nosso blog:

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


All Articles