[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 생성
kubecost 가 AWS 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