카테고리 없음

쿠버네티스 Resource metrics pipeline

daniel_lab 2023. 9. 9. 18:20

쿠버네티스의 노드와 파드의 리소스사용량, 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