Implantação no Amazon EKS

Um exemplo de implantação local no Amazon EKS é fornecido aqui. Clone este repositório e modifique os arquivos conforme sua conveniência. No repositório, como em um módulo Terraform padrão, você encontrará os seguintes arquivos:

  • terraform.tf - declaração dos provedores Terraform utilizados neste projeto;

  • locals.tf - variáveis locais usadas pelos módulos Modern Gitops Stack;

  • main.tf - definição de todos os módulos implantados;

  • s3_loki.tf - criação da política IAM, função assumida e bucket utilizado pelo Loki;

  • s3_thanos.tf - criação da política IAM, função assumida e bucket usado pelo Thanos;

  • csi_drivers.tf - criação dos recursos necessários, bem como dos módulos Modern Gitops Stack necessários para os drivers CSI do cluster;

  • outputs.tf - as variáveis de saída do Modern Gitops Stack;

Requisitos

Na sua máquina local, você precisa ter as seguintes ferramentas instaladas:

  • Tofu ou Terraform para provisionar toda a stack;

  • kubectl ou k9spara interagir com seu cluster;

  • AWS CLI para interagir com sua conta AWS;

  • gopass e summon para passar facilmente os segredos do IAM como variáveis de ambiente ao executar o comando tofu/terraform;

Fora isso, você precisará do seguinte:

  • uma conta AWS;

  • uma chave AWS IAM com pelo menos …​ …​ …​

  • uma zona da Rota 53;

Especificidades e explicações

segredos.yml

DICA: Verifique esta postagem do blog para obter mais informações sobre como configurar gopass e summon para trabalhar juntos.

Para simplicidade e facilidade de uso, bem como segurança, o exemplo usa gopass e summon para passar as credenciais do IAM para os comandos do Tofu/Terraform. O arquivo secrets.yml contém o caminho para os valores secretos no armazenamento de senhas gopass. Na execução, o comando summon lerá o arquivo secrets.yml e passará as credenciais como variáveis de ambiente para os comandos do Tofu/Terraform.

Todos os comandos apresentados neste tutorial usam o comando summon.

IMPORTANTE: A variável de ambiente AWS_DEFAULT_REGION define onde residirão todos os recursos AWS criados pelo Tofu/Terraform, incluindo o cluster EKS.

Estado remoto do Tofu/Terraform

Se não quiser configurar o back-end de estado remoto do Tofu/Terraform, você pode simplesmente remover o bloco backend do arquivo terraform.tf.

NOTA: Mais informações sobre backends remotos estão disponíveis na documentação oficial.

Autenticação OIDC

IMPORTANTE: Os módulos Modern Gitops Stack são desenvolvidos com o OIDC em mente. Na produção, você deve ter um provedor de identidade que suporte OIDC e usá-lo para autenticar os aplicativos Modern Gitops Stack.

Neste exemplo, usamos o provedor OIDC Amazon EKS. Fornecemos um module que usa um ID de pool Cognito e seu domínio para fornecer a configuração necessária para implantar os aplicativos Modern Gitops Stack.

Isso pressupõe que você mesmo criou um pool do Cognito, mas você pode usar nosso módulo para também criar o pool e preenchê-lo com usuários, conforme mostrado no exemplo.

NOTA: Verifique a documentação de uso AWS Cognito OIDC para obter mais informações sobre como usá-lo.

A variável user_map desse módulo permite criar usuários OIDC usados ​​para autenticar nos aplicativos Modern Gitops Stack. Você deverá receber um e-mail da AWS com uma senha temporária para fazer login pela primeira vez.

Vamos criptografar certificados SSL

Por padrão, para evitar a limitação de taxa do seu domínio pelo Let’s Encrypt, o exemplo usa a configuração letsencrypt-staging do módulo cert-manager para gerar certificados. Isso usa o ambiente de teste Let’s Encrypt que possui um certificado CA inválido.

Se você se sentir pronto para testar com certificados de produção, você pode simplesmente editar o arquivo locals.tf e alterar a variável cluster_issuer para letsencrypt-prod.

