CKA를 준비해보자 38일차 - jsonpath2

0

CKA

목록 보기
38/43

Kubernetes jsonpath

kubernetes에서 jsonpath를 사용하여 여러 유용한 query가 가능하다.

사실 kubectl이 명령을 받아서, kube-apiserver에 요청을 보내면 json 형식으로 응답을 받는다. 이 데이터를 사용자에게 보기 좋게 컨버팅해서 전달해주는 것이 전부이다.

그렇다면, json데이터가 응답으로 오기 때문에 jsonpath를 적용시켜 원하는 데이터만 추출하는 것도 가능하다.

kubectl get pods -o json

다음과 같이 -o옵션을 사용하여 json응답을 얻을 수 있다.

jsonpath을 -o옵션에 넣어서 보낼 수 있는데, 다음과 같이 쓸 수 있다.

kubectl get pods -o=jsonpath='{...}'

-o=jsonpath=을 사용하고 그 다음에 jsonpath를 넣으면 된다. 여기서 jpath와 약간 다른 것은 $로 시작하는 것이 아니라, {}로 시작한다는 점 말고는 똑같다.

kubectl get pods -o=jsonpath='{ .items[0].spec.containers[0].image }'

jsonpath는 두 개의 명령어를 동시에 실행할 수도 있다.

kubectl get pods -o=jsonpath='{...}{...}'

다음은 node들의 이름과 cpu상태를 확인해주는 명령어이다.

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

다음과 같이 결과가 나온다.

master node01 4 4

이들을 구분 짓기 위해서 new line이나 tab을 넣고 싶다면 다음과 같이 넣을 수 있다.

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

아래와 같이 결과가 나오게 된다.

master node01
4 4

example

가령 다음과 같은 pv 정보가 있다고 하자.

{
    "apiVersion": "v1",
    "items": [
        {
            "apiVersion": "v1",
            "kind": "PersistentVolume",
            "metadata": {
                "creationTimestamp": "2024-08-07T14:12:44Z",
                "finalizers": [
                    "kubernetes.io/pv-protection"
                ],
                "name": "pv-log-1",
                "resourceVersion": "1025",
                "uid": "f747fdf9-57b2-43e2-84ec-66864a16f28d"
            },
            "spec": {
                "accessModes": [
                    "ReadWriteMany"
                ],
                "capacity": {
                    "storage": "100Mi"
                },
                "hostPath": {
                    "path": "/pv/log",
                    "type": ""
                },
                "persistentVolumeReclaimPolicy": "Retain",
                "volumeMode": "Filesystem"
            },
            "status": {
                "lastPhaseTransitionTime": "2024-08-07T14:12:44Z",
                "phase": "Available"
            }
        },
        {
            "apiVersion": "v1",
            "kind": "PersistentVolume",
            "metadata": {
                "creationTimestamp": "2024-08-07T14:12:44Z",
                "finalizers": [
                    "kubernetes.io/pv-protection"
                ],
                "name": "pv-log-2",
                "resourceVersion": "1027",
                "uid": "a9ded715-67c8-444f-b8c2-ebdeaa9bba3a"
            },
            "spec": {
                "accessModes": [
                    "ReadWriteMany"
                ],
                "capacity": {
                    "storage": "200Mi"
                },
                "hostPath": {
                    "path": "/pv/log",
                    "type": ""
                },
                "persistentVolumeReclaimPolicy": "Retain",
                "volumeMode": "Filesystem"
            },
            "status": {
                "lastPhaseTransitionTime": "2024-08-07T14:12:44Z",
                "phase": "Available"
            }
        },
        {
            "apiVersion": "v1",
            "kind": "PersistentVolume",
            "metadata": {
                "creationTimestamp": "2024-08-07T14:12:45Z",
                "finalizers": [
                    "kubernetes.io/pv-protection"
                ],
                "name": "pv-log-3",
                "resourceVersion": "1029",
                "uid": "66762dda-5eac-4bab-a099-bc423bb6e353"
            },
            "spec": {
                "accessModes": [
                    "ReadWriteMany"
                ],
                "capacity": {
                    "storage": "300Mi"
                },
                "hostPath": {
                    "path": "/pv/log",
                    "type": ""
                },
                "persistentVolumeReclaimPolicy": "Retain",
                "volumeMode": "Filesystem"
            },
            "status": {
                "lastPhaseTransitionTime": "2024-08-07T14:12:45Z",
                "phase": "Available"
            }
        },
        {
            "apiVersion": "v1",
            "kind": "PersistentVolume",
            "metadata": {
                "creationTimestamp": "2024-08-07T14:12:45Z",
                "finalizers": [
                    "kubernetes.io/pv-protection"
                ],
                "name": "pv-log-4",
                "resourceVersion": "1031",
                "uid": "75d449a4-67b7-4c92-b876-d1e14975297e"
            },
            "spec": {
                "accessModes": [
                    "ReadWriteMany"
                ],
                "capacity": {
                    "storage": "40Mi"
                },
                "hostPath": {
                    "path": "/pv/log",
                    "type": ""
                },
                "persistentVolumeReclaimPolicy": "Retain",
                "volumeMode": "Filesystem"
            },
            "status": {
                "lastPhaseTransitionTime": "2024-08-07T14:12:45Z",
                "phase": "Available"
            }
        }
    ],
    "kind": "List",
    "metadata": {
        "resourceVersion": ""
    }
}

이는 kubectl get pv -o json을 통해서 얻을 수 있다.

각 pv의 이름은 다음과 같이 구할 수 있다.

kubectl get pv -o=jsonpath='{ .items[*].metadata.name }'

pv-log-1 pv-log-2 pv-log-3 pv-log-4

pv를 storage기준으로 정렬해서 출력할 수도 있다.

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>                          18m
pv-log-1   100Mi      RWX            Retain           Available                          <unset>                          18m
pv-log-2   200Mi      RWX            Retain           Available                          <unset>                          18m
pv-log-3   300Mi      RWX            Retain           Available                          <unset>                          18m

다음의 kubeconfig file을 보자도록 하자.

{
  "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"
      }
    }
  ]
}

여기서 aws-user user가 있는 context의 이름을 가져와보도록 하자.

kubectl config view --kubeconfig=my-kube-config -o=jsonpath='{ .contexts[?(@.context.user == "aws-user")].name }'

aws-user@kubernetes-on-aws

0개의 댓글