고급 kubectl get 기술: 레이블 및 JSONPath를 사용한 출력 필터링

고급 필터링 기술을 숙달하여 `kubectl get`의 잠재력을 최대한 활용하세요. 이 포괄적인 가이드는 정확한 리소스 대상 지정을 위해 Kubernetes 레이블 선택기를 활용하는 방법과 특정 Pod, Deployment 및 Service를 쿼리할 수 있는 방법을 자세히 설명합니다. 또한, 필요한 데이터를 기계가 읽을 수 있는 형식으로 정확히 추출하고 포맷팅하기 위한 사용자 지정 JSONPath 템플릿을 작성하는 방법을 배웁니다. 실용적인 예제 및 모범 사례를 통해 Kubernetes 환경에서 정확하고 맞춤화된 정보를 효율적으로 검색하여 클러스터 관리, 디버깅 및 자동화 워크플로우를 향상시키세요.

31 조회수

고급 kubectl get 기술: 레이블 및 JSONPath를 사용한 출력 필터링

kubectl get은 Kubernetes 클러스터와 상호 작용하는 데 가장 기본적이고 자주 사용되는 명령 중 하나입니다. 이 명령을 사용하면 Pod 및 Deployment부터 Service 및 ConfigMap에 이르기까지 다양한 리소스에 대한 정보를 검색할 수 있습니다. 기본 kubectl get 명령은 빠른 개요를 확인하는 데 충분하지만, 실제 Kubernetes 환경에서는 종종 수많은 리소스가 존재하여 특정 정보를 효율적으로 찾아내기가 어렵습니다.

이 문서는 고급 kubectl get 기술을 심층적으로 다루며, 출력을 정확하게 필터링하고 형식을 지정할 수 있도록 지원합니다. Kubernetes의 강력한 레이블 선택기(label selectors)를 활용하여 특정 리소스를 대상으로 지정하는 방법과 JSONPath 템플릿을 마스터하여 필요한 데이터를 사용자 지정 가능하고 기계가 읽을 수 있는 형식으로 추출하고 표시하는 방법을 살펴보겠습니다. 이 가이드가 끝나면 비교할 수 없는 정확성으로 클러스터를 쿼리하여 진단, 자동화 및 보고 기능을 크게 향상시킬 수 있게 될 것입니다.

Kubernetes 레이블 이해하기: 리소스 선택의 기반

고급 필터링으로 넘어가기 전에 Kubernetes 레이블을 이해하는 것이 중요합니다. 레이블은 리소스를 식별하고 구성하는 데 사용되는 키-값 쌍으로, Kubernetes 객체(Pod, Service, Deployment 등)에 연결됩니다. 이는 클라이언트와 사용자가 객체 하위 집합을 선택하는 데 사용할 수 있는 메타데이터입니다.

레이블은 어노테이션과 다릅니다. 레이블은 사용자가 객체를 쿼리하고 선택하는 데 의미 있고 관련된 특성을 식별하기 위한 것이며, 어노테이션은 식별 목적이 아닌 메타데이터를 위한 것입니다. 효과적인 리소스 관리와 고급 kubectl get 작업을 위해서는 올바른 레이블 사용 관행이 필수적입니다.

리소스에 현재 할당된 레이블을 보려면 --show-labels 플래그를 사용할 수 있습니다.

kubectl get pods --show-labels

그러면 출력에 LABELS 열이 추가되어 각 Pod와 관련된 모든 레이블이 표시됩니다.

kubectl get -l을 사용한 고급 레이블 선택기

-l 또는 --selector 플래그는 레이블을 기반으로 kubectl get 출력을 필터링하는 주요 도구입니다. 이를 통해 출력에 포함되어야 하는 리소스가 충족해야 하는 레이블 요구 사항 집합을 지정할 수 있습니다. 선택기는 단순한 키-값 쌍일 수도 있고 더 복잡한 집합 기반 표현식일 수도 있습니다.

기본 레이블 선택

정확히 일치

특정 레이블이 정확한 값을 갖는 리소스를 선택하려면 key=value 구문을 사용합니다.

# 'app' 레이블이 'nginx'로 설정된 모든 Pod 가져오기
kubectl get pods -l app=nginx

# 'default' 네임스페이스에서 'tier' 레이블이 'frontend'로 설정된 모든 Service 가져오기
kubectl get services -n default -l tier=frontend

