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
가령 다음과 같은 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