본문 바로가기
운영체제 (LNX,WIN)

Kubernetes 컨테이너 상태정보 API 통해 JSON 형태로 수집 방법

by 날으는물고기 2024. 6. 24.

Kubernetes 컨테이너 상태정보 API 통해 JSON 형태로 수집 방법

Kubernetes에서 컨테이너의 stats 정보를 JSON 형태로 받아오려면 Kubernetes API를 직접 사용할 수 있습니다. 다음은 기본적인 절차를 설명합니다.

1. API 액세스 준비

Kubernetes 클러스터와 소통하기 위해 kubectl을 설정하거나, 직접 API를 호출할 수 있는 권한과 토큰을 확보해야 합니다.

2. Metrics 서버 설치

컨테이너의 리소스 사용량(예: CPU, 메모리)을 수집하고 API를 통해 제공하려면 Metrics 서버가 클러스터에 설치되어 있어야 합니다. Metrics 서버는 Kubernetes 클러스터의 리소스 사용 데이터를 수집하는 역할을 합니다. 설치가 되어 있지 않다면, 아래 명령을 통해 설치할 수 있습니다.

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

3. API를 통한 데이터 조회

Metrics 서버가 설치되면, kubectl 명령어 또는 Kubernetes API를 직접 호출하여 컨테이너의 리소스 사용 데이터를 조회할 수 있습니다. 예를 들어, 모든 파드의 메트릭을 조회하는 방법은 다음과 같습니다.

kubectl을 사용한 방법

kubectl top pod --all-namespaces

직접 API 호출

API를 직접 호출하려면, 적절한 API 엔드포인트에 요청을 보내야 합니다. 예를 들어, 파드 메트릭을 가져오기 위한 API 요청은 다음과 같이 구성될 수 있습니다.

curl -X GET https://<api-server-url>/apis/metrics.k8s.io/v1beta1/pods \
  -H "Authorization: Bearer <your-token>" \
  -H "Accept: application/json"

이 요청은 모든 네임스페이스에 있는 파드의 CPU 및 메모리 사용량을 반환합니다. 여기서 <api-server-url>은 클러스터의 API 서버 주소이고 <your-token>은 적절한 인증 토큰입니다.

JSON 파싱

받아온 데이터는 이미 JSON 형식이므로, 필요에 따라 이 데이터를 파싱하고 사용할 수 있습니다.

이러한 절차를 통해 Kubernetes 클러스터 내의 컨테이너들에 대한 성능 지표를 JSON 형태로 수집하고 활용할 수 있습니다. 이 방법은 docker stats를 사용하는 대신, Kubernetes 클러스터 환경에 특화된 방법입니다.

 

Kubernetes API를 사용하여 컨테이너의 CPU 및 메모리 사용량을 수집하고, 그 중 상위 5개를 JSON 형식으로 출력하는 Python 스크립트를 작성하는 것을 예로 들겠습니다.

  1. Kubernetes API에서 모든 파드의 메트릭 데이터를 수집합니다.
  2. 수집된 데이터에서 각 파드의 CPU 및 메모리 사용량을 파싱합니다.
  3. 사용량이 가장 높은 상위 5개 파드를 각각 CPU 및 메모리 사용량에 따라 선별합니다.
  4. 결과를 지정된 JSON 형식으로 출력합니다.

다음은 이를 구현한 Python 스크립트 예시입니다. 이 스크립트는 kubernetes 패키지를 사용하여 클러스터와 통신하므로, 먼저 이 패키지를 설치해야 합니다.

pip install kubernetes

스크립트 코드

from kubernetes import client, config
from operator import itemgetter

# 클러스터에 연결
config.load_kube_config()

# Metrics API 클라이언트 생성
metrics_api = client.CustomObjectsApi()

# 모든 파드의 메트릭 데이터 가져오기
response = metrics_api.list_cluster_custom_object(
    group="metrics.k8s.io",
    version="v1beta1",
    plural="pods"
)

# CPU와 메모리 사용 데이터 파싱
cpu_metrics = []
mem_metrics = []

for pod in response.get('items', []):
    name = pod['metadata']['name']
    namespace = pod['metadata']['namespace']
    for container in pod['containers']:
        cpu_usage = container['usage']['cpu']
        mem_usage = container['usage']['memory']
        # CPU 및 메모리 사용량을 millicores 및 MiB로 변환
        cpu_val = int(cpu_usage.strip('n')) / 1000000
        mem_val = int(mem_usage.rstrip('Ki')) / 1024
        cpu_metrics.append({'pod': f'{namespace}/{name}', 'cpu': cpu_val})
        mem_metrics.append({'pod': f'{namespace}/{name}', 'memory': mem_val})

# CPU 및 메모리 사용량에 따라 상위 5개 파드 선별
top_cpu_pods = sorted(cpu_metrics, key=itemgetter('cpu'), reverse=True)[:5]
top_mem_pods = sorted(mem_metrics, key=itemgetter('memory'), reverse=True)[:5]

# 결과 JSON 형식으로 출력
result = {
    "cpu": top_cpu_pods,
    "mem": top_mem_pods
}

print(result)

이 스크립트는 각 파드의 CPU 및 메모리 사용량을 millicoresMiB 단위로 계산하고, 사용량이 가장 높은 상위 5개 파드를 각각 출력합니다. 결과는 지정한 JSON 형식으로 표시됩니다. 스크립트 실행 전에 적절한 권한과 연결 설정이 필요함을 주의하세요.

728x90

댓글