Como habilito as métricas do Container Insights em um cluster do EKS?

Data da última atualização: 13/05/2022

Quero configurar o Amazon CloudWatch Container Insights e ver minhas métricas de cluster do Amazon Elastic Kubernetes Service (Amazon EKS). Como faço isso?

Descrição breve

Quando usado com o Amazon EKS, o Container Insights usa uma versão conteinerizada do agente do CloudWatch ou do coletor do AWS Distro for OpenTelemetry (ADOT) para localizar todos os contêineres em execução em um cluster. Em seguida, ele coleta dados de performance em cada camada da pilha de performance. Usando um formato incorporado de métrica, o Container Insights coleta dados, p. ex., eventos de log de performance. Em seguida, ele envia esses dados para o CloudWatch Logs no grupo de logs /aws/containerinsights/nome_do_cluster/performance. Com base nesses dados, o CloudWatch cria métricas agregadas por cluster, nó e pod. O Container Insights também é compatível com a coleta de métricas de clusters implantados no AWS Fargate para Amazon EKS. Para mais informações sobre o Container Insights, consulte Usar o Container Insights.

Observação: o Container Insights só é compatível com instâncias do Linux. A Amazon fornece uma imagem de contêiner do agente do CloudWatch no Amazon Elastic Container Registry (Amazon ECR). Para mais informações, consulte cloudwatch-agent no Amazon ECR.

Resolução

Pré-requisitos

Antes de realizar estas etapas, analise os pré-requisitos:

  • Seu cluster do EKS está sendo executado com nós no estado Ready (Pronto), e o comando kubectl está instalado e em execução.
  • O CloudWatchAgentServerPolicy gerenciado pelo AWS Identity and Access Management (IAM) está em vigor para permitir que seus nós de processamento do Amazon EKS enviem métricas e logs para o CloudWatch. Você pode fazer isso anexando uma política à função do IAM dos seus nós de processamento. Como alternativa, use uma função do IAM para contas de serviço do cluster e anexe a política a essa função. Para mais informações, consulte Funções do IAM para contas de serviço.
  • Você está executando um cluster compatível com Kubernetes versão 1.18 ou superior. Esse é um requisito do Container Insights para o EKS Fargate. Você também definiu um perfil do Fargate para programar pods no Fargate.
  • A função de execução de pod do EKS está em vigor para permitir que componentes executados na infraestrutura do Fargate façam chamadas para APIs da AWS em seu nome. Por exemplo, para a extração de imagens de contêiner do Amazon ECR.

Configurar métricas do Container Insights em seu cluster do EC2 do EKS usando o agente do CloudWatch

O agente do CloudWatch ou o AWS Distro for OpenTelemetry cria um grupo de logs chamado AWS/ContainerInsights/nome_do_cluster/performance. Em seguida, ele envia os eventos de log de performance para esse grupo de logs.

Para configurar o Container Insights para coletar métricas, siga estas etapas que implantam a imagem de contêiner do agente do CloudWatch como um DaemonSet do Docker Hub como um usuário anônimo, por padrão. Essa extração pode estar sujeita a um limite de taxa.

1.    Crie um namespace chamado amazon-cloudwatch, se você ainda não tiver um:

kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml

2.    Crie uma conta de serviço para o agente do CloudWatch chamado cloudwatch-agent:

kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml

3.    Crie um configmap como um arquivo de configuração para o agente do CloudWatch:

ClusterName=<my-cluster-name>
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl apply -f -

Observação: substitua my-cluster-name pelo nome do seu cluster do EKS. Para personalizar adicionalmente a configuração do agente do CloudWatch, consulte Criar um ConfigMap para o agente do CloudWatch.

4.    Opcional: para extrair o agente do CloudWatch do Amazon Elastic Container Registry, aplique o patch no DaemonSet cloudwatch-agent:

kubectl patch ds cloudwatch-agent -n amazon-cloudwatch -p \
 '{"spec":{"template":{"spec":{"containers":[{"name":"cloudwatch-agent","image":"public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"}]}}}}'

Observação: a imagem do Docker do cloudwatch-agent no ECR é compatível com as arquiteturas ARM e AMD64. Substitua a etiqueta de imagem mais recente com base na versão e na arquitetura da imagem. Para mais informações, veja as etiquetas de imagens cloudwatch-agent no Amazon ECR.

5.    Para funções do IAM para contas de serviço, crie um provedor OIDC e uma função e uma política do IAM. Em seguida, associe a função do IAM à conta de serviço cloudwatch-agent. Substitua ACCOUNT_ID e IAM_ROLE_NAME pelo ID da conta da AWS e pela função do IAM usada para as contas de serviço.

kubectl annotate serviceaccounts cloudwatch-agent -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

Solucionar problemas do agente do CloudWatch

1.    Execute este comando para obter a lista de pods:

kubectl get pods -n amazon-cloudwatch

2.    Execute este comando e verifique os eventos na parte inferior da saída:

kubectl describe pod pod-name -n amazon-cloudwatch

3.    Execute este comando para verificar os logs:

kubectl logs pod-name -n amazon-cloudwatch

4.    Se encontrar um erro CrashLoopBackoff para o agente do CloudWatch, verifique se as permissões do IAM estão definidas corretamente.

Para mais informações, consulte Verificar pré-requisitos.

Excluir o agente do CloudWatch

Use estes comandos para excluir o agente do CloudWatch:

kubectl delete -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
kubectl delete -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml
ClusterName=<my-cluster-name>
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl delete -f -