불일치 일치

특정 레이블이 특정 값으로 설정되어 있지 않은 리소스를 선택하려면 key!=value 구문을 사용합니다.

# 'app' 레이블이 'nginx'가 아닌 모든 Pod 가져오기
kubectl get pods -l app!=nginx

존재 여부 (키만 해당)

값에 관계없이 특정 레이블을 가지고 있는 리소스를 선택하려면 key만 지정하면 됩니다.

# 'environment' 레이블을 값에 관계없이 가지고 있는 모든 Pod 가져오기
kubectl get pods -l environment

존재하지 않음 (키만 해당)

특정 레이블을 가지고 있지 않은 리소스를 선택하려면 key 앞에 !를 붙입니다.

# 'component' 레이블을 가지고 있지 않은 모든 Pod 가져오기
kubectl get pods -l !component

여러 레이블 선택기 결합 (AND 논리)

여러 레이블 선택기를 쉼표로 구분하여 결합할 수 있습니다. 이는 AND 관계를 의미하며, 지정된 모든 레이블 조건을 충족하는 리소스만 포함됩니다.

# 'app=nginx' 이고 'env=production'인 Pod 가져오기
kubectl get pods -l app=nginx,env=production

# 'tier=backend' 이고 'version' 레이블이 없는 Deployment 가져오기
kubectl get deployments -l tier=backend,!version

집합 기반 레이블 선택기

Kubernetes는 더 강력한 집합 기반 레이블 선택기도 지원하며, 이는 단일 레이블에 대해 여러 가능한 값을 처리할 때 특히 유용합니다.

key in (value1, value2, ...)

레이블 값이 지정된 값 목록 중 하나인 리소스를 선택합니다.

# 'app' 레이블이 'nginx' 이거나 'redis'인 Pod 가져오기
kubectl get pods -l 'app in (nginx,redis)'

# 'kube-system' 네임스페이스에서 'k8s-app' 레이블이 'kube-dns' 이거나 'kubernetes-dashboard'인 Service 가져오기
kubectl get services -n kube-system -l 'k8s-app in (kube-dns,kubernetes-dashboard)'

key notin (value1, value2, ...)

레이블 값이 지정된 값 목록 중 어느 것도 아닌 리소스를 선택합니다.

# 'env' 레이블이 'dev'도 아니고 'test'도 아닌 Pod 가져오기
kubectl get pods -l 'env notin (dev,test)'

: 집합 기반 선택기나 특수 문자가 포함된 선택기를 사용할 때는 셸 해석 문제를 방지하기 위해 전체 선택기 표현식을 항상 작은따옴표('...')로 묶으십시오.

레이블링 모범 사례

  • 일관성: 명확한 레이블 지정 체계를 수립하고 클러스터 전체에서 이를 준수하십시오. 이렇게 하면 필터링이 예측 가능하고 안정적으로 수행됩니다.
  • 의미 있는 이름: 리소스의 특성을 명확하게 설명하는 레이블(예: app, tier, environment, version)을 사용하십시오.
  • 세분성: 레이블은 정확한 선택을 허용할 만큼 구체적이어야 하지만 관리하기 어려울 정도로 너무 세분화되어서는 안 됩니다.
  • 불변성: 자주 변경되는 데이터에 레이블을 사용하는 것을 피하십시오. 레이블은 정적인 식별 속성에 가장 적합합니다.
  • 일반적인 레이블: 도구와의 상호 운용성을 높이기 위해 app.kubernetes.io/name, app.kubernetes.io/instance, app.kubernetes.io/version 등 널리 채택된 레이블을 사용하십시오.

JSONPath를 사용한 사용자 지정 데이터 추출

레이블 선택기는 어떤 리소스를 원하는지 식별하는 데 도움이 되지만, JSONPath는 해당 리소스에서 어떤 정보를 추출하고 어떻게 형식을 지정할지 정의하는 데 도움이 됩니다. kubectl get은 다양한 형식(예: yaml, json, wide)으로 리소스 세부 정보를 출력할 수 있지만, -o jsonpath (또는 -o jsonpath-file)는 최고의 제어 기능을 제공합니다.

kubectl의 JSONPath 지원은 Go 템플릿을 기반으로 하며, 이는 JSONPath 표현식을 해석하여 Kubernetes 객체의 JSON 구조를 탐색할 수 있습니다. 이를 통해 강력한 템플릿 생성 및 데이터 추출이 가능합니다.

