Kubectl를 이용하여 쿠버네티스 리소스를 조회하려고 할때 원하고자 하는 형태로 컨솔창에 출력하고 싶을 경우가 있다.

이런 경우를 위해 JSONPATH를 활용해보자.

 

원하는 결과를 출력하기 전에 우선 소스가되는 데이터 부터 확인해보자. 너무 길어서 일부만 캡쳐하는걸로..

kubectl get no -o json
controlplane $ kubectl get no -o json | head -n 20
{
    "apiVersion": "v1",
    "items": [
        {
            "apiVersion": "v1",
            "kind": "Node",
            "metadata": {
                "annotations": {
                    "flannel.alpha.coreos.com/backend-data": "null",
                    "flannel.alpha.coreos.com/backend-type": "host-gw",
                    "flannel.alpha.coreos.com/kube-subnet-manager": "true",
                    "flannel.alpha.coreos.com/public-ip": "172.17.0.13",
                    "kubeadm.alpha.kubernetes.io/cri-socket": "/var/run/dockershim.sock",
                    "node.alpha.kubernetes.io/ttl": "0",
                    "volumes.kubernetes.io/controller-managed-attach-detach": "true"
                },
                "creationTimestamp": "2021-08-08T06:14:24Z",
                "labels": {
                    "beta.kubernetes.io/arch": "amd64",
                    "beta.kubernetes.io/os": "linux",

 

먼저, JSONPATH를 연습해보도록 하자.

 

Before

{
  "firstName": "John",
  "lastName" : "doe",
  "age"      : 26,
   "address1"  : {
      "streetAddress": "naist street",
      "city"         : "Nara",
      "postalCode"   : "630-0192"
 	 },
   "address2"  : {
      "streetAddress": "naist street",
      "city"         : "Seoul",
      "postalCode"   : "640-0112"
  },
  "phoneNumbers": [
      {
        "type": "iPhone",
        "number": "0123-4567-8888"
      },
      {
        "type": "home",
        "number": "0123-4567-8910"
      },
      {
        "type"  : "home2",
        "number": "0123-1111-3333"
   	  },
      {
        "type"  : "home3",
        "number": "0123-1771-6633"
      }
  ]
}

After($)

[
  {
    "firstName": "John",
    "lastName": "doe",
    "age": 26,
    "address1"  : {
      "streetAddress": "naist street",
      "city"         : "Nara",
      "postalCode"   : "630-0192"
 	 },
  	"address2"  : {
      "streetAddress": "naist street",
      "city"         : "Seoul",
      "postalCode"   : "640-0112"
  	},
    "phoneNumbers": [
      {
        "type": "iPhone",
        "number": "0123-4567-8888"
      },
      {
        "type": "home",
        "number": "0123-4567-8910"
      },
      {
        "type"  : "home2",
        "number": "0123-1111-3333"
   	  },
      {
        "type"  : "home3",
        "number": "0123-1771-6633"
      }
    ]
  }
]

After($.firstName)

[
  "John"
]

 

결과가 List로 나온다는 것에 유의하자.

 

After($.phoneNumbers[0,2])

- 인덱스 번호를 콤마(,)로 구분하여 원하는 정보만 출력할 수 있다.

[
  {
    "type": "iPhone",
    "number": "0123-4567-8888"
  },
  {
    "type": "home2",
    "number": "0123-1111-3333"
  }
]

 

After($.phoneNumbers[?(@.type == 'iPhone')])

- 리스트에서 조건을 주어 해당하는 요소만 출력할 수 있다.

- @ : List Element

[
  {
    "type": "iPhone",
    "number": "0123-4567-8888"
  }
]

 

After($.phoneNumbers[*]), $.phoneNumbers[*].type

- 리스트의 모든 요소를 출력하고자 할때

[
  {
    "type": "iPhone",
    "number": "0123-4567-8888"
  },
  {
    "type": "home",
    "number": "0123-4567-8910"
  },
  {
    "type": "home2",
    "number": "0123-1111-3333"
  },
  {
  	"type"  : "home3",
  	"number": "0123-1771-6633"
  }
]
[
  "iPhone",
  "home",
  "home2",
  "home3"
]

- 리스트가 아니더라도 * 를 사용할 수 있음($.*.city)

[
  "Nara",
  "Seoul"
]

After($.phoneNumbers[0:2], $.phoneNumbers[0:4:2])

- start:end or start:end:step

[
  {
    "type": "iPhone",
    "number": "0123-4567-8888"
  },
  {
    "type": "home",
    "number": "0123-4567-8910"
  }
]
[
  {
    "type": "iPhone",
    "number": "0123-4567-8888"
  },
  {
    "type": "home2",
    "number": "0123-1111-3333"
  }
]

After($.phoneNumbers[-1:])

- last element

[
  {
    "type": "home3",
    "number": "0123-1771-6633"
  }
]




위의 명령어들에 어느 정도 익숙해졌다면 이제 쿠버네티스에서 JSONPATH를 이용하는 방법을 알아보자.

 

Root element를 $로 표현하지만 kubectl를 이용할 때는 생략해도 좋다.

 

kubectl get nodes -o=jsonpath='{write jsonpath}'

 

당연한 이야기지만 jsonpath를 작성할 때에 필터링 할 Json data 구조를 알고 있어야한다.

 

- 노드 이름

kubectl get nodes -o=jsonpath='{.items[*].metadata.name}'
> controlplane node01

 

- 노드 아키텍쳐

kubectl get nodes -o=jsonpath='{.items[*].status.nodeInfo.architecture}'
> amd64 amd64

- 노드 cpu capacity

kubectl get nodes -o=jsonpath='{.items[*].status.capacity.cpu}'
> 48 48

- 노드 이름 + cpu capacity

kubectl get nodes -o=jsonpath='{.items[*].metadata.name} {.items[*].status.capacity.cpu}'
> controlplane node01 48 48
kubectl get nodes -o=jsonpath='{.items[*].metadata.name} {"\n"} {.items[*].status.capacity.cpu}'
> controlplane node01 
  48 48

 

좀 더 출력을 커스터마이징 하기 위해서는 rage ~ end를 사용하자.

 

- [Range] : 노드 이름 + capacity with 출력 형태 변경

kubectl get nodes -o=jsonpath='{range .items[*]}{.metadataname} {"\t"} {.status.capacity.cpu} {"\n"} {end}'
> controlplane     48 
 node01          48

 

- [Range + Custom Colum] : 노드 이름 + capacity with 출력 형태 변경

kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name} {"\t"} {.status.capacity.cpu} {"\n"} {end}' -o custom-columns=NODE:.metadata.name,CPU:.status.capacity.cpu
> NODE CPU 
 controlplane     48 
 node01          48

 

리소스에 문제가 있는 리소스를 효과적으로 분별하기 위해서 정렬 기능도 제공한다.

 

- [Sort] : 정렬 기준을 정하여 리소스 출력

kubectl get nodes --sort-by=.medatadata.name
kubectl get nodes --sort-by=.status.capacity.cpu

 

- yaml 포맷 파일에 jsonpath 적용하기

# /root/my-kube-config
contexts:
- context:
    cluster: kubernetes-on-aws
    user: aws-user
  name: aws-user@kubernetes-on-aws
- context:
    cluster: test-cluster-1
    user: dev-user
  name: research
- context:
    cluster: development
    user: test-user
  name: test-user@development
- context:
    cluster: production
    user: test-user
  name: test-user@production
  
# get the user names from the file
k config view --kubeconfig=/root/my-kube-config -o=jsonpath='{.users.*.name}'

 

쿠버네티스 시스템 장애시에 문제 파악을 보다 효과적으로 하기 위해서 jsonpath를 잘 알아두면 좋을 것 같다.

 


출처

- https://jsonpath.com/

'클라우드 컴퓨팅 > 쿠버네티스' 카테고리의 다른 글

Kubernetes Pod Scheduling  (0) 2021.08.13
Kubernetes Workloads  (0) 2021.08.08
Kubernetes Network Model & Policy  (0) 2021.07.08
Kubeadm Swap Disable  (0) 2021.07.04
Kubernetes Components  (0) 2021.07.03

+ Recent posts