O blog da AWS

Monitoramento de custos de vários clusters para Amazon EKS usando Kubecost e Amazon Managed Service for Prometheus

Por Imaya Kumar Jagannathan e Vikram Venkataraman traduzido por Jean Philip de Rogatis

 

Introdução

O Amazon Managed Service for Prometheus é um serviço compatível com o Prometheus que monitora e fornece alertas sobre aplicativos e infraestrutura em contêineres em grande escala. No post anterior, Integrando o Kubecost com o Amazon Managed Service for Prometheus, discutimos como você pode integrar o Kubecost ao Amazon Managed Service for Prometheus (AMP) para obter visibilidade granular dos custos de cluster do Amazon Elastic Kubernetes Service Amazon EKS, permitindo agregar custos pela maioria dos contextos do Kubernetes, começando do nível do cluster até o nível do contêiner. A integração ajuda os clientes a monitorar um único cluster do Amazon EKS sem se preocupar em escalar a instância do Prometheus. No entanto, a complexidade aumenta quando sua infraestrutura cresce até o tamanho de vários clusters do Amazon EKS em execução em várias regiões e contas da AWS. Você precisa recuperar ou reunir os dados de custo de vários endpoints para rastrear os custos e gerar relatórios de vários clusters do Amazon EKS para fins de show back ou chargeback. Esse é um processo demorado e complicado.

Como parte da parceria da AWS com a Kubecost, temos o prazer de anunciar essa integração subsequente com o Amazon Managed Service for Prometheus para ajudar os clientes a monitorar com eficácia seus custos do Kubernetes sem se preocupar em escalar a instância do Prometheus. Com o pacote Kubecost otimizado para Amazon EKS ou com a Licença Empresarial Kubecost, os clientes da AWS agora podem ter uma visão unificada dos custos do Kubernetes em vários clusters do Amazon EKS. Neste post, você aprenderá como configurar o monitoramento de custos em vários clusters do Amazon EKS em uma visualização federada com o Kubecost e o Amazon Managed Service for Prometheus.

Visão geral da solução

A arquitetura dessa integração é semelhante ao monitoramento de custos do Amazon EKS com o Kubecost, descrito na postagem anterior, com alguns aprimoramentos a seguir:

Nessa integração, um contêiner adicional do AWS SigV4 é adicionado ao pod do analisador de custos, que atua como um proxy para ajudar a consultar métricas do Amazon Managed Service for Prometheus usando o processo de assinatura do AWS SigV4. Ele permite a autenticação sem senha para reduzir o risco de expor suas credenciais da AWS.

Quando a integração do Amazon Managed Service for Prometheus é ativada, o servidor Prometheus incluído no Kubecost Helm Chart é configurado no modo remote_write. O servidor Prometheus incluído envia as métricas coletadas para o Amazon Managed Service for Prometheus usando o processo de assinatura do AWS SigV4. Todas as métricas e dados são armazenados no Amazon Managed Service for Prometheus, e o Kubecost consulta as métricas diretamente do Amazon Managed Service for Prometheus em vez do pacote Prometheus. Isso ajuda os clientes a não se preocuparem em manter e escalar a instância local do Prometheus.

Há duas arquiteturas que você pode implantar:

  • A arquitetura Quick-Start suporta até algumas centenas de clusters em uma configuração de vários clusters.
  • A arquitetura federada suporta a escala de milhares de clusters.

Arquitetura Quick-Start

A infraestrutura de pequena escala pode gerenciar até várias centenas de clusters. O diagrama de arquitetura a seguir ilustra a configuração da infraestrutura em pequena escala:

Para dar suporte à infraestrutura de grande escala que tem milhares de clusters, a Kubecost usa o Amazon Simple Storage Service (Amazon S3) para melhorar o desempenho da consulta de forma eficiente. Além do Amazon Prometheus Workspace, o Kubecost armazena os dados de extração, transformação e carregamento (ETL) do Kubecost em um bucket central do Amazon S3. Os dados ETL do Kubecost são um cache computado com base nas métricas da Prometheus, a partir do qual os clientes podem realizar todas as consultas possíveis do Kubecost. Ao armazenar os dados ETL em um bucket do Amazon S3, essa integração oferece resiliência aos seus dados de alocação de custos, melhora o desempenho e permite uma arquitetura de alta disponibilidade para sua configuração do Kubecost.

