지난 포스팅 (
Kubecost #1 - OverviewKubecost #1 - Overview) 에서는 Kubecost가 무엇인지, 어떤 아키텍처로 구성되어있는지, 그리고 어떤 기능들이 있는지 소개했습니다.

이번 포스팅에서는 쿠버네티스 비용을 줄이기 위해 Kubecost가 어떻게 비용 분석을 진행하는지 조금 자세하게 알아보겠습니다.
TL;DR
Idle과 Efficiency 요약
•
Idle: 자원을 할당(요청)했지만, 실제로 사용하지 않는 리소스
◦
Workload Idle, Infra Idle로 구분은 필요하지만 이 정도면 충분
•
Efficiency: 리소스 사용 효율성 지표, Kubecost에서 Efficiency는 Resource Utilization(리소스 사용률)을 Resource Request(리소스 요청)으로 나눈 값이며 비용 가중치가 있음
•
단순히 Idle을 낮추고 Efficiency를 높이는 것이 능사는 아니며, 서비스 안정성이 전제가 된 상태에서 비용 절감 활동이 진행되어야 함
Idle and Efficiency
Kubecost는 쿠버네티스 비용을 분석하는데 있어 두가지 핵심 개념을 가져갑니다.
•
Idle (유휴)
•
Efficiency (효율성)
Kubecost에서 Idle과 Efficiency를 어떻게 정의하는지 알아보고, 어떻게 비용 분석 및 비용을 절감하는데 사용할 수 있는지 알아봅니다.
Idle
일반적으로 Idle 리소스라 함은 리소스를 할당 받았지만, 실제로는 사용되지 않는 리소스를 말합니다.
즉, 리소스가 오버 프로비저닝 된 상태를 주로 말하며 Idle 리소스가 많다는 것은 리소스 낭비라고 볼 수 있습니다.
쿠버네티스에서는 보통 다음 경우들을 Idle이라고 생각할 수 있습니다.
•
실제 사용량보다 과도하게 설정된 리소스 요청 (Resource Request)
•
사용하지 않는 PV
•
Idle 상태의 워커노드
Kubecost에서는 Idle 리소스를 분석할 때, Cluster 레벨과 Node 레벨 크게 두가지로 생각합니다.
Cluster Idle Cost
Cluster 레벨에서 Idle Cost는 클러스터 전체(사용이 되던, 되지 않던)에 비용에서 CPU/Memory 등의 리소스가 할당된 비용을 제외한 것을 말합니다.
idle_cost = sum(cluster_cost) - (cpu_allocation_cost + ram_allocation_cost + gpu_allocation_cost)
allocation_cost 에 대해서
위 수식에서 allocation_cost는 리소스 할당(request)와 실제 리소스 사용량(usage) 중 더 큰 값으로 계산합니다. 이를 나타내면 다음과 같습니다.
allocation = max(request, usage)
따라서 Idle cost를 단순히 쿠버네티스 스케줄러가 Pod를 할당하고 남아 있는 리소스 비용이라고 말할 수 없습니다.
대부분은 Pod에게 할당한 만큼 Pod가 100% 자원을 모두 사용하지 않으니까요.
Node Idle Cost
Node 레벨에서 Idle Cost는 Cluster Idle Cost와 동일하지만 단위가 Node로 작아졌다고 생각하면 편합니다.
따라서 동일하게 하나의 노드 전체 비용에서 CPU/Memory 등의 리소스가 할당된 비용을 제외한 것을 말합니다.
idle_cost = sum(node_cost) - (cpu_allocation_cost + ram_allocation_cost + gpu_allocation_cost)
Efficiency
Kubecost에서 Efficiency는 주어진 시간 범위에서 Resource Utilization(리소스 사용률)을 Resource Request(리소스 요청)으로 나눈 값으로 정의합니다.
Efficiency를 계산할 때는 해당 리소스의 비용 가중치가 적용되며 아래 같이 수식화 할 수 있습니다.
(((CPU Usage / CPU Requested) * CPU Cost) + ((RAM Usage / RAM Requested) * RAM Cost)) / (RAM Cost + CPU Cost)
위 Efficiency 계산에서 CPU Usage와 RAM Usage는 다음과 같이 계산합니다.
CPU Usage = rate(container_cpu_usage_seconds_total)
RAM Usage = avg(container_memory_working_set_bytes) or avg(container_memory_usage_bytes)
예를 들어, 어떤 Pod가 2CPU, 1GiB의 자원을 요청하고, 500m의 CPU, 500MiB를 사용한다고 가정하겠습니다.
CPU의 비용은 $10/CPU, 메모리는 $1/GiB 인 경우 Pod의 Efficiency는 아래와 같이 계산됩니다.
((0.5/2) * 20 + (0.5/1) * 1) / (20+1) ≈ 26%
Idle 과 Efficiency 지표를 활용한 비용 절감
Kubecost는 Idle과 Efficiency를 모니터링하고, 쿠버네티스 클러스터의 비용 절감에 활용합니다.
비용 절감을 위한 일반적인 패턴은 다음 두가지를 들 수 있습니다.
1.
각 서비스 담당자는 자신이 관리하는 Pod의 Efficiency를 향상 시키기 위해 Pod의 리소스를 조정합니다. (Increase Workload Efficiency)
2.
클러스터 담당자는 Idle을 줄이기 위해 클러스터를 조정합니다. (Reduce Cluster Idle)
Efficiency는 보통 application의 SLA(Service level agreement, 서비스수준협약) 에 따라 목표가 달라지는 경우가 많습니다.
Idle은 Kubecost의 경우 일반적으로 다음을 목표하도록 가이드하고 있습니다.
•
Kubecost가 권장하는 목표 값
◦
CPU: 50%-65%
◦
Memory: 45%-60%
◦
Storage: 65%-80%
리소스 활용도가 너무 낮으면 당연히 비용 낭비이지만, 반대로 활용도가 너무 높으면 지연 시간 증가, 서비스 안정성 문제 등 기타 negative behavior 이 발생할 가능성이 높아집니다.
따라서 Kubecost 대시보드에서 Idle을 최대한 작게, Efficiency는 최대한 높게 목표하는 것은 적절하지 않으며, 서비스 안정성이 전제가 된 상태에서 비용 절감 활동이 진행되어야 합니다.
Idle과 Efficiency? 비슷해보이기도 하고, 다른 것 같기도하고
Idle과 Efficiency는 개인적인 의견으로 각각 비용 분석 관점이 다르다고 보는게 적합할 것 같습니다.
•
Idle은 "얼마나 낭비되고 있는가"에 초점을 맞춥니다 (비용 절감 관점)
•
Efficiency는 "얼마나 잘 활용하고 있는가"에 초점을 맞춥니다 (최적화 관점)
또한, Idle이 높으면 Efficiency가 낮다 또는 Idle이 낮으니 Efficiency가 높다고 일반적으로 생각하기 쉬운데, 항상 그렇다고 할 수 없습니다.
예를 들면, 다음과 같은 경우가 있습니다.
•
A 노드 타입의 CPU 비용은 $10/CPU, 메모리는 $1/GiB
•
B 노드 타입의 CPU 비용은 $1/CPU, 메모리는 $10/GiB
•
A,B 노드 타입 각각에서 2CPU, 1GiB의 자원을 요청하고, 500m의 CPU, 500MiB를 사용한다고 가정
◦
A의 경우 Efficiency
▪
((0.5/2) * 20 + (0.5/1) * 1) / (20+1) ≈ 26%
◦
B의 경우 Efficiency
▪
((0.5/2) * 2 + (0.5/1) * 10) / (2+10) ≈ 46%
•
Idle은 A,B 모두 같지만, 워크로드가 CPU보다는 Memory 사용 비중이 더 높음
•
Efficiency: A는 낮고, B는 높음
◦
A의 경우 CPU가 더 비싼 잘못된 노드 타입 사용으로 비용 효율성이 낮음
같은 크기의 Idle이 발생함에도 B의 경우는 상대적으로 비용이 높은 Memory 리소스의 사용률이 더 높기 때문에 비용 효율성이 높게 측정됩니다.
Efficiency Dashboard
Efficiency Report(Dashboard)는 Kubecost 2.3 버전에서 추가된 것으로, 쿠버네티스 클러스터 전반의 Efficiency와 Idle에 대해서 모니터링할 수 있는 전용 대시보드입니다.
클러스터 레벨, 노드 레벨 등 다양한 뷰를 제공하며 3가지 타입의 Efficiency를 체크할 수 있습니다.
•
Idle by type: A high-level view of your wasted spend for each cluster broken down by Workload Idle and Infra Idle.
◦
Idle 분석의 첫 단계 뷰로, 클러스터의 총 Idle, Workload Idle, Infra Idle 등의 지표를 볼 수 있습니다.
•
Resource idle by workload: A resource-specific (CPU, RAM, etc.) breakdown view of Workload Idle and Workload Efficiency for all of your Kubernetes workloads.
◦
Workload Idle을 drill-down해서 분석하는 뷰로 각 Workload Idle을 CPU, Memory, GPU 등으로 분리하여 보여줍니다.
•
Resource idle by cluster: A resource-specific (CPU, RAM, etc.) breakdown view of Infra Idle for all of your clusters and nodes.
◦
Infra Idle을 drill-down해서 분석하는 뷰로 어느 클러스터에서 CPU, Memory 별로 Infra Idle 이 발생하는지 보여줍니다.
Definitions
앞서 정의한 Idle은 비용 절감 분석을 위해 Workload Idle과 Infra Idle로 세분화됩니다.
•
Workload Idle
◦
Kubernetes 워크로드에서 요청했지만 사용하지 않는 리소스의 비용입니다.
◦
Workload 레벨에서는 max(usage, request)를 사용할 필요가 없습니다.
▪
항상 request - usage 로 계산되기 때문
◦
예를 들어 하나의 컨테이너로 구성된 Pod가 2GiB의 메모리를 Request하고, 1GiB만 사용한다면 1GiB의 Workload Idle이 발생하고 있다고 말합니다.
•
Infra Idle
◦
요청한 인프라에서 사용하지 않는 인프라의 비용입니다.
◦
max(usage, request) 를 동일하게 사용합니다.
◦
예를 들어 가용한 메모리가 32GiB인 워커노드에 하나의 컨테이너로 구성된 2개의 Pod가 실행되고 있습니다.Pod 1번은 2GiB의 메모리를 Request하고 1GiB만 사용합니다Pod 2번은 Request를 명시하지 않았으나(또는 명시했어도 usage보다 작은 경우) 3GiB를 사용합니다.이 경우 32GiB - max(2GiB, 1GiB) - max(0, 3GiB) = 27GiB로 총 27GiB에 대한 Infra Idle이 발생하고 있다고 말합니다.
◦
앞서 정의한 Idl이 Infra Idle과 동일합니다.
그 외에도 추가적인 정의가 필요합니다.
•
Total Idle: Worload Idle + Infra Idle
•
Cluster Efficiency: 모든 리소스(CPU, RAM, GPU)의 총 비용에 대한 사용된 리소스(CPU, RAM, GPU) 비용의 비율입니다.(The ratio of the cost of used resources to the total cost of all resources.)
•
Workload Efficiency: 워크로드에 대해 요청된 리소스에 사용된 비용 가중 비율입니다.(The cost-weighted ratio of resources used to resources requested.)
Example
위 개념은 예시를 통해 설명하면 이해에 훨씬 도움이 됩니다.
기본적으로 Kubernetes 전체 비용은 $300라고 가정하고, 여기서 실제로 사용된 비용은 $50라고 하겠습니다.
Workload에 Request 했지만 사용하지 않아 지출된 $150은 Workload Idle이라고 합니다.
어떤 Workload도 할당하지 않고 사용되지 않은 $100=$300-max($200, $50)은 Infra Idle입니다.
이 경우 Cluster Efficiency는 $50 / $300 ≈ 16.7% 입니다.
이 경우 Workload Efficiency는 $50 / $200 = 25% 입니다. (리소스별 비용에 가중치가 있기 때문에, 리소스별 비용에 따라 달라질 수 있습니다.)
마치며
Kubecost를 통해 쿠버네티스 비용 절감 / 최적화를 하려는 경우, Idle과 Efficiency는 핵심적인 지표 역할을 합니다.
또한 이 포스트를 통해 알 수 는 중요한 포인트는, 단순히 Idle은 낮추고, Efficiency를 높이는 것은 비용에 대한 최적화 일뿐, 서비스의 안정성은 보장되지 않는다는 점 입니다.
따라서 안정적인 쿠버네티스 클러스터 운영이 전제가 된 상태에서 비용을 최적화 하는 것이 필요합니다.
추가로, 클러스터 비용, 즉 인프라의 비용 절감 없이 Workload Efficiency만 추구하는 경우 Workload는 최적화되겠지만 전체 비용(클러스터 비용)은 그대로입니다.
결과적으로 Infra Idle만 늘어날 뿐 실질적인 비용 절감 효과가 크지 않을 수도 있습니다.
따라서 비용 절감에는 서비스 담당자의 Workload 비용 절감과 클러스터 담당자의 Infra 비용 절감 활동을 함께하는 것이 좋은 방법입니다.
이제 Kubecost의 기능과 개념에 대해서는 마무리하고, 다음에는 AWS AMP를 연동하고 Grafana에 가시화하는 내용을 포스팅하겠습니다.