Melhores Práticas EKS
Arquitetura
- Pense em multilocação, isolamento para ambiente diferente ou carga de trabalho diferente
- Isolamento no nível da conta usando a organização da AWS
- Isolamento na camada de rede, ou seja. VPC diferente e cluster diferente
- Use grupos de nós diferentes (pool de nós) para finalidade/categoria diferente, por exemplo, crie grupos de nós dedicados para ferramentas operacionais, como ferramenta CI/CD, ferramenta de monitoramento, sistema de log centralizado.
- Namespace separado para carga de trabalho diferente
Confiabilidade | Princípios
- Recomendado usar VPC dedicada para EKS
- Arquitetura modular e escalável do Amazon EKS
- Planeje sua VPC e CIDR de sub-rede, evite a complexidade de usar vários CIDRs em uma VPC e rede personalizada CNI
- Entenda e verifique Cota de serviço do EKS/Fargate e outros serviços relacionados
- Implemente o Cluster Autoscaler para ajustar automaticamente o tamanho de um cluster EKS para cima e para baixo com base nas demandas de agendamento.
- Considere o número de nós do trabalhador e a degradação do serviço se houver falha de nó/AZ.
- Cuide do RTO.
- Considere ter um nó de buffer.
- Considere não escolher um tipo de instância muito grande para reduzir o raio de explosão.
- Habilite o Horizontal Pod Autoscaler para usar a utilização da CPU ou métricas personalizadas para expandir os pods.
- Use a infraestrutura como código (arquivos e modelos de manifesto do Kubernetes para provisionar clusters/nós do EKS, etc.)
- Use várias AZs. Distribua as réplicas do aplicativo para diferentes zonas de disponibilidade do nó do trabalhador para redundância
- Cuidado com seus pods persistentes que usam EBS como PersistentVolume. Use anotação, por exemplo,
topology.kubernetes.io/zone=us-east-1c
- Cuidado com seus pods persistentes que usam EBS como PersistentVolume. Use anotação, por exemplo,
- Nós de trabalho altamente disponíveis e escaláveis usando grupos de Auto Scaling, use grupo de nós
- Considere usar Grupos de nós gerenciados para fácil configuração e alta disponibilidade de nós durante atualizações ou terminação
- Considere usar o Fargate para não precisar gerenciar nós de trabalho. Mas cuidado com as limitações do Fargate.
- Considere separar o Node Group para suas funções de aplicativo e utilitário, por exemplo. Banco de dados de log, plano de controle de service mesh
- Implante aws-node-termination-handler. Ele detecta se o nó ficará indisponível/encerrado, como Interrupção de ponto, em seguida, certifique-se de que nenhum novo trabalho seja agendado lá e, em seguida, drene-o, removendo qualquer trabalho existente. Tutorial | Comunicado
- Configure Pod Disruption Budgets (PDBs) para limitar o número de pods de um aplicativo replicado que estão inativos simultaneamente de interrupções voluntárias, por exemplo, durante a atualização, implantação contínua e outros casos de uso.
- Use o AWS Backup para fazer backup de EFS e EBS
- Use o EFS para classe de armazenamento: o uso do EFS não requer o pré-provisionamento da capacidade e permite migrações de pod mais eficientes entre nós de trabalho (removendo armazenamento anexado ao nó)
- Instale o Node Problem Detector para fornecer dados acionáveis para curar clusters.
- Evite erros de configuração, como o uso de antiafinidade, que faz com que o pod não possa ser reprogramado devido a falha do nó.
- Use sondas de vivacidade e prontidão
- Pratique a engenharia do caos, use ferramentas disponíveis para automatizar.
- Mate pods aleatoriamente durante o teste
- Implementar o gerenciamento de falhas no nível de microsserviço, por exemplo, padrão de disjuntor, controlar e limitar chamadas de repetição (recuo exponencial), limitação, tornar os serviços sem estado sempre que possível
- Pratique como fazer upgrade do cluster e dos nós do trabalhador para a nova versão.
- Pratique como drenar os nós do trabalhador.
- Pratique a engenharia do caos
- Utilizar ferramentas de CI/CD, automatizar e ter fluxo de processos (aprovação/revisão) para mudanças de infraestrutura. Considere implementar Gitops.
- Use solução multi-AZ para volume persistente, por exemplo. Thanos+S3 for Prometheus
Eficiência de Desempenho | Princípios
- Informe o suporte da AWS se precisar pré-escalar o Plano de Controle (Nó mestre e Etcd) em caso de incremento de carga repentino
- Escolha o tipo de instância do EC2 correto para seu nó do trabalhador.
- Entenda os prós e contras de usar muitas instâncias de nós pequenos ou poucas instâncias de nós grandes. Considere a sobrecarga do SO, o tempo necessário para extrair a imagem em uma nova instância quando ela é dimensionada, a sobrecarga do kubelet, a sobrecarga do pod do sistema etc.
- Entenda a limitação de densidade de pods (número máximo de pods compatível com cada tipo de instância)
- Use grupos de nós single-AZ, se necessário. Normalmente, uma das melhores práticas é executar um microsserviço no Multi-AZ para disponibilidade, mas para algumas cargas de trabalho (como Spark) que precisam de latência de microssegundos, com alta operação de E/S de rede e transientes, é feito o envio para use single-AZ.
- Entenda a limitação de desempenho do Fargate. Faça o teste de carga antes de ir para a produção.
- Certifique-se de que seu pod solicite os recursos necessários. Definir recursos
requestelimitcomo CPU, memória - Detectar gargalo/latência em um microsserviço com o X-Ray ou outros produtos de rastreamento/APM
- Escolha o back-end de armazenamento certo. Use o Amazon FSx for Lustre e seu CSI Driver se o seu contêiner persistente precisar de um sistema de arquivos de alto desempenho
- Monitore o consumo de recursos de pods e nós e o afunilamento de tecnologia. Você pode usar o CloudWatch, CloudWatch Container Insight ou outros produtos
- Se necessário, inicie instâncias (nós de trabalho) em Placement Groups para aproveitar a baixa latência sem diminuir a velocidade. Você pode usar este modelo do CloudFormation para adicionar novos grupos de nós com conectividade sem bloqueio, sem excesso de assinaturas e totalmente bi-seccional.
- Se necessário, configure a política de gerenciamento de CPU do Kubernetes como 'static' para alguns pods que precisam CPUs exclusivas
Otimização de custos
- Minimize os recursos desperdiçados (não utilizados) ao usar o EC2 como nó do trabalhador.
- Escolha o tipo de instância do EC2 correto e use o dimensionamento automático de cluster.
- Considere usar Fargate
- Considere usar uma ferramenta como kube-resource-report para visualizar o custo de folga e dimensionar corretamente as solicitações para os containers em um pod.
- Use instâncias spot ou misture sob demanda e spot usando Spot Fleet. Considere usar instâncias spot para ambiente de teste/preparação.
- Usar instância reservada ou planos de economia
- Use grupos de nós de AZ único para carga de trabalho com alta operação de E/S de rede (por exemplo, Spark) para reduzir a comunicação entre AZ. Mas, por favor, valide se a execução do Single-AZ não comprometeria a disponibilidade do seu sistema.
- Considere os serviços gerenciados para ferramentas de suporte, como monitoramento, service mesh, log centralizado, para reduzir o esforço e o custo de sua equipe
- Marque todos os recursos da AWS quando possível e use rótulos para marcar os recursos do Kubernetes para que você possa analisar facilmente o custo.
- Considere usar Kubernetes de autogerenciamento (não usando EKS) para cluster sem HA. Você pode configurar usando Kops para seu pequeno cluster k8s.
- Use Node Affinities usando nodeSelector para pod que requer um tipo de instância EC2 específico.
Operação: Princípios
- Use a ferramenta IaC para provisionar o cluster EKS, como
- Considere usar o gerenciador de pacotes como Helm para ajudá-lo a instalar e gerenciar aplicativos.
- Automatize o gerenciamento de cluster e a implantação de aplicativos usando GitOps. Você pode usar ferramentas como Flux ou outros
- Use ferramentas de CI/CD
- Pratique fazer a atualização do EKS (rolling update), crie o runbook.
- Monitoramento
- Compreenda a saúde da sua carga de trabalho. Defina KPI/SLO e métricas/SLI e depois monitore através de seu painel e configure alertas
- Entenda sua Saúde Operacional. Defina KPI e métricas como tempo médio para detectar um incidente (MTTD) e tempo médio para recuperação (MTTR) de um incidente.
- Use o monitoramento detalhado usando o Container Insights for EKS para detalhar o serviço, desempenho de cápsulas. Ele também fornece informações de diagnóstico e considera a visualização de métricas adicionais e níveis adicionais de granularidade quando ocorre um problema.
- Monitorar métricas do plano de controle usando o Prometheus
- Monitoramento usando Prometheus & Grafana
- Logging
- Considere o mecanismo DaemonSet vs Sidecar. DaemonSet é preferível para nós workers EC2, mas você precisa usar o padrão Sidecar para Fargate.
- Registro do plano de controle
- Você pode usar pilha EFK ou FluentBit, Kinesis Data Firehouse, S3 e Athena
- Rastreamento
- Monitore a transação de grau fino usando o X-Ray eksworkshop.com. Também é bom monitorar a implantação do blu-green. Outras ferramentas
- Pratique a Engenharia do Caos, você pode automatizar usando algumas ferramentas
- Configuração
- Appmesh + EKS demonstração / laboratório: GitHub - PaulMaddox/aws-appmesh-helm: AWS App Mesh ❤ K8s
- Mapa da Nuvem AWS:
Segurança | Princípios
- Compreender o modelo de responsabilidade compartilhada para diferentes modos de operação do EKS (nós autogerenciados, grupo de nós gerenciados, Fargate )
- Práticas recomendadas de segurança da AWS para EKS
- Integrando segurança em seu pipeline de contêineres | workshop
- Use rede personalizada CNI, se seu pod precisar ter um grupo de segurança diferente com seus nós ou pods para ser colocado em sub-redes privadas, mas o nó está, na verdade, em sub-rede pública.
- Log da API Cloudtrail EKS
- Considere habilitar a entrega contínua de eventos do CloudTrail para um bucket do Amazon S3
- Use a política de rede para o tráfego Leste-Oeste: Calico
- Use grupos de segurança para pods apenas para K8s > v1.17. Veja algumas considerações
- Apresentando funções de IAM refinadas para contas de serviço | Blog de código aberto da AWS
Packer for AMI build : Configuração do Packer para criar uma AMI EKS personalizada