O diagrama de arquitetura a seguir ilustra a configuração da infraestrutura em grande escala:

Passo a passo

Pré-requisitos:

  • Você já tem uma conta da AWS.
  • Você tem credenciais do AWS Identity and Access Management (AWS IAM) para criar funções do Amazon Managed Service for Prometheus e do AWS IAM de forma programática.
  • Você tem um cluster Amazon EKS existente com o OpenID Connect (OIDC) ativado.
  • Seus clusters do Amazon EKS têm o driver CSI da interface de armazenamento de contêineres Amazon Elastic Block Store (Amazon EBS) instalado:

Crie o Amazon Managed Service para o espaço de trabalho Prometheus

Etapa 1: execute o seguinte comando para obter as informações do seu cluster EKS atual:

kubectl config current-context

O exemplo de saída deve estar neste formato:

arn:aws:eks:${AWS_REGION}:${YOUR_AWS_ACCOUNT_ID}:cluster/${YOUR_CLUSTER_NAME}

Etapa 2: execute o seguinte comando para criar um novo espaço de trabalho do Amazon Managed Service para Prometheus

export AWS_REGION=<YOUR_AWS_REGION>
aws amp create-workspace --alias kubecost-amp --region $AWS_REGION

O espaço de trabalho do Amazon Managed Service for Prometheus deve ser criado em alguns segundos. Execute o seguinte comando para obter o ID do espaço de trabalho:

export AMP_WORKSPACE_ID=$(aws amp list-workspaces --region ${AWS_REGION} --output json --query 'workspaces[?alias==`kubecost-amp`].workspaceId | [0]' | cut -d'"' -f 2)
echo $AMP_WORKSPACE_ID

Configure o ambiente

Etapa 1: definir variáveis de ambiente para integrar o Kubecost com o Amazon Managed Service for Prometheus

Execute o seguinte comando para definir variáveis de ambiente para integrar o Kubecost com o Amazon Managed Service for Prometheus

export RELEASE="kubecost"
export YOUR_CLUSTER_NAME=<YOUR_EKS_CLUSTER_NAME>
export AWS_REGION=${AWS_REGION}
export VERSION="1.103.4"
export KC_BUCKET="kubecost-etl-metrics" # remova esta linha se voce quer uma arquitetura de baixa escala
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
export REMOTEWRITEURL="https://aps-workspaces.${AWS_REGION}.amazonaws.com/workspaces/${AMP_WORKSPACE_ID}/api/v1/remote_write"
export QUERYURL="http://localhost:8005/workspaces/${AMP_WORKSPACE_ID}"

Etapa 2: configurar o bucket do Amazon S3, a política do AWS IAM e o segredo do Kubernetes para armazenar arquivos ETL do Kubecost

Nota: Você pode ignorar esta etapa 2 para a configuração da infraestrutura de pequena escala

a. Crie um bucket Amazon S3 de armazenamento de objetos para armazenar métricas ETL do Kubecost:

Execute o seguinte comando em seu espaço de trabalho:

aws s3 mb s3://${KC_BUCKET}

b. Crie uma política do AWS IAM para conceder acesso ao bucket do Amazon S3.

A política a seguir é apenas para fins de demonstração. Talvez seja necessário consultar sua equipe de segurança e fazer as alterações apropriadas, dependendo dos requisitos da sua organização.

Execute o seguinte comando em seu espaço de trabalho:

# create policy-kubecost-aws-s3.json file
cat <<EOF>policy-kubecost-aws-s3.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::${KC_BUCKET}"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucketMultipartUploads",
                "s3:AbortMultipartUpload",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:ListMultipartUploadParts"
            ],
            "Resource": [
                "arn:aws:s3:::${KC_BUCKET}",
                "arn:aws:s3:::${KC_BUCKET}/*"
            ]
        }
    ]
}
EOF
# crie AWS IAM policy
aws iam create-policy \
 --policy-name kubecost-s3-federated-policy-$YOUR_CLUSTER_NAME \
 --policy-document file://policy-kubecost-aws-s3.json

c. Crie um segredo do Kubernetes para permitir que o Kubecost grave arquivos ETL no bucket do Amazon S3.

Execute o seguinte comando em seu espaço de trabalho:

