운영체제 (LNX,WIN)

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

날으는물고기 2024. 6. 24. 00:28

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