JSONPath를 사용하려면 -o jsonpath='<템플릿>'으로 출력 형식을 지정해야 합니다.

JSONPath 기본 사항 및 일반적인 사용 사례

먼저, JSONPath 표현식을 작성하기 전에 리소스의 전체 JSON 출력을 확인하여 구조를 이해하는 것이 종종 유용합니다.

# Pod의 전체 JSON 구조 가져오기
kubectl get pod <pod-name> -o json

이렇게 하면 JSONPath 쿼리를 구축할 수 있는 명확한 지도가 제공됩니다.

단일 필드 액세스

{.field.subfield}를 사용하여 특정 값에 액세스합니다. 예를 들어, Pod의 이름을 가져오려면 다음과 같이 합니다.

# 특정 Pod의 이름 가져오기
kubectl get pod my-nginx-pod-12345 -o jsonpath='{.metadata.name}'

# Pod가 실행 중인 노드 이름 가져오기
kubectl get pod my-nginx-pod-12345 -o jsonpath='{.spec.nodeName}'

배열 요소 액세스

배열 내의 요소에 액세스하려면 [*]를 사용하여 모든 요소를 반복하거나 [index]를 사용하여 특정 요소를 지정할 수 있습니다.

# 특정 Pod의 모든 컨테이너 이름 가져오기
kubectl get pod my-nginx-pod-12345 -o jsonpath='{.spec.containers[*].name}'

# 특정 Pod의 첫 번째 컨테이너 이미지 가져오기
kubectl get pod my-nginx-pod-12345 -o jsonpath='{.spec.containers[0].image}'

리소스 목록 반복 (range 사용)

kubectl get이 여러 리소스를 반환할 때(예: 모든 Pod), 출력은 일반적으로 items 배열을 포함하는 객체입니다. 이를 반복하려면 Go 템플릿의 range 함수가 필요합니다.

# 모든 Pod 이름과 IP를 새 줄에 각각 출력
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'

# 모든 Deployment 이름과 준비된 복제본 수를 나열
kubectl get deployments -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.readyReplicas}{"\n"}{end}'
  • {range .items[*]}: .items 배열의 각 항목에 대한 반복을 시작합니다.
  • {.metadata.name}: 루프 내에서 .은 현재 항목(예: 단일 Pod 객체)을 참조합니다.
  • {" "}: 서식을 위해 탭 문자를 삽입합니다.
  • {" "}: 개행 문자를 삽입합니다.
  • {end}: range 루프를 닫습니다.

조건부 출력 (if 사용)

Go 템플릿의 if 문을 사용하여 조건부 렌더링을 수행할 수 있습니다.

# Pod 이름을 나열하고, Pod에 'nodeName'이 있으면 출력하고, 없으면 'N/A' 출력
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{end}{"\n"}'

# Pod IP(존재하는 경우)에 대한 'if' 및 'else'를 사용한 더 복잡한 예제
kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'

# Go 템플릿의 'if-else'를 null 확인과 함께 더 정확하게 사용하는 방법:
kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{with .status.podIP}{.}{else}N/A{end}{"\n"}{end}'
  • {with .status.podIP}{.}{else}N/A{end}: 이 Go 템플릿 구문은 .status.podIP가 존재하는지 확인합니다. 존재하면 .은 해당 값을 참조하고, 그렇지 않으면 N/A를 출력합니다.

사용자 지정 형식 및 헤더

자체 정적 텍스트를 추가하고 테이블 형식 출력에 대한 헤더를 만들 수 있습니다.

# 헤더가 있는 Pod 이름, 이미지 및 노드에 대한 사용자 지정 출력
kubectl get pods -o=jsonpath='{"NAME\tIMAGE\tNODE\n"}{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\t"}{.spec.nodeName}{"\n"}{end}'

경고: kubectl의 JSONPath 구현은 Go 템플릿을 기반으로 하므로 강력하지만 자체 구문이 있습니다. 이는 jq와 같은 완전한 범용 JSONPath 구현이 아닙니다. 기본 경로 지정 및 range/if를 넘어서는 매우 복잡한 필터링 또는 조작이 필요한 경우 kubectl get -o jsonjq로 파이프하는 것을 고려하십시오.