Configurar métricas do Container Insights em seu cluster do EC2 do EKS usando o ADOT

1.    Execute este comando para implantar o coletor ADOT como um DaemonSet. Para mais personalizações, consulte Container Insights EKS infrastructure metrics (Métricas de infraestrutura do EKS no Container Insights).

curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl apply -f -

2.    Confirme se o coletor está em execução:

kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks

3.    Opcional: por padrão, a imagem aws-otel-collector é extraída do Docker Hub como um usuário anônimo. Essa extração pode estar sujeita a um limite de taxa. Para extrair a imagem do Docker aws-otel-collector no Amazon ECR, aplique o patch no DaemonSet aws-otel-eks-ci:

kubectl patch ds aws-otel-eks-ci -n aws-otel-eks -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'

Observação: a imagem do Docker do cloudwatch-agent no ECR é compatível com as arquiteturas ARM e AMD64. Substitua a etiqueta de imagem mais recente com base na versão e na arquitetura da imagem. Para mais informações, veja as etiquetas de imagens cloudwatch-agent no Amazon ECR.

5.    Opcional: para funções do IAM para contas de serviço, crie um provedor OIDC e uma função e uma política do IAM. Em seguida, associe a função do IAM à conta de serviço aws-otel-sa. Substitua ACCOUNT_ID e IAM_ROLE_NAME pelo ID da conta da AWS e pela função do IAM usada para contas de serviço.

kubectl annotate serviceaccounts aws-otel-sa -n aws-otel-eks "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

Excluir o ADOT

Para excluir o AWS Distro for OpenTelemetry, execute este comando:

curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml |
kubectl delete -f -

Configurar métricas do Container Insights em um cluster do EKS Fargate usando o ADOT

Para aplicações executadas no Amazon EKS e no AWS Fargate, você pode usar o ADOT para configurar o Container Insights. A arquitetura de rede do EKS Fargate não permite que os pods alcancem diretamente o kubelet no operador para recuperar métricas de recursos. O ADOT Collector chama o servidor da API do Kubernetes para fazer o proxy da conexão com o kubelet em um nó de processamento. Em seguida, ele coleta as métricas do consultor do kubelet para workloads no respectivo nó.

Observação: uma só instância do ADOT Collector não é suficiente para coletar métricas de recursos de todos os nós em um cluster.

O ADOT Collector envia estas métricas ao CloudWatch para cada workload executada no EKS Fargate:

  • pod_cpu_utilization_over_pod_limit
  • pod_cpu_usage_total
  • pod_cpu_limit
  • pod_memory_utilization_over_pod_limit
  • pod_memory_working_set
  • pod_memory_limit
  • pod_network_rx_bytes
  • pod_network_tx_bytes

Cada métrica está associada aos seguintes conjuntos de dimensões e é coletada no namespace do CloudWatch chamado ContainerInsights.

  • ClusterName, LaunchType
  • ClusterName, Namespace, LaunchType
  • ClusterName, Namespace, PodName, LaunchType

Para mais detalhes, acesse a página do Container Insights EKS Fargate.

Siga estas etapas para implantar o ADOT em seu EKS Fargate:

1.    Associe uma conta de serviço do Kubernetes a uma função do IAM. Crie uma função do IAM chamada EKS-ADOT-ServiceAccount-Role associada a uma conta de serviço do Kubernetes chamada adot-collector. Não esqueça de alterar as variáveis CLUSTER_NAME e REGION. Esse script auxiliar requer eksctl.

#!/bin/bash
CLUSTER_NAME=YOUR-EKS-CLUSTER-NAME
REGION=YOUR-EKS-CLUSTER-REGION
SERVICE_ACCOUNT_NAMESPACE=fargate-container-insights
SERVICE_ACCOUNT_NAME=adot-collector
SERVICE_ACCOUNT_IAM_ROLE=EKS-Fargate-ADOT-ServiceAccount-Role
SERVICE_ACCOUNT_IAM_POLICY=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

eksctl utils associate-iam-oidc-provider \
--cluster=$CLUSTER_NAME \
--approve

eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--region=$REGION \
--name=$SERVICE_ACCOUNT_NAME \
--namespace=$SERVICE_ACCOUNT_NAMESPACE \
--role-name=$SERVICE_ACCOUNT_IAM_ROLE \
--attach-policy-arn=$SERVICE_ACCOUNT_IAM_POLICY \
--approve

2.    Implante o ADOT Collector como um Kubernetes StatefulSet usando este comando. Substitua my-cluster-name pelo nome do seu cluster do EKS e my-cluster-region pelo nome da região.

ClusterName=<my-cluster-name>
Region=<my-cluster-region>
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl apply -f -

3.    Verifique se o pod do ADOT Collector está em execução:

kubectl get pods -n fargate-container-insights

4.    Opcional: por padrão, a imagem aws-otel-collector é extraída do Docker Hub como um usuário anônimo. Essa extração pode estar sujeita a um limite de taxa. Para extrair a imagem do Docker aws-otel-collector no Amazon ECR, aplique o patch no DaemonSet aws-otel-eks-ci:

kubectl patch sts adot-collector -n fargate-container-insights -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'

Excluir o ADOT

Execute estes comandos para excluir o ADOT.

eksctl delete iamserviceaccount —cluster CLUSTER_NAME —name adot-collector
ClusterName=<my-cluster-name>
Region=<my-cluster-region>
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl delete -f -

Esse artigo ajudou?


Precisa de ajuda com faturamento ou suporte técnico?