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 스크립트를 작성하는 것을 예로 들겠습니다.
- Kubernetes API에서 모든 파드의 메트릭 데이터를 수집합니다.
- 수집된 데이터에서 각 파드의 CPU 및 메모리 사용량을 파싱합니다.
- 사용량이 가장 높은 상위 5개 파드를 각각 CPU 및 메모리 사용량에 따라 선별합니다.
- 결과를 지정된 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 및 메모리 사용량을 millicores
및 MiB
단위로 계산하고, 사용량이 가장 높은 상위 5개 파드를 각각 출력합니다. 결과는 지정한 JSON 형식으로 표시됩니다. 스크립트 실행 전에 적절한 권한과 연결 설정이 필요함을 주의하세요.
댓글