전공영역 공부 기록

쿠버네티스 Metrics server

악분 2023. 10. 9. 07:55
반응형

안녕하세요. 이 글은 쿠버네티스 메트릭 API인 metrics server를 설명합니다. 실습 환경은 제 github에 공개되어 있습니다.

 

Metrics server이란?

metrics server는 노드, pod, 컨테이너 메트릭을 노출시키는 API서버입니다. 노출시키는 메트릭은 cpu, memory 사용량입니다.

 

원리

metrics server는 메트릭을 노출시키기 위해, 직접 kubelet API를 호출하여 메트릭을 수집합니다. metrics server는 HPA(Horizontal Pod Autoscaling), kubectl top 명령어 등에서 사용합니다.

 

Metrics server가 없을 때 kube API server 동작

metrics server가 없으면 metric API호출 결과가 404 Not found입니다.

 

직접 실습해보겠습니다. 실습을 위해 API server로그 레벨을 수정합니다. kube API server verbose레벨을 “4”로 수정하면, API server 응답이 로그에 남습니다. 아래 예제는 kind cluster에서 API server로그 레벨을 4로 수정합니다.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: metrics-server-practice
nodes:
- role: control-plane
  image: kindest/node:v1.28.0
  kubeadmConfigPatches:
  - |
    kind: ClusterConfiguration
    apiServer:
      extraArgs:
        v: "4"

 

로그 레벨을 수정 한 후 API server로그를 실시간 조회합니다.

kubectl -n kube-system logs -f -l component=kube-apiserver | grep "/apis/metrics"

 

metrics API를 호출합니다. kubectl top pod명령어를 사용하면 metrics API가 호출됩니다.

kubectl top pod

 

metrics server가 없기 때문에 kubectl top pod명령어는 에러가 발생합니다.

 

API server로그를 보면 metrics API요청을 404로 응답했습니다.

 

Metrics server 설치 방법

공식문서에서 제공하는 매니페스트를 사용하여 metrics server를 설치합니다. 또는 helm 차트, kustomize를 이용하여 설치할 수 있습니다.

 

저는 helm 차트를 사용하여 metrics server를 설치했습니다. kind cluster를 사용하면 metrics server pod에서 https 인증오류가 발생합니다. 그래서, helm values에서 insecure설정을 추가했습니다. 그리고 metrics server로그를 디버깅 하기 위해 로그 레벨을 4로 설정했습니다.

args:
- --kubelet-insecure-tls
- --v=4

 

helm 차트를 추가하고, 커스터마이징한 helm values를 오버라이딩하여 차트를 릴리즈합니다. 저는 default 네임스페이스에 helm 차트를 릴리즈했습니다.

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
helm upgrade --install -n default -f helm-values.yaml metrics-server metrics-server/metrics-server

 

default 네임스페이스에 metrics sevrer pod가 잘 실행되었는지 확인합니다.

 

metrics API 직접 호출

metrics API는 4종류 API가 있습니다. 

/apis/metrics.k8s.io/v1beta1/nodes
/apis/metrics.k8s.io/v1beta1/nodes/<node-name>
/apis/metrics.k8s.io/v1beta1/pods
/apis/metrics.k8s.io/v1beta1/namespaces/<namespace-name>/pods/<pod-name>

 

 

curl을 사용하여 API직접 호출

curl 등을 통해 API를 직접 호출하려면 kube-proxy를 먼저 활성화합니다. 저는 8081포트를 오픈했습니다.

kubectl proxy --port=8001

 

오픈한 포트로 metrics API를 호출합니다.

curl http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes
curl http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/nodes/<node-name>
curl http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/pods
curl http://127.0.0.1:8001/apis/metrics.k8s.io/v1beta1/namespaces/<namespace-name>/pods/<pod-name>

 

kuebctl를 사용하여 API직접 호출

kubectl명령어를 사용하면 kube-proxy없이 metrics API를 호출할 수 있습니다.

kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes
kubectl get --raw /apis/metrics.k8s.io/v1beta1/pods
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes/<node-name>
kubectl get --raw /apis/metrics.k8s.io/v1beta1/namespaces/<namespace-name>/pods/<pod-name>

 

아래 예제는 metrics API를 kubectl로 호출하여 node 메트릭을 조회했습니다. metrics API는 json포맷이고 usage필드에 메트릭이 있습니다.

# node이름 조회
$ kubectl get node
$ NODENAME="metrics-server-practice-worker"   
$ kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes/${NODENAME}" |

 

참고자료

반응형