# crie o arquivo de manifesto
cat <<EOF>federated-store.yaml
type: S3
config:
  bucket: "${KC_BUCKET}"
  endpoint: "s3.amazonaws.com"
  region: "${AWS_REGION}"
  insecure: false
  signature_version2: false
  put_user_metadata:
      "X-Amz-Acl": "bucket-owner-full-control"
  http_config:
    idle_conn_timeout: 90s
    response_header_timeout: 2m
    insecure_skip_verify: false
  trace:
    enable: true
  part_size: 134217728
EOF
# Crie o Kubecost namespace e o secret do arquivo de manifesto 
kubectl create namespace ${RELEASE}
kubectl create secret generic \
  kubecost-object-store -n ${RELEASE} \
  --from-file federated-store.yaml

Etapa 3: configurar o IRSA para permitir que o Kubecost e o Prometheus leiam e escrevam métricas do Amazon Managed Service for Prometheus

Esses comandos a seguir ajudam a automatizar as seguintes tarefas:

  • Crie uma função do AWS IAM com a política de IAM gerenciada e a política confiável da AWS para as seguintes contas de serviço: kubecost-cost-analyzer-amp, kubecost-prometheus-server-amp.
  • Modifique as contas de serviço atuais do Kubernetes com anotações para anexar uma nova função do AWS IAM.

Execute o seguinte comando em seu espaço de trabalho:

eksctl create iamserviceaccount \
    --name kubecost-cost-analyzer-amp \
    --namespace ${RELEASE} \
    --cluster ${YOUR_CLUSTER_NAME} --region ${AWS_REGION} \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusQueryAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess \
   --attach-policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/kubecost-s3-federated-policy-${YOUR_CLUSTER_NAME} \ # Remove this line if you want to set up small-scale infrastructure 
    --override-existing-serviceaccounts \
    --approve
 
bash
eksctl create iamserviceaccount \
    --name kubecost-prometheus-server-amp \
    --namespace ${RELEASE} \
    --cluster ${YOUR_CLUSTER_NAME} --region ${AWS_REGION} \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusQueryAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess \
    --override-existing-serviceaccounts \
    --approve

Para obter mais informações, você pode conferir a documentação da AWS sobre as funções do AWS IAM para contas de serviço e saber mais sobre a política gerenciada do Amazon Managed Service for Prometheus em Exemplos de políticas baseadas em identidade para o Amazon Managed Service for Prometheus

Integrando o Kubecost com o Amazon Managed Service for Prometheus

Prepare o arquivo de configuração

Execute o comando a seguir para criar um arquivo chamado config-values.yaml, que contém os padrões que o Kubecost usa para se conectar ao seu espaço de trabalho do Amazon Managed Service for Prometheus.

cat << EOF > config-values.yaml
global:
  amp:
    enabled: true
    prometheusServerEndpoint: http://localhost:8005/workspaces/${AMP_WORKSPACE_ID}
    remoteWriteService: https://aps-workspaces.${AWS_REGION}.amazonaws.com/workspaces/${AMP_WORKSPACE_ID}/api/v1/remote_write
    sigv4:
      region: ${AWS_REGION}
 
sigV4Proxy:
  region: ${AWS_REGION}
  host: aps-workspaces.${AWS_REGION}.amazonaws.com
EOF

Cluster primário

Execute este comando para instalar o Kubecost e integrá-lo ao espaço de trabalho do Amazon Managed Service for Prometheus como principal:

helm upgrade -i ${RELEASE} \
oci://public.ecr.aws/kubecost/cost-analyzer --version $VERSION \
--namespace ${RELEASE} --create-namespace \
-f https://tinyurl.com/kubecost-amazon-eks \
-f config-values.yaml \
-f https://raw.githubusercontent.com/kubecost/poc-common-configurations/main/etl-federation/primary-federator.yaml \ # Remove this line if you want to set up small-scale infrastructure 
--set global.amp.prometheusServerEndpoint=${QUERYURL} \
--set global.amp.remoteWriteService=${REMOTEWRITEURL} \
--set kubecostProductConfigs.clusterName=${YOUR_CLUSTER_NAME} \
--set kubecostProductConfigs.projectID=${AWS_ACCOUNT_ID} \
--set prometheus.server.global.external_labels.cluster_id=${YOUR_CLUSTER_NAME} \
--set federatedETL.federator.primaryClusterID=${YOUR_CLUSTER_NAME} \ # Remove this line if you want to set up small-scale infrastructure 
--set serviceAccount.create=false \
--set prometheus.serviceAccounts.server.create=false \
--set serviceAccount.name=kubecost-cost-analyzer-amp \
--set prometheus.serviceAccounts.server.name=kubecost-prometheus-server-amp