Implantação

  1. Clone o repositório e cd na pasta examples/eks;

  2. Adapte o arquivo secrets.yml para apontar para o caminho correto em seu armazenamento de senhas gopass;

  3. Confira os módulos que deseja implantar no arquivo main.tf e comente os demais;

    DICA: Você também pode adicionar seus próprios módulos Tofu/Terraform neste arquivo ou em qualquer outro arquivo na pasta raiz. Um bom lugar para começar a escrever seu próprio módulo é clonar o repositório modern-gitops-stack-module-template e adaptá-lo ao seu precisa.

  4. No módulo oidc, adapte a variável user_map como desejar (por favor verifique a seção OIDC para mais informações).

  5. Na origem da implantação de exemplo, inicialize os módulos e provedores do Tofu/Terraform:

    summon tofu init
  6. Configure as variáveis em locals.tf de acordo com sua preferência:

    IMPORTANTE: cluster_name e vpc_cidr devem ser exclusivos para cada implantação do Modern Gitops Stack em uma única conta da AWS e o base_domain deve corresponder a uma zona do Route 53 nessa mesma conta.

    DICA: O documentação do módulo cluster pode ajudá-lo a saber o que colocar em kubernetes_version, por exemplo.

    Unresolved include directive in modules/ROOT/pages/tutorials/deploy_eks.adoc - include::examples$deploy_examples/eks/locals.tf[]
  7. Por fim, execute tofu apply e aceite as alterações propostas para criar os nós Kubernetes no Amazon EKS e preenchê-los com o Modern GitOps Stack;

    summon tofu apply
  8. Após a primeira implantação (observe a etapa de solução de problemas relacionada ao ArgoCD), você pode ir para locals.tf e habilitar o booleano ServiceMonitor para ativar os exportadores do Prometheus que enviarão métricas para o Prometheus;

    IMPORTANTE: Este sinalizador precisa ser definido como false para a primeira inicialização do cluster, caso contrário, os aplicativos falharão na implantação enquanto as definições de recursos personalizados do kube-prometheus-stack ainda não foram criadas.

    NOTA: Você pode definir o sinalizador como true no arquivo locals.tf ou pode simplesmente deletar a linha nas declarações dos módulos, já que esta variável é definida como true por padrão em cada módulo.

    DICA: Anote o local chamado app_autosync. Se você definir a condição do operador ternário como false você desabilitará a sincronização automática para todos os módulos Modern Gitops Stack. Isso permite que você escolha quando sincronizar manualmente o módulo na interface do Argo CD e é útil para fins de solução de problemas.

Acesse o cluster e os aplicativos Modern Gitops Stack

Para acessar seu cluster, você precisa usar a AWS CLI para recuperar um Kubeconfig que você pode usar:

summon aws eks update-kubeconfig --name YOUR_CLUSTER_NAME --region YOUR_CLUSTER_ZONE --kubeconfig ~/.kube/NAME_TO_GIVE_YOUR_CONFIG.config

Então você pode usar o comando kubectl ou k9s para interagir com o cluster:

k9s --kubeconfig ~/.kube/NAME_TO_GIVE_YOUR_CONFIG.config

Quanto aos aplicativos do Modern Gitops Stack, você pode acessá-los através do domínio de entrada que pode ser encontrado na saída ingress_domain. Se você usou o código do exemplo sem modificar as saídas, você verá algo assim em seu terminal depois que terraform apply tiver feito seu trabalho:

Outputs:

modern_gitops_admins = <sensitive>
ingress_domain = "your.domain.here"

Ou você pode usar kubectl para obter todas as entradas e seus respectivos URLs:

kubectl get ingress --all-namespaces --kubeconfig ~/.kube/NAME_TO_GIVE_YOUR_CONFIG.config

A saída modern_gitops_admins lista todos os usuários e respectivos e-mails que foram configurados usando o módulo OIDC:

summon terraform output modern_gitops_admins

Esses usuários deveriam ter recebido um e-mail com uma senha temporária para fazer login nos aplicativos do Modern Gitops Stack pela primeira vez.

Parar o cluster

Para parar definitivamente o cluster com um único comando (é por isso que excluímos alguns recursos do arquivo de estado), você pode usar o seguinte comando:

summon terraform state rm $(summon terraform state list | grep "argocd_application\|argocd_project\|kubernetes_\|helm_") && summon terraform destroy

Conclusão

É isso, agora você tem um cluster Kubernetes totalmente funcional no Amazon EKS com os aplicativos do Modern Gitops Stack implantados nele. Para mais informações, continue lendo documentation. Você pode explorar as possibilidades de cada módulo e obter o link para o código-fonte nas respectivas páginas de documentação.

Solução de problemas

connection_error durante a primeira implantação

Em alguns casos, você pode encontrar um erro como estes na primeira implantação:

╷
│ Error: error while waiting for application argocd to be created
│
│   with module.argocd.argocd_application.this,
│   on .terraform/modules/argocd/main.tf line 55, in resource "argocd_application" "this":
│   55: resource "argocd_application" "this" {
│
│ error while waiting for application argocd to be synced and healthy: rpc error: code = Unavailable desc = error reading from server: EOF
╵

O erro se deve à forma como provisionamos o Argo CD nas etapas finais da implantação. Usamos o bootstrap Argo CD para implantar o módulo Argo CD final, o que causa uma reimplantação do Argo CD e consequentemente uma perda momentânea de conexão entre o provedor ArgoCD do Tofu/Terraform e o servidor do Argo CD.

Você pode simplesmente executar novamente o comando summon tofu apply para finalizar a inicialização do cluster sempre que encontrar esse erro.

Loop de recarga da interface do Argo CD ao clicar no login

Se você encontrar um loop ao clicar no botão de login na interface do Argo CD, você pode tentar excluir o pod do servidor Argo CD e deixá-lo ser recriado.

Para obter mais informações sobre o módulo Argo CD, consulte a respectiva página de documentação.