Kubecost 사용하기
Kubecost는 Kubernetes 환경에서 지출 및 리소스 효율성에 대한 가시성을 고객에게 제공합니다. 대략적으로, Amazon EKS 비용 모니터링은 오픈소스 모니터링 시스템이자 시계열 데이터베이스인 Prometheus를 포함하는 Kubecost로 배포됩니다. Kubecost는 Prometheus에서 메트릭을 읽은 다음 비용 할당 계산을 수행하고 메트릭을 다시 Prometheus에 씁니다. 마지막으로, Kubecost 프론트엔드가 Prometheus에서 메트릭을 읽어 Kubecost 사용자 인터페이스(UI)에 표시합니다. 아키텍처는 다음 다이어그램으로 설명됩니다:

Kubecost를 사용하는 이유
고객이 애플리케이션을 현대화하고 Amazon EKS를 사용하여 워크로드를 배포하면서, 애플리케이션 실행에 필요한 컴퓨팅 리소스를 통합하여 효율성을 얻습니다. 그러나 이러한 사용률 효율성은 애플리케이션 비용 측정이 어려워지는 대가를 수반합니다. 현재 다음 방법 중 하나를 사용하여 테넌트별로 비용을 분배할 수 있습니다:
- 하드 멀티 테넌시 — 전용 AWS 계정에서 별도의 EKS 클러스터를 실행합니다.
- 소프트 멀티 테넌시 — 공유 EKS 클러스터에서 여러 노드 그룹을 실행합니다.
- 소비 기반 과금 — 공유 EKS 클러스터에서 리소스 소비를 사용하여 발생한 비용을 계산합니다.
하드 멀티 테넌시를 사용하면 워크로드가 별도의 EKS 클러스터에 배포되어 각 테넌트의 지출을 결정하기 위한 보고서를 실행할 필요 없이 클러스터와 종속성에 대해 발생한 비용을 식별할 수 있습니다. 소프트 멀티 테넌시를 사용하면 Node Selectors 및 Node Affinity와 같은 Kubernetes 기능을 사용하여 Kubernetes 스케줄러가 전용 노드 그룹에서 테넌트의 워크로드를 실행하도록 지시할 수 있습니다. 노드 그룹의 EC2 인스턴스에 식별자(제품 이름 또는 팀 이름 등)로 태그 를 지정하고 태그를 사용하여 비용을 분배할 수 있습니다. 위 두 접근 방식의 단점은 미사용 용량이 발생할 수 있으며 밀도 높은 클러스터를 실행할 때 오는 비용 절감을 완전히 활용하지 못할 수 있다는 것입니다. Elastic Load Balancing, 네트워크 전송 비용과 같은 공유 리소스의 비용을 할당하는 방법이 여전히 필요합니다.
멀티 테넌트 Kubernetes 클러스터에서 비용을 추적하는 가장 효율적인 방법은 워크로드가 소비한 리소스 양을 기반으로 발생한 비용을 분배하는 것입니다. 이 패턴을 사용하면 다른 워크로드가 노드를 공유할 수 있어 EC2 인스턴스의 사용률을 최대화하고 노드의 pod 밀도를 높일 수 있습니다. 그러나 워크로드 또는 네임스페이스별 비용 계산은 어려운 작업입니다. 워크로드의 비용 책임을 이해하려면 시간 범위 동안 소비되거나 예약된 모든 리소스를 집계하고 리소스 비용과 사용 기간을 기반으로 요금을 평가해야 합니다. 이것이 바로 Kubecost가 해결하고자 하는 정확한 과제입니다.
One Observability Workshop에서 Kubecost에 대한 실습 경험을 해보세요.
권장 사항
비용 할당
Kubecost Cost Allocation 대시보드를 사용하면 네임스페이스, k8s 레이블, 서비스 등 모든 기본 Kubernetes 개념에 걸쳐 할당된 지출과 최적화 기회를 빠르게 확인할 수 있습니다. 또한 팀, 제품/프로젝트, 부서, 환경과 같은 조직 개념에 비용을 할당할 수도 있습니다. 날짜 범위, 필터를 수정하여 특정 워크로드에 대한 인사이트를 도출하고 보고서를 저장할 수 있습니다. Kubernetes 비용을 최적화하려면 효율성과 클러스터 유휴 비용에 주의를 기울여야 합니다.

효율성
Pod 리소스 효율성은 주어진 시간 창에서 리소스 사용률 대 리소스 요청의 비율로 정의됩니다. 비용 가중치가 적용되며 다음과 같이 표현할 수 있습니다:
(((CPU Usage / CPU Requested) * CPU Cost) + ((RAM Usage / RAM Requested) * RAM Cost)) / (RAM Cost + CPU Cost)
여기서 CPU Usage = rate(container_cpu_usage_seconds_total) (시간 창에 걸쳐), RAM Usage = avg(container_memory_working_set_bytes) (시간 창에 걸쳐)
AWS가 명시적인 RAM, CPU 또는 GPU 가격을 제공하지 않으므로, Kubecost 모델은 제공된 기본 CPU, GPU 및 RAM 가격 입력의 비율로 대체합니다. 이러한 파라미터의 기본값은 클라우드 공급자의 한계 리소스 요율을 기반으로 하지만 Kubecost 내에서 사용자 지정할 수 있습니다. 이러한 기본 리소스(RAM/CPU/GPU) 가격은 각 구성 요소의 합계가 공급자의 과금 요율을 기반으로 프로비저닝된 노드의 총 가격과 동일하도록 정규화됩니다.
각 서비스 팀은 최대 효율성을 향해 나아가고 목표를 달성하기 위해 워크로드를 미세 조정할 책임이 있습니다.
유휴 비용
클러스터 유휴 비용은 할당된 리소스의 비용과 해당 리소스가 실행되는 하드웨어 비용 간의 차이로 정의됩니다. 할당은 사용량과 요청의 최대값으로 정의됩니다. 다음과 같이 표현할 수도 있습니다:
idle_cost = sum(node_cost) - (cpu_allocation_cost + ram_allocation_cost + gpu_allocation_cost)
여기서 allocation = max(request, usage)
따라서 유휴 비용은 Kubernetes 스케줄러가 기존 워크로드를 방해하지 않고 pod를 예약할 수 있지만 현재 예약되지 않은 공간의 비용으로 생각할 수도 있습니다. 구성 방법에 따라 워크로드, 클러스터 또는 노드별로 분배할 수 있습니다.