JSON Path
- 이번 장에서는 Certified Kubernetes Administrator (CKA) 을 준비하며 "JSON Path를 활용하는 방법"에 대해서 알아보도록 한다.
JSON Path
JSON Path의 필요성
- 대규모 환경에서의 정보 추출: 수백 개의 노드와 수천 개의 오브젝트(Pod, Deployment, Service 등)가 존재하는 프로덕션 환경에서 필요한 정보를 효율적으로 추출해야 한다.
- 특정 필드 및 조건 기반 데이터 추출: 모든 리소스의 특정 필드 값, 특정 조건에 맞는 리소스의 데이터 등 복잡한 요구사항을 충족해야 한다.
- 데이터 필터링 및 포맷팅: 대량의 데이터를 원하는 형식으로 필터링하고 포맷팅하여 가독성을 높여야 한다.
kubectl과 Kubernetes API의 작동 방식
kubectl
은 쿠버네티스 API 서버와 통신하여 쿠버네티스 오브젝트의 정보를 요청하고 응답을 받는다.- 쿠버네티스 API 서버는 JSON 형식으로 데이터를 주고받는다.
kubectl
은 JSON 형식의 응답을 받아 사람이 읽기 쉬운 형식으로 변환하여 출력한다.
kubectl get
명령어에-o wide
옵션을 사용하면 더 많은 정보를 출력할 수 있지만, 여전히 모든 정보를 보여주지는 않는다.- 예: 노드의 리소스 용량, taint, 조건, 하드웨어 아키텍처, 이미지 목록 등
kubectl describe
명령어를 사용하면 상세 정보를 확인할 수 있지만, 원하는 형식으로 데이터를 추출하고 포맷팅하는 데는 한계가 있다.
JSONPath를 사용한 데이터 추출 및 포맷팅
- JSONPath를 사용하면
kubectl
명령어의 출력을 원하는대로 필터링하고 포맷팅할 수 있다.
- 4단계 JSONPath 활용 프로세스
- 필요한 정보 제공 명령어 확인:
kubectl get nodes
,kubectl get pods
등 필요한 정보를 제공하는 명령어를 확인한다. - JSON 형식 출력 확인:
kubectl get <리소스> -o json
명령어를 사용하여 JSON 형식의 출력을 확인한다. - JSONPath 쿼리 작성: JSON 출력 구조를 분석하여 필요한 정보를 추출하는 JSONPath 쿼리를 작성한다.(예:
$.items[*].metadata.name
,$.items[*].status.nodeInfo.architecture
,$.items[*].status.capacity.cpu
) - JSONPath 쿼리 적용:
kubectl get <리소스> -o jsonpath='{<JSONPath> 쿼리}'
명령어를 사용하여 JSONPath 쿼리를 적용하고 결과를 확인한다.(쿼리는 작은따옴표와 중괄호로 묶어야 한다.)
- 필요한 정보 제공 명령어 확인:
JSONPath 쿼리 작성 및 활용 예시
- 노드 이름 추출:
kubectl get nodes -o=jsonpath='{.items[*].metadata.name}'
- 노드 하드웨어 아키텍처 추출:
kubectl get nodes -o=jsonpath='{.items[*].status.nodeInfo.architecture}'
- 노드 CPU 개수 추출:
kubectl get nodes -o=jsonpath='{.items[*].status.capacity.cpu}'
- 여러 정보 결합 및 출력:
kubectl get nodes -o=jsonpath='{.items[*].metadata.name} {"\n"} {.items[*].status.capacity.cpu}'
JSONPath 루프(범위 사용)
- 목표: JSON 배열의 각 항목을 순회하며 특정 속성을 추출하고 원하는 형식으로 출력한다.
- 필요성: 단순히 여러 속성을 나열하는 것이 아니라, 표 형태 또는 사용자 정의된 형식으로 데이터를 출력해야 하는 경우 유용하다.
- 사용법:
range .items[*]
:items
배열의 각 항목을 순회한다..metadata.name
: 각 항목의metadata.name
값을 추출한다.\t
: 탭 문자를 삽입한다..status.capacity.cpu
: 각 항목의status.capacity.cpu
값을 추출한다.\n
: 줄바꿈 문자를 삽입한다.end
루프를 종료한다.
- 예시:
kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name} {"\t"} {.status.capacity.cpu}{"\n"}{end}'
- 노드 이름과 CPU 개수를 탭으로 구분하고 각 노드를 줄바꿈하여 출력한다.
사용자 정의 열(Custom Column)
- 목표:
kubectl
명령어를 사용하여 사용자 정의 열을 생성하고 데이터를 출력한다. - 필요성: 루프를 사용하지 않고도 표 형식의 데이터를 쉽게 출력할 수 있다.
- 사용법:
--template '{{range .items}}{{.metadata.name}}{\t}{{.status.capacity.cpu}}{\n}{end}}'
와 같은 방법도 사용가능하지만,--custom-columns
옵션이 더 직관적이다.--custom-columns="<열 이름>:<JSONPath 쿼리>,<열 이름>:<JSONPath 쿼리>,...
형식으로 사용한다.- JSONPath 쿼리에서
$.items[*]
부분을 생략한다.(각 항목에 대한 쿼리로 가정)
- 예시:
kubectl get nodes --custom-columns="NODE:.metadata.name,CPU:.status.capacity.cpu"
- "NODE" 열에 노드 이름, "CPU" 열에 CPU 개수를 출력한다.
정렬 (Sort By)
- 목표:
kubectl
명령어의 출력을 특정 속성 값을 기준으로 정렬한다. - 필요성: 대량의 데이터를 특정 기준으로 정렬하여 원하는 정보를 쉽게 찾을 수 있다.
- 사용법:
--sort-by=<JSONPath 쿼리>
옵션을 사용한다.- JSONPath 쿼리는 정렬 기준으로 사용할 속성의 경로를 지정한다.
- 예시:
kubectl get nodes --sort-by=.metadata.name
: 노드 이름을 기준으로 오름차순 정렬하여 출력한다.kubectl get nodes --sort-by=.status.capacity.cpu
: CPU 개수를 기준으로 오름차순 정렬하여 출력한다.
참고한 강의
'Infrastructure > Kubernetes' 카테고리의 다른 글
[CKA] 시험 준비 자료 (Summary) (0) | 2025.03.18 |
---|---|
[CKA] Troubleshooting (0) | 2025.03.17 |
[CKA] Kustomize (Advanced) (0) | 2025.03.17 |
[CKA] Kustomize (Basic) (0) | 2025.03.17 |
[CKA] Helm (0) | 2025.03.16 |