Cloud/Kubernetes

Kubernetes custom-columns 사용해보기

퐁스 2020. 7. 22. 15:11

Kubernetes Docs - kubernetes.io/ko/docs/reference/kubectl/overview/#custom-columns

 

kubectl 개요

Kubectl은 쿠버네티스 클러스터를 제어하기 위한 커맨드 라인 도구이다. 구성을 위해, kubectl 은 config 파일을 $HOME/.kube 에서 찾는다. KUBECONFIG 환경 변수를 설정하거나 --kubeconfig 플래그를 설정하여 ��

kubernetes.io

 kubectl command를 통해 필요한 정보를 출력할 수 있지만 한정적인 정보밖에 받지 못한다. 가장 많이 사용하는 get pod 명령어는 다음과 같이 출력된다.

root@c2:~# kubectl get pods -n rook-ceph
NAME                                            READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-cmv8g                          3/3     Running     0          7d23h
csi-cephfsplugin-l25cp                          3/3     Running     3          7d23h
csi-cephfsplugin-provisioner-77b469f54f-7n4tm   4/4     Running     11         7d23h
csi-cephfsplugin-provisioner-77b469f54f-cfw48   4/4     Running     2          7d23h
csi-cephfsplugin-szhnl                          3/3     Running     0          7d23h
csi-rbdplugin-c2mb4                             3/3     Running     3          7d23h
csi-rbdplugin-ddgmr                             3/3     Running     0          7d23h
csi-rbdplugin-hpm2j                             3/3     Running     0          7d23h
csi-rbdplugin-provisioner-7b4b86d5b7-7zqw5      5/5     Running     1          45h
csi-rbdplugin-provisioner-7b4b86d5b7-qtdrz      5/5     Running     9          7d23h
rook-ceph-mds-myfs-a-7ff4c54657-j64gq           1/1     Running     0          7d23h
rook-ceph-mds-myfs-b-954df59cf-k7pr7            1/1     Running     0          7d23h
rook-ceph-mgr-a-76fc7667-bkhwv                  1/1     Running     1          7d23h
rook-ceph-mon-b-6f4c5bd668-fqlhw                1/1     Running     0          7d23h
rook-ceph-mon-c-65b594b4f-btmft                 1/1     Running     0          44h
rook-ceph-mon-d-566c85cff-qthsd                 1/1     Running     0          7d23h
rook-ceph-operator-858ff7497d-z7d5c             1/1     Running     8          7d23h
rook-ceph-osd-0-7cc4dfb46d-w8gr9                1/1     Running     0          7d23h
rook-ceph-osd-1-7bf7b9769c-lzcjt                1/1     Running     3          44h
rook-ceph-osd-2-669c474586-sblk6                1/1     Running     2          7d23h
rook-ceph-osd-prepare-c1-5-xfccl                0/1     Completed   0          44h
rook-ceph-osd-prepare-c1-8-5j5h7                0/1     Completed   0          44h
rook-ceph-tools-776f7b4dbd-tvz99                1/1     Running     0          7d23h
rook-discover-86vc6                             1/1     Running     0          49m
rook-discover-9nxc2                             1/1     Running     0          8m27s
rook-discover-ljr56                             1/1     Running     0          4h5m

 이 정도 정보만으로도 할 수 있는 일이 많지만 다른 정보를 알고 싶을 때가 있다. 그 때마다 Pod를 일일히 조회하거나 정보를 찾아 떠나는 것은 비효율적이다. 

 custom-columns 옵션을 통해 사용자 정의 열을 정의하고 원하는 세부 정보만 출력이 가능하다. 미리 정의해 둔 설정 파일을 통해서도 가능하다.

#인라인
kubectl get pods [pod-name] -o custom-columns=[option]

#템플릿
kubectl get pods [pod-name] -o custom-columns-file=[template]

 한 예로 pod의 uuid를 조회해야 하는 경우를 생각해보자. 나는 여태 멍청하게 이렇게 했다.

