O que é considerado uma boa prática com K8S para gerenciar vários ambientes (QA, Staging, Production, Dev, etc)?
Por exemplo, digamos que uma equipe esteja trabalhando em um produto que requer a implantação de algumas APIs, juntamente com um aplicativo front-end. Normalmente, isso exigirá pelo menos 2 ambientes:
- Staging: Para iterações / testes e validação antes de liberar para o cliente
- Produção: Este é o ambiente ao qual o cliente tem acesso. Deve conter recursos estáveis e bem testados.
Portanto, supondo que a equipe esteja usando o Kubernetes, qual seria uma boa prática para hospedar esses ambientes? Até agora, consideramos duas opções:
- Use um cluster K8s para cada ambiente
- Use apenas um cluster K8s e mantenha-os em namespaces diferentes.
(1) Parece a opção mais segura, pois minimiza os riscos de possíveis erros humanos e falhas da máquina, que podem colocar o ambiente de produção em perigo. No entanto, isso acarreta o custo de mais máquinas master e também o custo de mais gerenciamento de infraestrutura.
(2) Parece que simplifica o gerenciamento de infraestrutura e implantação porque há um único cluster, mas levanta algumas questões como:
- Como ter certeza de que um erro humano pode afetar o ambiente de produção?
- Como ter certeza de que uma carga alta no ambiente de teste não causará perda de desempenho no ambiente de produção?
Pode haver algumas outras preocupações, então estou entrando em contato com a comunidade K8s no StackOverflow para ter uma melhor compreensão de como as pessoas estão lidando com esse tipo de desafio.
fonte
Respostas:
Considerações sobre vários clusters
Dê uma olhada nesta postagem do blog de Vadim Eisenberg ( IBM / Istio ): Lista de verificação: prós e contras do uso de vários clusters Kubernetes e como distribuir cargas de trabalho entre eles .
Gostaria de destacar alguns dos prós / contras:
Considerando um ambiente não muito caro, com manutenção média, e ainda garantindo o isolamento de segurança para aplicativos de produção, eu recomendaria:
Paridade Ambiental
É uma boa prática manter o desenvolvimento, a preparação e a produção o mais semelhante possível:
Combine uma ferramenta poderosa de CI / CD com o leme . Você pode usar a flexibilidade dos valores do leme para definir as configurações padrão, apenas substituindo as configurações que diferem de um ambiente para outro.
O GitLab CI / CD com AutoDevops tem uma integração poderosa com o Kubernetes, que permite gerenciar vários clusters do Kubernetes já com suporte ao helm.
Gerenciando vários clusters (
kubectl
interações)Para superar isso:
asdf
para gerenciar váriaskubectl
versõesKUBECONFIG
env var para mudar entre várioskubeconfig
arquivoskube-ps1
para acompanhar seu contexto / namespace atualkubectx
ekubens
para mudar rapidamente entre clusters / namespacesTenho um artigo que exemplifica como fazer isso: usando diferentes versões de kubectl com vários clusters Kubernetes
Eu também recomendo as seguintes leituras:
fonte
Definitivamente, use um cluster separado para desenvolvimento e criação de imagens docker para que seus clusters de teste / produção possam ser bloqueados em termos de segurança. Depende de você
staging + production
decidir com base no risco / custo se você usar clusters separados - certamente mantê-los separados ajudará a evitarstaging
efeitosproduction
.Eu também recomendo usar GitOps para promover versões de seus aplicativos entre seus ambientes.
Para minimizar o erro humano, também recomendo que você automatize o máximo que puder para seu CI / CD e promoção.
Esta é uma demonstração de como automatizar CI / CD com vários ambientes no Kubernetes usando GitOps para promoção entre ambientes e ambientes de visualização em solicitações pull que foi feito ao vivo no GKE, embora o Jenkins X seja compatível com a maioria dos clusters de kubernetes
fonte
Depende do que você deseja testar em cada um dos cenários. Em geral, eu tentaria evitar a execução de cenários de teste no cluster de produção para evitar efeitos colaterais desnecessários (impacto no desempenho, etc.).
Se sua intenção é testar com um sistema de teste que imita exatamente o sistema de produção, eu recomendaria acionar uma réplica exata do cluster completo e desligá-lo depois de terminar o teste e mover as implantações para produção.
Se o seu objetivo é testar um sistema de preparação que permite testar o aplicativo para implantação, eu executaria um cluster de preparação menor permanentemente e atualizaria as implantações (com também uma versão reduzida das implantações) conforme necessário para o teste contínuo.
Para controlar os diferentes clusters, prefiro ter uma máquina ci / cd separada que não faça parte do cluster, mas usada para ativar e desativar clusters, bem como realizar trabalhos de implantação, iniciar testes, etc. Isso permite configurar e desligar clusters como parte de cenários de teste automatizados.
fonte
É claro que, ao manter o cluster de produção separado do cluster de teste, o risco de erros em potencial afetando os serviços de produção é reduzido. No entanto, isso tem um custo de mais gerenciamento de infraestrutura / configuração, uma vez que requer pelo menos:
Também não podemos esquecer que pode haver mais de um ambiente. Por exemplo, trabalhei em empresas onde existem pelo menos 3 ambientes:
Acho que clusters efêmeros / sob demanda fazem sentido, mas apenas para certos casos de uso (teste de carga / desempenho ou muito «grande» integração / teste ponta a ponta), mas para ambientes mais persistentes / fixos, vejo uma sobrecarga que pode ser reduzida executando-os em um único cluster.
Acho que gostaria de entrar em contato com a comunidade k8s para ver quais padrões são usados para cenários como os que descrevi.
fonte
A menos que a conformidade ou outros requisitos determinem o contrário, sou a favor de um único cluster para todos os ambientes. Com esta abordagem, os pontos de atenção são:
Certifique-se de agrupar nós por ambiente usando rótulos. Você pode então usar os
nodeSelector
recursos on para garantir que eles estejam sendo executados em nós específicos. Isso reduzirá as chances de o consumo de recursos (em excesso) se espalhar entre os ambientes.Trate seus namespaces como sub-redes e proíba todo o tráfego de entrada / saída por padrão. Consulte https://kubernetes.io/docs/concepts/services-networking/network-policies/ .
Tenha uma estratégia para gerenciar contas de serviço.
ClusterRoleBindings
implicam em algo diferente se um cluster hospeda mais de um ambiente.Use o escrutínio ao usar ferramentas como Helm. Alguns gráficos instalam descaradamente contas de serviço com permissões para todo o cluster, mas as permissões para contas de serviço devem ser limitadas ao ambiente em que estão.
fonte
Usar vários clusters é a norma, na própria lista, para impor uma forte separação entre produção e "não produção".
Nesse espírito, observe que o GitLab 13.2 (julho de 2020) agora inclui:
Veja a documentação e questão /
fonte
Acho que executar um único cluster faz sentido porque reduz a sobrecarga e o monitoramento. Mas, você deve certificar-se de colocar políticas de rede e controle de acesso em vigor.
Política de rede - para proibir que a carga de trabalho do ambiente dev / qa interaja com armazenamentos de produção / preparação.
Controle de acesso - quem tem acesso a diferentes recursos do ambiente usando ClusterRoles, Roles etc.
fonte