리소스 메트릭 파이프라인
리소스 메트릭 파이프라인 (Resource metrics pipeline)
쿠버네티스에서 Metrics API 는 자동 스케일링과 유사한 사용 사례를 지원하도록 기본적인 메트릭 집합을 제공합니다. 이 API는 노드와 파드의 리소스 사용량에 대한 정보를 제공하며, CPU와 메모리 메트릭을 포함합니다. Metrics API를 클러스터에 배포하면 쿠버네티스 API의 클라이언트가 이 정보를 질의할 수 있고, 쿠버네티스의 접근 제어 메커니즘을 사용해 그렇게 하는 권한을 관리할 수 있습니다.
출처: 문서
본문
HorizontalPodAutoscaler (HPA)와 VerticalPodAutoscaler (VPA)는 metrics API의 데이터를 사용해 고객 수요에 맞게 워크로드 replica와 리소스를 조정합니다.
kubectl top 명령으로 리소스 메트릭을 볼 수도 있습니다.
Metrics API와 그것이 가능하게 하는 메트릭 파이프라인은 HPA 및/또는 VPA를 사용한 자동 스케일링을 가능하게 하는 최소한의 CPU와 메모리 메트릭만 제공합니다. 더 완전한 메트릭 집합을 제공하려면 Custom Metrics API 를 사용하는 두 번째 메트릭 파이프라인을 배포해 더 단순한 Metrics API를 보완할 수 있습니다.
그림 1은 리소스 메트릭 파이프라인의 아키텍처를 보여줍니다.
flowchart RL
subgraph cluster[Cluster]
direction RL
S[ <br><br> ]
A[Metrics-<br>Server]
subgraph B[Nodes]
direction TB
D[cAdvisor] --> C[kubelet]
E[Container<br>runtime] --> D
E1[Container<br>runtime] --> D
P[pod data] -.- C
end
L[API<br>server]
W[HPA]
C ---->|node level<br>resource metrics| A -->|metrics<br>API| L --> W
end
L ---> K[kubectl<br>top]
그림 1. 리소스 메트릭 파이프라인
그림에서 오른쪽에서 왼쪽으로 아키텍처 구성 요소는 다음과 같습니다:
- cAdvisor: Kubelet에 포함된 컨테이너 메트릭을 수집·집계·노출하는 데몬.
- kubelet: 컨테이너 리소스를 관리하는 노드 에이전트. 리소스 메트릭은
/metrics/resource와/statskubelet API 엔드포인트를 사용해 접근할 수 있습니다. - 노드 수준 리소스 메트릭:
/metrics/resource엔드포인트를 통해 사용 가능한 노드별 요약 통계를 발견·검색하기 위해 kubelet이 제공하는 API. - metrics-server: 각 kubelet에서 가져온 리소스 메트릭을 수집·집계하는 클러스터 애드온 구성 요소. API 서버가 HPA, VPA,
kubectl top명령이 사용하는 Metrics API를 제공합니다. Metrics Server는 Metrics API의 참조 구현입니다. - Metrics API: 워크로드 자동 스케일링에 사용되는 CPU와 메모리 접근을 지원하는 쿠버네티스 API. 클러스터에서 이를 동작시키려면 Metrics API를 제공하는 API 확장 서버가 필요합니다.
cAdvisor는 cgroups에서 메트릭을 읽는 것을 지원하며, 이는 Linux의 일반적인 컨테이너 런타임과 동작합니다. 가상화 같은 다른 리소스 격리 메커니즘을 사용하는 컨테이너 런타임을 사용한다면, 그 컨테이너 런타임이 메트릭을 kubelet에 제공하려면 CRI Container Metrics를 지원해야 합니다.
Metrics API
metrics-server는 Metrics API를 구현합니다. 이 API는 클러스터의 노드와 파드에 대한 CPU와 메모리 사용량에 접근할 수 있게 해줍니다. 주요 역할은 K8s 자동 확장 구성 요소에 리소스 사용 메트릭을 공급하는 것입니다.
다음은 읽기 쉽도록 jq로 파이프한 minikube 노드에 대한 Metrics API 요청 예시입니다:
kubectl get --raw "/apis/metrics.k8s.io/v1/nodes/minikube" | jq '.'
curl을 사용한 같은 API 호출:
curl http://localhost:8080/apis/metrics.k8s.io/v1/nodes/minikube
샘플 응답:
{
"kind": "NodeMetrics",
"apiVersion": "metrics.k8s.io/v1",
"metadata": {
"name": "minikube",
"selfLink": "/apis/metrics.k8s.io/v1/nodes/minikube",
"creationTimestamp": "2022-01-27T18:48:43Z"
},
"timestamp": "2022-01-27T18:48:33Z",
"window": "30s",
"usage": {
"cpu": "487558164n",
"memory": "732212Ki"
}
}
다음은 읽기 쉽도록 jq로 파이프한 kube-system 네임스페이스에 포함된 kube-scheduler-minikube 파드에 대한 Metrics API 요청 예시입니다:
kubectl get --raw "/apis/metrics.k8s.io/v1/namespaces/kube-system/pods/kube-scheduler-minikube" | jq '.'
curl을 사용한 같은 API 호출:
curl http://localhost:8080/apis/metrics.k8s.io/v1/namespaces/kube-system/pods/kube-scheduler-minikube
샘플 응답:
{
"kind": "PodMetrics",
"apiVersion": "metrics.k8s.io/v1",
"metadata": {
"name": "kube-scheduler-minikube",
"namespace": "kube-system",
"selfLink": "/apis/metrics.k8s.io/v1/namespaces/kube-system/pods/kube-scheduler-minikube",
"creationTimestamp": "2022-01-27T19:25:00Z"
},
"timestamp": "2022-01-27T19:24:31Z",
"window": "30s",
"containers": [
{
"name": "kube-scheduler",
"usage": {
"cpu": "9559630n",
"memory": "22244Ki"
}
}
]
}
Metrics API는 k8s.io/metrics 저장소에 정의되어 있습니다. API 애그리게이션 레이어를 활성화하고 metrics.k8s.io API에 대한 APIService를 등록해야 합니다.
Metrics API에 대해 더 배우려면 resource metrics API design, metrics-server 저장소, resource metrics API를 참조하세요.
Metrics API를 제공하는 metrics-server 또는 대체 어댑터를 배포해야 접근할 수 있습니다.
리소스 사용량 측정
CPU
CPU는 cpu 단위로 측정된 평균 코어 사용량으로 보고됩니다. 쿠버네티스에서 1 cpu는 클라우드 제공자의 1 vCPU/Core, 베어메탈 Intel 프로세서의 1 하이퍼스레드와 같습니다.
이 값은 커널이 제공하는 누적 CPU 카운터(Linux와 Windows 커널 모두)에서 비율을 취해 파생됩니다. CPU를 계산하는 데 사용되는 시간 윈도우는 Metrics API의 window 필드에 표시됩니다.
쿠버네티스가 CPU 리소스를 할당하고 측정하는 방법에 대해 더 배우려면 CPU의 의미를 참조하세요.
메모리
메모리는 메트릭이 수집된 순간의 작업 집합(working set)으로 보고되며 바이트로 측정됩니다.
이상적인 세계에서 "작업 집합"은 메모리 압력에서 해제할 수 없는 사용 중인 메모리의 양입니다. 그러나 작업 집합 계산은 호스트 OS에 따라 다르며, 일반적으로 추정치를 만들기 위해 휴리스틱을 많이 사용합니다.
컨테이너의 작업 집합에 대한 쿠버네티스 모델은 컨테이너 런타임이 해당 컨테이너와 관련된 익명 메모리를 계산하기를 기대합니다. 작업 집합 메트릭은 보통 일부 캐시된(파일 백업) 메모리도 포함합니다. 호스트 OS가 항상 페이지를 회수할 수는 없기 때문입니다.
쿠버네티스가 메모리 리소스를 할당하고 측정하는 방법에 대해 더 배우려면 메모리의 의미를 참조하세요.
Metrics Server
metrics-server는 kubelet에서 리소스 메트릭을 가져와 HPA와 VPA가 사용하도록 Metrics API를 통해 쿠버네티스 API 서버에 노출합니다. kubectl top 명령으로 이 메트릭을 볼 수도 있습니다.
metrics-server는 쿠버네티스 API를 사용해 클러스터의 노드와 파드를 추적합니다. metrics-server는 HTTP를 통해 각 노드에 질의해 메트릭을 가져옵니다. metrics-server는 또한 파드 메타데이터의 내부 보기를 구축하고 파드 상태의 캐시를 유지합니다. 그 캐시된 파드 상태 정보는 metrics-server가 제공하는 확장 API를 통해 사용할 수 있습니다.
예를 들어 HPA 질의에서 metrics-server는 deployment의 라벨 선택자를 충족하는 파드를 식별해야 합니다.
metrics-server는 각 노드에서 메트릭을 수집하기 위해 kubelet API를 호출합니다. metrics-server 버전에 따라 다음을 사용합니다:
- v0.6.0+ 버전의 메트릭 리소스 엔드포인트
/metrics/resource또는 - 이전 버전의 Summary API 엔드포인트
/stats/summary
더 알아보기 (Learn more)
metrics-server에 대해 더 배우려면 metrics-server 저장소를 참조하세요.
다음도 확인할 수 있습니다:
- metrics-server 설계
- metrics-server FAQ
- metrics-server 알려진 문제
- metrics-server 릴리스
- Horizontal Pod Autoscaling
kubelet이 노드 메트릭을 어떻게 제공하고 쿠버네티스 API를 통해 그것에 접근하는지 배우려면 Node Metrics Data를 읽어보세요.