【kubectl-neat】すっきりしたマニフェストを取得する

2023.12.09
2024.03.24
Kubernetes
kubectl-neat

はじめに

kubectl-neat について紹介します。

kubectl-neat

kubectl-neatは、Kubernetes のマニフェストから不要な部分を除いて、みやすくする kubectl プラグインです。

GitHub - itaysk/kubectl-neat: Clean up Kubernetes yaml and json output to make it readable

GitHub - itaysk/kubectl-neat: Clean up Kubernetes yaml and json output to make it readable

Clean up Kubernetes yaml and json output to make it readable - itaysk/kubectl-neat

不要なstatusフィールドやmetadataフィールド、空のフィールドを削除して表示してくれます。

また、デフォルトの値も表示されないようになっています。(たとえ、ユーザーが明示的にデフォルト値を指定したとしても)

そのほか、細かい部分は下記で表示するかどうか記載されています。

GitHub - itaysk/kubectl-neat: Clean up Kubernetes yaml and json output to make it readable

GitHub - itaysk/kubectl-neat: Clean up Kubernetes yaml and json output to make it readable

Clean up Kubernetes yaml and json output to make it readable - itaysk/kubectl-neat

下記 2 つは、kubectl get pod myapp -o yamlkubectl-neatの出力の違いになります。だいぶ不要な部分がなくなり、見やすくなっています。

1❯ kubectl get pod myapp -o yaml
2apiVersion: v1
3kind: Pod
4metadata:
5  annotations:
6    kubectl.kubernetes.io/last-applied-configuration: |
7      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"name":"myapp"},"name":"myapp","namespace":"default"},"spec":{"containers":[{"image":"nginx","name":"web-container","ports":[{"contain
8erPort":80}]}]}}
9  creationTimestamp: "2023-12-09T08:20:24Z"
10  labels:
11    name: myapp
12  name: myapp
13  namespace: default
14  resourceVersion: "184928"
15  uid: c6e802e4-0d65-469d-8c42-d1ba090e1eff
16spec:
17  containers:
18  - image: nginx
19    imagePullPolicy: Always
20    name: web-container
21    ports:
22    - containerPort: 80
23      protocol: TCP
24    resources: {}
25    terminationMessagePath: /dev/termination-log
26    terminationMessagePolicy: File
27    volumeMounts:
28    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
29      name: kube-api-access-hr4gc
30      readOnly: true
31  dnsPolicy: ClusterFirst
32  enableServiceLinks: true
33  nodeName: docker-desktop
34  preemptionPolicy: PreemptLowerPriority
35  priority: 0
36  restartPolicy: Always
37  schedulerName: default-scheduler
38  securityContext: {}
39  serviceAccount: default
40  serviceAccountName: default
41  terminationGracePeriodSeconds: 30
42  tolerations:
43  - effect: NoExecute
44    key: node.kubernetes.io/not-ready
45    operator: Exists
46    tolerationSeconds: 300
47  - effect: NoExecute
48    key: node.kubernetes.io/unreachable
49    operator: Exists
50    tolerationSeconds: 300
51  volumes:
52  - name: kube-api-access-hr4gc
53    projected:
54      defaultMode: 420
55      sources:
56      - serviceAccountToken:
57          expirationSeconds: 3607
58          path: token
59      - configMap:
60          items:
61          - key: ca.crt
62            path: ca.crt
63          name: kube-root-ca.crt
64      - downwardAPI:
65          items:
66          - fieldRef:
67              apiVersion: v1
68              fieldPath: metadata.namespace
69            path: namespace
70status:
71  conditions:
72  - lastProbeTime: null
73    lastTransitionTime: "2023-12-09T08:20:24Z"
74    status: "True"
75    type: Initialized
76  - lastProbeTime: null
77    lastTransitionTime: "2023-12-09T08:20:28Z"
78    status: "True"
79    type: Ready
80  - lastProbeTime: null
81    lastTransitionTime: "2023-12-09T08:20:28Z"
82    status: "True"
83    type: ContainersReady
84  - lastProbeTime: null
85    lastTransitionTime: "2023-12-09T08:20:24Z"
86    status: "True"
87    type: PodScheduled
88  containerStatuses:
89  - containerID: docker://5d28cf7236633824b0a4f32f973375768093355166c3739591346facefd5b91a
90    image: nginx:latest
91    imageID: docker-pullable://nginx@sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee
92    lastState: {}
93    name: web-container
94    ready: true
95    restartCount: 0
96    started: true
97    state:
98      running:
99        startedAt: "2023-12-09T08:20:27Z"
100  hostIP: 192.168.65.3
101  phase: Running
102  podIP: 10.1.9.233
103  podIPs:
104  - ip: 10.1.9.233
105  qosClass: BestEffort
106  startTime: "2023-12-09T08:20:24Z"
1❯ kubectl neat get -- pod myapp
2apiVersion: v1
3kind: Pod
4metadata:
5  labels:
6    name: myapp
7  name: myapp
8  namespace: default
9spec:
10  containers:
11  - image: nginx
12    name: web-container
13    ports:
14    - containerPort: 80
15    volumeMounts:
16    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
17      name: kube-api-access-hr4gc
18      readOnly: true
19  preemptionPolicy: PreemptLowerPriority
20  priority: 0
21  serviceAccountName: default
22  tolerations:
23  - effect: NoExecute
24    key: node.kubernetes.io/not-ready
25    operator: Exists
26    tolerationSeconds: 300
27  - effect: NoExecute
28    key: node.kubernetes.io/unreachable
29    operator: Exists
30    tolerationSeconds: 300
31  volumes:
32  - name: kube-api-access-hr4gc
33    projected:
34      sources:
35      - serviceAccountToken:
36          expirationSeconds: 3607
37          path: token
38      - configMap:
39          items:
40          - key: ca.crt
41            path: ca.crt
42          name: kube-root-ca.crt
43      - downwardAPI:
44          items:
45          - fieldRef:
46              fieldPath: metadata.namespace
47            path: namespace

インストール

インストールはkrewを使ってできます。

1kubectl krew install neat

使い方

kubectl-neatには、下記 2 つの使い方があります。

  • ローカル(ファイルもしくは標準入力)
  • Kubernetes(kubectl get 経由)

ローカル

下記のコマンドで標準入力経由でマニフェストを出力できます。

1kubectl get [resource] [name] -o yaml | kubectl neat
1kubectl get pod myapp -o yaml | kubectl neat

ローカルのファイルを指定しても実行可能です。

1kubectl neat -f [manifest file]
1kubectl neat -f pod.yaml

Kubernetes

kubectl neat getを使うことで、kubectl getから取得したものをkubectl neatで実行した形になります。

1kubectl neat get -- [resource] [name]
1kubectl neat get -- pod myapp

エイリアス

ちなみに、私は下記のエイリアスを設定して使ってみることにします。

1alias kng='kubectl neat get --'

下記のように実行できるようになります。

1kng pod myapp

気になった点

使ってみて少しだけ気になった点を挙げます。

resources.limitsresources.requestsを同じ値で設定した場合は、resources.limitsのみ表示されるようになっているみたいです。

1❯ kubectl neat get -- pod myapp
2
3...
4
5    resources:
6      limits:
7        cpu: 50m
8        memory: 32Mi
9
10...
11

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee