본문 바로가기

Container/Kubernetes

[K8S] Kubectl - jsonpath

Json Path 

  • '$' 은 expression이 default로 root object로부터 시작하기 때문에 선택사항이다.
  • 결과값은 String() function으로 반환된다.
  • JSONPath expressions 안에서 text를 인용하려면 " " 를 사용한다.

 

  • Node list 추출

.items[*].metadata.name

 

controlplane ~ ➜  kubectl get nodes -o=jsonpath='{.items[*].metadata.name}'
controlplane node01
$ kubectl get nodes -o=jsonpath='{.items[*].metadata.name}{"\n"}{.items[*].status.capacity.cpu}'
controlplane node01
16 16
  • os version 추출 (osImage)
controlplane ~ ➜  kubectl get nodes -o=jsonpath='{.items[*].status.nodeInfo.osImage}' 
Ubuntu 22.04.5 LTS Ubuntu 22.04.4 LTS

 

  • config에서 user name 가져오기
controlplane ~ ➜  kubectl config view --kubeconfig=/root/my-kube-config
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: KUBE_ADDRESS
  name: development
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: KUBE_ADDRESS
  name: kubernetes-on-aws
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: KUBE_ADDRESS
  name: production
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: KUBE_ADDRESS
  name: test-cluster-1
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
current-context: test-user@development
kind: Config
preferences: {}
users:
- name: aws-user
  user:
    client-certificate: /etc/kubernetes/pki/users/aws-user/aws-user.crt
    client-key: /etc/kubernetes/pki/users/aws-user/aws-user.key
- name: dev-user
  user:
    client-certificate: /etc/kubernetes/pki/users/dev-user/developer-user.crt
    client-key: /etc/kubernetes/pki/users/dev-user/dev-user.key
- name: test-user
  user:
    client-certificate: /etc/kubernetes/pki/users/test-user/test-user.crt
    client-key: /etc/kubernetes/pki/users/test-user/test-user.key
    
controlplane ~ ➜  kubectl config view --kubeconfig=/root/my-kube-config -o=jsonpath='{.users[*].name}'
aws-user dev-user test-user

 

 

controlplane ~ ➜  kubectl get pv --sort-by=.spec.capacity.storage
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pv-log-4   40Mi       RWX            Retain           Available                          <unset>                          38m
pv-log-1   100Mi      RWX            Retain           Available                          <unset>                          38m
pv-log-2   200Mi      RWX            Retain           Available                          <unset>                          38m
pv-log-3   300Mi      RWX            Retain           Available                          <unset>                          38m

 

  • Loops - Range

$ kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name} {"\t"} {.status.capacity.cpu}{"\n"}{end}'
controlplane     16
node01   16
  • Custom Columns
    • -o=custom-columns=<COLUMN NAME>:<JSON PATH>
    • -o=custom-columns=NODE:.metadata.name
$ kubectl get pv --sort-by=.spec.capacity.storage -o=custom-columns=NAME:.metadata.name,CAPACITY:.spec.capacity.storage
NAME       CAPACITY
pv-log-4   40Mi
pv-log-1   100Mi
pv-log-2   200Mi
pv-log-3   300Mi

 

  • Function
    • ?() : filter
    • @: Current object
$ kubectl config view --kubeconfig=my-kube-config -o jsonpath="{.contexts[?(@.context.user=='aws-user')].name}"
aws-user@kubernetes-on-aws

 

$ kubectl get pods -o json
$ kubectl get pods -o=jsonpath='{@}'
$ kubectl get pods -o=jsonpath='{.items[0]}'
$ kubectl get pods -o=jsonpath='{.items[0].metadata.name}'
$ kubectl get pods -o=jsonpath="{.items[*]['metadata.name', 'status.capacity']}"
$ kubectl get pods -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.startTime}{"\n"}{end}'
$ kubectl get pods -o=jsonpath='{.items[0].metadata.labels.kubernetes\.io/hostname}'

 

  • 좀 json path를 더 쉽게 보려면 (InternalIP 추출 예시)
controlplane ~ ➜  kubectl get nodes -o json | jq | grep -i internalip
            "type": "InternalIP"
            "type": "InternalIP"

controlplane ~ ➜  kubectl get nodes -o json | jq | grep -i internalip -B 100
{
  "apiVersion": "v1",
  "items": [
    {
      "apiVersion": "v1",
      "kind": "Node",
      "metadata": {
        "annotations": {
          "flannel.alpha.coreos.com/backend-data": "{\"VNI\":1,\"VtepMAC\":\"86:f3:d1:c3:2b:c6\"}",
          "flannel.alpha.coreos.com/backend-type": "vxlan",
          "flannel.alpha.coreos.com/kube-subnet-manager": "true",
          "flannel.alpha.coreos.com/public-ip": "192.168.233.130",
          "kubeadm.alpha.kubernetes.io/cri-socket": "unix:///var/run/containerd/containerd.sock",
          "node.alpha.kubernetes.io/ttl": "0",
          "volumes.kubernetes.io/controller-managed-attach-detach": "true"
        },
        "creationTimestamp": "2025-02-15T04:33:54Z",
        "labels": {
          "beta.kubernetes.io/arch": "amd64",
          "beta.kubernetes.io/os": "linux",
          "kubernetes.io/arch": "amd64",
          "kubernetes.io/hostname": "controlplane",
          "kubernetes.io/os": "linux",
          "node-role.kubernetes.io/control-plane": "",
          "node.kubernetes.io/exclude-from-external-load-balancers": ""
        },
        "name": "controlplane",
        "resourceVersion": "3698",
        "uid": "1ea71cea-ab9e-4701-bd37-dd2bb9e664c3"
      },
      "spec": {
        "podCIDR": "172.17.0.0/24",
        "podCIDRs": [
          "172.17.0.0/24"
        ]
      },
      "status": {
        "addresses": [
          {
            "address": "192.168.233.130",
            "type": "InternalIP"
            
controlplane ~ ➜  kubectl get nodes -o json | jq -c 'paths' | grep type
["items",0,"metadata","annotations","flannel.alpha.coreos.com/backend-type"]
["items",0,"status","addresses",0,"type"]
["items",0,"status","addresses",1,"type"]
["items",0,"status","conditions",0,"type"]
["items",0,"status","conditions",1,"type"]
["items",0,"status","conditions",2,"type"]
["items",0,"status","conditions",3,"type"]
["items",0,"status","conditions",4,"type"]
["items",1,"metadata","annotations","flannel.alpha.coreos.com/backend-type"]
["items",1,"status","addresses",0,"type"]
["items",1,"status","addresses",1,"type"]
["items",1,"status","conditions",0,"type"]
["items",1,"status","conditions",1,"type"]
["items",1,"status","conditions",2,"type"]
["items",1,"status","conditions",3,"type"]
["items",1,"status","conditions",4,"type"]

# InternalIP 추출하기
controlplane ~ ➜  kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}'
192.168.233.130

controlplane ~ ➜  kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.
type=="InternalIP")].address}'
192.168.233.130 192.168.139.46

 

반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Helm  (0) 2025.02.20
[K8S] Troubleshoot Network 예제  (0) 2025.02.12
[K8S] Network & CNI  (0) 2025.02.06
[K8S] Deploy a Kubernetes Cluster using Kubeadm  (0) 2025.02.06
[K8S] Network Policy  (0) 2025.02.04