root@c2:~# kubectl get pods -n rook-ceph -o yaml | grep uid
      uid: ee8acbdd-2434-4af5-b4d8-de248d912fc8
    uid: 2e60a0cb-85d3-4a87-9885-72939680bc91
      uid: ee8acbdd-2434-4af5-b4d8-de248d912fc8
    uid: c395165f-3ec4-4f22-96ec-b14c9b3405bc
      uid: 64544a98-7851-4475-92a5-57f243408f6e
    uid: e0c0a306-a9ca-45a7-a67e-e6d122882ac8
      uid: 64544a98-7851-4475-92a5-57f243408f6e
    uid: 48ab070f-36a0-4f7e-bf59-b0ce2a98d812
      uid: ee8acbdd-2434-4af5-b4d8-de248d912fc8
    uid: 0d54e2d6-57ca-4b8a-95ef-f8d7997dc739
      uid: 58879479-f720-42c6-8527-3e8be033ecb7

이 방식의 문제점은 주어를 찾을 수 없다는 점이다. 결국 다시 조회해야한다. 하지만 이렇게 하면!

root@c2:~# kubectl get pods -n rook-ceph -o custom-columns=PodName:.metadata.name,PodUID:.metadata.uid
PodName                                         PodUID
csi-cephfsplugin-cmv8g                          2e60a0cb-85d3-4a87-9885-72939680bc91
csi-cephfsplugin-l25cp                          c395165f-3ec4-4f22-96ec-b14c9b3405bc
csi-cephfsplugin-provisioner-77b469f54f-7n4tm   e0c0a306-a9ca-45a7-a67e-e6d122882ac8
csi-cephfsplugin-provisioner-77b469f54f-cfw48   48ab070f-36a0-4f7e-bf59-b0ce2a98d812
csi-cephfsplugin-szhnl                          0d54e2d6-57ca-4b8a-95ef-f8d7997dc739
csi-rbdplugin-c2mb4                             ddcae271-819b-4097-8697-73e36c78f8f1
csi-rbdplugin-ddgmr                             8b8cdf34-6cb3-499b-98b1-22da1236eb12
csi-rbdplugin-hpm2j                             90f3ae43-84bf-44e3-ad47-563d636e178d
csi-rbdplugin-provisioner-7b4b86d5b7-7zqw5      b62614de-3a12-47ac-97cf-ffe97a525674
csi-rbdplugin-provisioner-7b4b86d5b7-qtdrz      5735868f-797a-4a30-9f6a-1d4e76aac737
rook-ceph-mds-myfs-a-7ff4c54657-j64gq           16e31ff6-0d3a-4ffc-a61a-eb31e339dbfc
rook-ceph-mds-myfs-b-954df59cf-k7pr7            4a060f3a-e740-4d54-94f9-a3d245ad02ec
rook-ceph-mgr-a-76fc7667-bkhwv                  987fd95a-4bb9-475b-b47f-8379286f3cc3
rook-ceph-mon-b-6f4c5bd668-fqlhw                d6803666-db14-4c72-99b9-0eeb1874eb4b
rook-ceph-mon-c-65b594b4f-btmft                 84439c00-e661-4f9d-adbb-13f43879e142
rook-ceph-mon-d-566c85cff-qthsd                 eb63c24e-16bc-437a-afac-66c0aad948e7
rook-ceph-operator-858ff7497d-z7d5c             ac2d4afd-86f2-4443-b5ca-b340254b2a5b
rook-ceph-osd-0-7cc4dfb46d-w8gr9                633d835c-6f88-46ee-8d9d-af497c538e05
rook-ceph-osd-1-7bf7b9769c-lzcjt                bd2ed8a0-52e8-48e6-b69d-d8d1cb3258e2
rook-ceph-osd-2-669c474586-sblk6                3a44e056-ea60-4caf-b5a7-b3f6a2e636a6
rook-ceph-osd-prepare-c1-5-xfccl                56a59260-c97d-46db-8810-a6faa995ba2b
rook-ceph-osd-prepare-c1-8-5j5h7                24611218-5fa1-43ae-90ed-15a8243faf46
rook-ceph-tools-776f7b4dbd-tvz99                6dd2a587-89eb-4c2c-8531-a85a8a34fba5
rook-discover-86vc6                             f739a4d8-f9e4-4d5d-9f22-c11f4d172e70
rook-discover-9nxc2                             7b336c1e-0287-489a-9382-71ae1b75fa0b
rook-discover-ljr56                             3cf623f4-eb34-412b-94a2-f535b59e0e17