Clusters adicionais

As etapas de instalação são semelhantes às do PRIMARY CLUSTER, exceto que você não precisa seguir as etapas na seção Criar o Amazon Managed Service para o espaço de trabalho do Prometheus e precisa atualizar essas variáveis de ambiente abaixo para que correspondam aos seus CLUSTERS ADICIONAIS. Observe que o AMP_WORKSPACE_ID e o KC_BUCKET são iguais ao cluster primário.

export RELEASE="kubecost"
export YOUR_CLUSTER_NAME=<YOUR_EKS_CLUSTER_NAME>
export AWS_REGION="<YOUR_AWS_REGION>"
export VERSION="1.103.4"
export KC_BUCKET="kubecost-etl-metrics"
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
export REMOTEWRITEURL="https://aps-workspaces.${AWS_REGION}.amazonaws.com/workspaces/${AMP_WORKSPACE_ID}/api/v1/remote_write"
export QUERYURL="http://localhost:8005/workspaces/${AMP_WORKSPACE_ID}"

Execute este comando para instalar o Kubecost e integrá-lo ao espaço de trabalho do Amazon Managed Service for Prometheus como o cluster adicional:

helm upgrade -i ${RELEASE} \
oci://public.ecr.aws/kubecost/cost-analyzer --version $VERSION \
--namespace ${RELEASE}  --create-namespace \
-f https://tinyurl.com/kubecost-amazon-eks \
-f config-values.yaml \
-f https://raw.githubusercontent.com/kubecost/poc-common-configurations/main/etl-federation/agent-federated.yaml \ # Remove this line if you want to set up small-scale infrastructure 
--set global.amp.prometheusServerEndpoint=${QUERYURL} \
--set global.amp.remoteWriteService=${REMOTEWRITEURL} \
--set kubecostProductConfigs.clusterName=${YOUR_CLUSTER_NAME} \
--set kubecostProductConfigs.projectID=${AWS_ACCOUNT_ID} \
--set prometheus.server.global.external_labels.cluster_id=${YOUR_CLUSTER_NAME} \
--set serviceAccount.create=false \
--set prometheus.serviceAccounts.server.create=false \
--set serviceAccount.name=kubecost-cost-analyzer-amp \
--set prometheus.serviceAccounts.server.name=kubecost-prometheus-server-amp

Monitorando os custos de sua infraestrutura de vários clusters

Exponha o painel do Kubecost

Depois de instalar o Kubecost no cluster primário e em todos os clusters adicionais, você pode voltar para o cluster principal e executar o seguinte comando para expor o painel do Kubecost:

kubectl port-forward --namespace kubecost deployment/kubecost-cost-analyzer 9090

Em seu navegador da web, navegue até http://localhost:9090 para acessar o painel.

Agora você pode começar a monitorar o custo e a eficiência do seu cluster Amazon EKS. Dependendo dos requisitos e da configuração da sua organização, há várias opções para expor o Kubecost para acesso interno contínuo. Você também pode conferir este workshop da AWS para saber como expor o Kubecost usando o AWS Load Balancer Controller.

Usando o painel Kubecost

Quando você acessa o painel do Kubecost, a visão geral padrão mostra informações abrangentes sobre todos os clusters do Amazon EKS monitorados pelo Kubecost com o Amazon Managed Service for Prometheus (ativo) e uma lista de clusters não monitorados do Amazon EKS (não monitorados). Você pode ver isso no exemplo de captura de tela a seguir:

Na visualização Monitor/Allocation, o Kubecost fornece visibilidade granular dos custos de vários clusters do Amazon EKS agregados por diferentes contextos do Kubernetes, como namespaces, controladores, pods ou rótulos. Isso ajuda você a entender quais partes do seu aplicativo ou projetos estão contribuindo para os gastos com o Amazon EKS. A captura de tela a seguir mostra um exemplo do custo de cluster do Amazon EKS agregado pelo Namespace.

