쿠버네티스 Resource metrics pipeline
쿠버네티스의 노드와 파드의 리소스사용량, replica 갯수 등등 기본적인 모니터링수치를 집계하여 확인할 수 있게 하고 조건을 통해 알람체계를 구축하기위해 정보를 찾던 중 resource-metric-pipeline, full-metric-pipeline 에 대하여 알게 되었다.
resource-metric-pipeline과 full-metric-pipeline 은 둘다 노드,팟의 리소스 수치를 쿠버네티스 내부 API 에서 이용할 수 있도록 집계를 활성화한다는 점에서는 동일하지만 다루는 수치의 가짓수(resource-metric-pipeline은 cpu,memory 등으로 매우 제한적)나 목적등에서 차이를 보인다.
이 글에서는 resource-metric-pipeline 을 다룬다.
resource-metric-pipeline 은 보통 k8s에서 hpa(horizontal pod autoscaler)를 구현하거나, pod 및 node 사용량을 조회하기 위해 필요하다.
resource-metric-pipeline 의 아키텍처
metrics-server는 kubelet에서 제공하는 summary api 를 이용하여 node,pod의 memory,cpu 정보를 집계한다. metric api의 목적은 HPA,VPA가 활용할 수 있도록 내부적으로 필요한 정보를 제공하는데 있다.
metric-sesrver가 정상작동하게 되면 간단하게 kubectl top pod, kubectl top node 등의 명령어로 node와 pod의 resource 사용량 집계를 확인해볼 수 있다.
metrics-server 설치
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
metric api 호출
다음은 metric-server 가 제공하는 모든 node의 정보를 조회하는 api를 호출해보는 예시 이다.
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq '.'
응답은 다음과 같다.
{ "kind": "NodeMetricsList", "apiVersion": "metrics.k8s.io/v1beta1", "metadata": {}, "items": [ { "metadata": { "name": "ip-10-20-7-250.us-west-2.compute.internal", "creationTimestamp": "2023-09-09T09:28:43Z", "labels": { "beta.kubernetes.io/arch": "amd64", "beta.kubernetes.io/instance-type": "t3.small", "beta.kubernetes.io/os": "linux", "eks.amazonaws.com/capacityType": "ON_DEMAND", "eks.amazonaws.com/nodegroup": "node-group-2-20230821130919647400000010", "eks.amazonaws.com/nodegroup-image": "ami-03c98ebe506f3c7be", "eks.amazonaws.com/sourceLaunchTemplateId": "lt-04030d5048308b48e", "eks.amazonaws.com/sourceLaunchTemplateVersion": "1", "failure-domain.beta.kubernetes.io/region": "us-west-2", "failure-domain.beta.kubernetes.io/zone": "us-west-2a", "k8s.io/cloud-provider-aws": "013a2d9fbd87fa6b46ab93b9b7a4fc40", "kubernetes.io/arch": "amd64", "kubernetes.io/hostname": "ip-10-20-7-250.us-west-2.compute.internal", "kubernetes.io/os": "linux", "node.kubernetes.io/instance-type": "t3.small", "topology.kubernetes.io/region": "us-west-2", "topology.kubernetes.io/zone": "us-west-2a" } }, "timestamp": "2023-09-09T09:28:30Z", "window": "20.054s", "usage": { "cpu": "46843953n", "memory": "1051548Ki" } }, { "metadata": { "name": "ip-10-20-8-123.us-west-2.compute.internal", "creationTimestamp": "2023-09-09T09:28:43Z", "labels": { "beta.kubernetes.io/arch": "amd64", "beta.kubernetes.io/instance-type": "t3.small", "beta.kubernetes.io/os": "linux", "eks.amazonaws.com/capacityType": "ON_DEMAND", "eks.amazonaws.com/nodegroup": "node-group-2-20230821130919647400000010", "eks.amazonaws.com/nodegroup-image": "ami-03c98ebe506f3c7be", "eks.amazonaws.com/sourceLaunchTemplateId": "lt-04030d5048308b48e", "eks.amazonaws.com/sourceLaunchTemplateVersion": "1", "failure-domain.beta.kubernetes.io/region": "us-west-2", "failure-domain.beta.kubernetes.io/zone": "us-west-2b", "k8s.io/cloud-provider-aws": "013a2d9fbd87fa6b46ab93b9b7a4fc40", "kubernetes.io/arch": "amd64", "kubernetes.io/hostname": "ip-10-20-8-123.us-west-2.compute.internal", "kubernetes.io/os": "linux", "node.kubernetes.io/instance-type": "t3.small", "topology.kubernetes.io/region": "us-west-2", "topology.kubernetes.io/zone": "us-west-2b" } }, "timestamp": "2023-09-09T09:28:30Z", "window": "20.047s", "usage": { "cpu": "43966017n", "memory": "891988Ki" } } ] }
기본적으로 node의 os, architecture, instance-type 등 정보와 더불어 cpu,memory % 를 함께 확인할 수 있다.
kubectl top 호출
kubectl 명령으로 node, pod의 resource 사용량을 조회할 수 있다.
pod 의 resource 사용량을 조회한 모습이다
kubectl top pod -n test NAME CPU(cores) MEMORY(bytes) monster-quest-game-deploy-54949f4f8c-g5k6p 2m 165Mi monster-quest-game-deploy-54949f4f8c-n9bpn 2m 164Mi monster-quest-game-deploy-856849895f-59w4z 2m 116Mi
node의 resource 사용량을 조회한 모습이다
kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% ip-10-20-7-250.us-west-2.compute.internal 48m 2% 1037Mi 71% ip-10-20-8-123.us-west-2.compute.internal 42m 2% 871Mi 60%
hpa 적용
아래와 같이 autoscaler를 적용시키면, pod의 cpu%가 50을 넘기는 것을 기준으로 새로운 pod가 생성되어 결과적으로 autoscale이 기능하게 된다
kubectl autoscale deployment my-app --cpu-percent=50 --min=1 --max=10
참고
https://github.com/kubernetes-sigs/metrics-server