너무 깔끔하게 Pod마다의 uid를 출력해준다. custom-columns 의 옵션을 보면 column-name:json-path 형식을 따르고 있는 것을 알 수 있다. 그럼 저 json-path를 어떻게 찾는지 (모르는 사람은 없겠지만) 나를 위해 찾아보자면 이렇다.

root@c2:~# kubectl get pods -n rook-ceph rook-discover-86vc6 -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/podIP: 10.244.190.32/32
    cni.projectcalico.org/podIPs: 10.244.190.32/32
  creationTimestamp: "2020-07-22T05:05:59Z"
  generateName: rook-discover-
  labels:
    app: rook-discover
    controller-revision-hash: 6f94b6b67c
    pod-template-generation: "1"

정말 엔지니어에게 적합하지 않은 티스토리... 내가 개멍청하게 쓰는걸수도 있지만 아무튼 들여쓰기를 따라서 조건에 넣으면 된다. pod name, label, image를 뽑아본다고 생각해보자.

root@c1-2:~# kubectl get pods -n metallb-system -o custom-columns=PodName:.metadata.name,PodLabel:.metadata.labels,PodImage:.spec.containers[0].image
PodName                       PodLabel                                                                                          PodImage
controller-547d466688-7496t   map[app:metallb component:controller pod-template-hash:547d466688]                                metallb/controller:v0.7.3
speaker-hnwgt                 map[app:metallb component:speaker controller-revision-hash:bf8c4976f pod-template-generation:1]   metallb/speaker:v0.7.3
speaker-wlrpz                 map[app:metallb component:speaker controller-revision-hash:bf8c4976f pod-template-generation:1]   metallb/speaker:v0.7.3
speaker-xqtlp                 map[app:metallb component:speaker controller-revision-hash:bf8c4976f pod-template-generation:1]   metallb/speaker:v0.7.3

여러 개의 라벨을 가지고 있어 map 형식으로 가져오는 것을 볼 수 있다. image의 경우 pod 하위의 container에서 선택하여 가져올 수 있다.

 이렇게 custom-columns 옵션의 경우 설정 따라 원하는 방식의 조회가 가능하기 때문에 편하게 사용이 가능하다.

 

- 사용을 위해 추가

1) vm PVC 조회

kubectl get vm -A -o custom-columns=VmName:.metadata.name,VmStatus:.spec.running,VmPvc:.spec.template.spec.volumes[*].persistentVolumeClaim.claimName
root@c2:~/hs/fail-vm# kubectl get vm -A -o custom-columns=VmNs:.metadata.namespace,VmName:.metadata.name,VmStatus:.spec.running,VmPvc:.spec.template.spec.volumes[1].persistentVolumeClaim.claimName
VmNs       VmNam      VmStatus   VmPvc
5aef865b   47e1d900   false      47e1d900
5aef865b   54d14b04   true       54d14b04
5aef865b   54e2c203   true       54e2c203
72f8435d   725a3b63   true       725a3b63
72f8435d   72674e64   true       72674e64
72f8435d   72990e5e   true       72990e5e
72f8435d   72f1065f   true       72f1065f