Além disso, para monitorar seus custos de serviços da AWS em uma plataforma, você pode integrar o Kubecost aos seus relatórios de custo e uso da AWS e permitir que os custos de nuvem vejam os custos de cada serviço da AWS em suas contas da AWS. O exemplo de captura de tela a seguir mostra o custo de cada serviço da AWS na visualização Monitor/Cloud Costs.

Uso adicional com o Amazon Managed Service for Prometheus

Como todas as métricas de custo emitidas pelo Kubecost são armazenadas e gerenciadas centralmente no Amazon Managed Service for Prometheus para vários clusters do Amazon EKS, você pode se integrar a outras ferramentas de observabilidade suportadas pelo Amazon Managed Service for Prometheus para utilizar esses dados. Por exemplo, você pode escrever consultas PromQL personalizadas relacionadas a custos e visualizá-las no Amazon Managed Grafana ou usar o Alert Manager no modo de vários clusters. Você pode saber mais sobre essas integrações em Usando o AWS Observability Accelerator. Para saber mais sobre as cotas de serviço do Amazon Managed Service for Prometheus, você pode consultar a documentação em Amazon Managed Service para cotas de serviço do Prometheus.

Limpando

aws amp delete-workspace --alias kubecost-amp --region $AWS_REGION 
helm delete kubecost -n kubecost 
kubectl delete ns kubecost 
aws s3 rb s3://${KC_BUCKET}

Conclusão

Neste post, mostramos como você pode usar o Kubecost para monitorar ambientes Amazon EKS de vários clusters usando o Amazon Managed Service for Prometheus como armazenamento de métricas, para que você não precise se preocupar em gerenciar sua própria infraestrutura para armazenar dados do Kubecost. Em colaboração com a Kubecost, estamos entusiasmados em lançar esse novo recurso que permite monitorar e rastrear os custos de vários clusters do Amazon EKS em um único painel de vidro. Essa configuração oferece recursos avançados exclusivamente para clientes do Amazon EKS sem necessidade de licença adicional do Kubecost e inclui suporte para solução de problemas do Kubecost. Se você tiver a licença Enterprise da Kubecost, recursos adicionais serão ativados, como recursos de governança que permitem definir regras de orçamento para diferentes projetos ou auditar as dispendiosas implantações em seu cluster Amazon EKS. As licenças corporativas estão disponíveis no Kubecost ou no AWS Marketplace. Se você quiser saber mais com a equipe da Kubecost, entre em contato com eles aqui.

Outros recursos úteis para o AWS Observability:

 

Este artigo foi traduzido do Blog da AWS em Inglês.


Sobre os Autores

Linh Lam

 

 

 

 

Imaya Kumar Jagannathan é a principal arquiteto de soluções focado nas ferramentas de observabilidade da AWS, incluindo Amazon CloudWatch, AWS X-Ray, Amazon Managed Service for Prometheus, Amazon Managed Grafana e AWS Distro para telemetria aberta. Ele é apaixonado por monitoramento e observabilidade e tem uma sólida experiência em arquitetura e desenvolvimento de aplicativos. Ele gosta de trabalhar em sistemas distribuídos e está animado para falar sobre design de arquitetura de microsserviços. Ele adora programar em C#, trabalhar com contêineres e tecnologias sem servidor. LinkedIn: /imaya.

 

 

 

 

Vikram Venkataraman é arquiteto principal de soluções na Amazon Web Services e também entusiasta de contêineres. Ele ajuda a organização com as melhores práticas para executar cargas de trabalho na AWS. Em seu tempo livre, ele adora brincar com seus dois filhos e segue Cricket.

 

 

 

 

Tradutor

Jean Philip de Rogatis é Arquiteto de soluções sênior na AWS, Trabalhando na indústria de Entusiasta de novas tecnologias, construiu mais de 10 sistemas, de soluções de big data a portais de vendas, entregando um crescimento YoY de três dígitos e liderando uma equipe de 50+ pessoas. Ajuda empresas a transformar seus negócios, adotando tecnologias baseadas em nuvem para encantar seus clientes, parceiros e funcionários.

Me siga no LinkedIn: https://www.linkedin.com/in/jrogatis/