JSONPath 팁

  • 단순하게 시작: 기본 경로로 시작한 다음 복잡성을 추가하십시오.
  • JSON 검사: 쿼리하려는 정확한 구조를 이해하려면 항상 kubectl get <resource> <name> -o json을 사용하십시오.
  • 이스케이프 문자: JSONPath 템플릿 문자열 내에서 개행 문자(\n) 및 탭(\t)과 같은 특수 문자를 출력에 리터럴로 렌더링하려면 이스케이프해야 함을 기억하십시오.
  • 템플릿 저장: 복잡하거나 자주 사용하는 JSONPath 표현식은 파일로 저장하고 -o jsonpath-file=/path/to/template.jsonpath를 사용하여 사용하십시오.

레이블과 JSONPath 결합

진정한 강력함은 이러한 기술을 결합할 때 나타납니다. 먼저 레이블 선택기를 사용하여 리소스를 좁히고, 그런 다음 JSONPath를 적용하여 해당 필터링된 집합에서 특정 데이터를 추출하고 형식을 지정합니다.

# 'app=my-app' 및 'env=production'인 모든 Pod의 이름과 컨테이너 이미지를 가져옵니다.
kubectl get pods -l 'app=my-app,env=production' -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}'

# 'tier' 레이블이 'backend'로 설정된 모든 Service의 이름과 클러스터 IP를 가져옵니다.
kubectl get services -l tier=backend -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.clusterIP}{"\n"}{end}'

# 특정 노드 'worker-node-1'에서 실행 중인 모든 Pod를 찾고 이름과 상태를 나열합니다.
kubectl get pods --field-selector spec.nodeName=worker-node-1 -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.phase}{"\n"}{end}'

참고: 레이블 선택기(-l)는 임의의 키-값 쌍을 위한 것이지만, kubectl은 리소스 필드(예: status.phase=Running, metadata.namespace=default)를 기반으로 필터링하기 위한 --field-selector도 제공합니다. 이는 레이블과 JSONPath 모두와 결합할 수 있는 또 다른 강력한 필터링 계층을 제공합니다.

문제 해결 및 일반적인 함정

  • JSONPath 구문 오류: 작은 오타 하나만으로도 템플릿이 깨질 수 있습니다. 중괄호, 점, 배열 액세스를 확인하십시오.
  • 필드 누락: 특정 리소스에 대해 필드가 존재하지 않으면 JSONPath는 <no value> 또는 빈 문자열을 출력할 수 있습니다. 이러한 경우를 우아하게 처리하려면 if 또는 with Go 템플릿 구문을 사용하십시오.
  • 셸 이스케이프: JSONPath 표현식 주위의 작은따옴표는 필수입니다. 표현식에 내부 따옴표나 특수 문자가 포함된 경우 추가 셸 이스케이프가 필요할 수 있습니다.
  • Go 템플릿 대 순수 JSONPath: kubectl은 범용 JSONPath 엔진이 아닌 Go 템플릿을 사용한다는 점을 기억하십시오. 고급 필터링(?())과 같은 기능은 일반적으로 jq 또는 기타 전용 JSON 프로세서의 일부이며 kubectl-o jsonpath에는 직접 지원되지 않습니다.
  • 비어 있는 items 배열: 레이블 선택기가 일치하는 리소스를 찾지 못하면 items가 비어 있게 되며 range 루프는 아무것도 생성하지 않습니다.

결론

레이블 선택기와 JSONPath를 사용한 고급 kubectl get 기술을 마스터하는 것은 모든 Kubernetes 사용자에게 매우 유용한 기술입니다. 이러한 강력한 필터링 및 서식 지정 옵션은 kubectl get을 단순한 목록 도구에서 정교한 데이터 추출 유틸리티로 변모시킵니다. 문제를 일으키는 리소스를 신속하게 찾아내거나, 사용자 지정 보고서를 생성하거나, 자동화 스크립트에 정확한 데이터를 공급할 수 있습니다.

훌륭한 레이블 지정 관행을 일관되게 적용하고 JSONPath 표현식을 능숙하게 작성하면 Kubernetes 클러스터 정보에 대한 비교할 수 없는 제어력을 얻게 되어 보다 효율적인 관리, 더 빠른 디버깅 및 보다 강력한 자동화를 이끌어냅니다. 다양한 선택기와 JSONPath 템플릿을 계속 실험해 보면 kubectl get의 잠재력을 최대한 발휘할 수 있을 것입니다.