새소식

AWS/EKS

[EKS Study 4주차] kubecost - AMP 연동

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 AEWS Study 4주차 스터디 내용 정리

이번 포스팅에서는 kubecost 와 AWS Managed Prometheus(AMP) 서비스를 연동하는 법에 대해 알아보겠습니다.

 

kubecost시계열 데이터 저장을 위해 Prometheus 를 사용하고 있습니다.
그렇기 때문에 최근 서울 리전에 출시된 AWS Managed Prometheus 도 Kubecost 의 저장 공간으로 사용할 수 있습니다.

 

AMP 는 완전관리형 서비스이기 때문에 kubecost 의 데이터가 얼마나 되던,

EKS Cluster의 사이즈가 얼마나 크던 상관없이 kubecost 의 비용 데이터를 수집할 수 있다는 장점이 있습니다.

 

Kubecost 와 AWS Managed Prometheus 를 연동한 아키텍처는 다음과 같습니다.

 

1. kubecost 설정

EKS 1.23 버전 이상은 kubecost 를 설치하기 위해 EBS CSI Driver 가 필요합니다.

 

1.1. EBS CSI Driver 설치

 

EBS CSI Driver 를 위한 IRSA 를 생성합니다.

eksctl create iamserviceaccount   \
    --name ebs-csi-controller-sa   \
    --namespace kube-system   \
    --cluster $CLUSTER_NAME   \
    --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy  \
    --approve \
    --role-only \
    --role-name AmazonEKS_EBS_CSI_DriverRole

 

해당 IRSA 를 통해 EBS CSI Driver 를 설치합니다.

export SERVICE_ACCOUNT_ROLE_ARN=$(aws iam get-role --role-name AmazonEKS_EBS_CSI_DriverRole | jq -r '.Role.Arn')

eksctl create addon \
    --name aws-ebs-csi-driver \
    --cluster $CLUSTER_NAME \
    --service-account-role-arn $SERVICE_ACCOUNT_ROLE_ARN \
    --force

 

1.2. kubecost 설치

 

AWS 호환 kubecost 버전 확인

 

ECR Public Gallery

Amazon ECR Public Gallery is a website that allows anyone to browse and search for public container images, view developer-provided details, and see pull commands

gallery.ecr.aws

 

Helm 을 사용하여 kubecost 를 설치합니다. (2023.05 기준, 최신 1.103.3 버전)

helm upgrade -i kubecost \
oci://public.ecr.aws/kubecost/cost-analyzer --version 1.103.3 \
--namespace kubecost --create-namespace \
-f https://tinyurl.com/kubecost-amazon-eks

 

 

1.3. AMP 접근 권한을 가진 IRSA 생성

 

kubecostAWS Managed Prometheus 에 Metrics 을 전송할 수 있도록 접근 권한을 가진 IRSA 를 생성합니다.

필요 정책

AmazonPrometheusQueryAccess
AmazonPrometheusRemoteWriteAccess

 

Kubecost-cost-analyzer 를 위한 IRSA

eksctl create iamserviceaccount \
    --name kubecost-cost-analyzer \
    --namespace kubecost \
    --cluster $CLUSTER_NAME --region ap-northeast-2 \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusQueryAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess \
    --override-existing-serviceaccounts \
    --approve

 

Kubecost-prometheus-server 를 위한 IRSA

eksctl create iamserviceaccount \
    --name kubecost-prometheus-server \
    --namespace kubecost \
    --cluster $CLUSTER_NAME --region ap-northeast-2 \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusQueryAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess \
    --override-existing-serviceaccounts \
    --approve

 

 

2. AWS Managed Prometheus 설정

 

2.1. Workspace 생성

 

Kubecost 가 Metrics 을 전송할 AMP Workspace 를 생성합니다.

 

AWS Console

 

AWS CLI

aws amp create-workspace --alias kubecost-amp --region ap-northeast-2

 

 

AMP Workspace 확인

 

2.2. AMP 연동을 위한 Kubecost values.yaml 생성

export AWS_REGION=ap-northeast-2
export AMP_WORKSPACE_ID=ws-bf8ed488-2731-4217-a745-0782d5e5e811

 

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
EOFcat << 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

 

 

2.3. kubecost 재구성

 

Helm 재배포

helm upgrade -i kubecost \
oci://public.ecr.aws/kubecost/cost-analyzer --version 1.103.3 \
--namespace kubecost --create-namespace \
-f https://tinyurl.com/kubecost-amazon-eks \
-f config-values.yaml

Prometheus Server 재배포

AMP 로 Metrics 을 전송하게 만듭니다.

kubectl rollout restart deployment/kubecost-prometheus-server -n kubecost

 

2.4. kubecost 확인

 

Kubecost 접속을 위한 Ingress 생성

cat << EOT > kubecost-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubecost-alb-ingress
  namespace: kubecost
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/scheme: internet-facing
spec:
  rules:
    - http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: kubecost-cost-analyzer
              port:
                number: 9090
EOT
kubectl create -f kubecost-ingress.yaml

 

 

2.5. AWS Managed Prometheus 확인

 

AMP 에 Metrics 이 전송되고 있는지 확인해봅니다.

 

Kubecost 에서 전송하는 로그를 확인해봅니다.

kubectl logs deploy/kubecost-prometheus-server -c prometheus-server -n kubecost --follow

 

 

Prometheus Server 설정 확인 (Metrics 전송)

kubectl describe configmaps -n kubecost kubecost-prometheus-server | grep remote_write -A2

 

 

Kubecost 설정 확인 (AMP Query)

kubectl describe configmaps -n kubecost kubecost-cost-analyzer

 

 


이번에는 Kubecost 와 AMP 를 연동하는 법에 대해 알아보았습니다.

 

AMP 를 사용하면서 느낀 점은 AMP의 AWS Console 은 많이 부족하다는 점입니다.

이번에 AMP 를 연동해봤지만 콘솔 상에서는 큰 변화를 확인하지 못했습니다.

 

제가 못찾은 건지 모르겠지만 AMP 에 수집된 데이터나 AMP 와의 연동 정보 등을 확인할 수 있는 방법이 없었습니다.

이제 막 서울 리전에 출시된 서비스이니 점차 나아질 것으로 믿어 의심치 않습니다.

 

 

참고 문서

https://malwareanalysis.tistory.com/602

https://docs.kubecost.com/install-and-configure/install/custom-prom/aws-amp-integration

https://aws.amazon.com/ko/blogs/mt/integrating-kubecost-with-amazon-managed-service-for-prometheus/

https://docs.aws.amazon.com/ko_kr/prometheus/latest/userguide/integrating-kubecost.html

Contents

포스팅 주소를 복사했습니다