【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
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

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

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

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

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 - GitHub - itaysk/kubectl-neat: Clean up Kubernetes yaml and json output to make it readable

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

❯ kubectl get pod myapp -o yaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"name":"myapp"},"name":"myapp","namespace":"default"},"spec":{"containers":[{"image":"nginx","name":"web-container","ports":[{"contain
erPort":80}]}]}}
  creationTimestamp: "2023-12-09T08:20:24Z"
  labels:
    name: myapp
  name: myapp
  namespace: default
  resourceVersion: "184928"
  uid: c6e802e4-0d65-469d-8c42-d1ba090e1eff
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: web-container
    ports:
    - containerPort: 80
      protocol: TCP
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-hr4gc
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: docker-desktop
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-hr4gc
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2023-12-09T08:20:24Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2023-12-09T08:20:28Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2023-12-09T08:20:28Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2023-12-09T08:20:24Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://5d28cf7236633824b0a4f32f973375768093355166c3739591346facefd5b91a
    image: nginx:latest
    imageID: docker-pullable://nginx@sha256:10d1f5b58f74683ad34eb29287e07dab1e90f10af243f151bb50aa5dbb4d62ee
    lastState: {}
    name: web-container
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2023-12-09T08:20:27Z"
  hostIP: 192.168.65.3
  phase: Running
  podIP: 10.1.9.233
  podIPs:
  - ip: 10.1.9.233
  qosClass: BestEffort
  startTime: "2023-12-09T08:20:24Z"
❯ kubectl neat get -- pod myapp
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: myapp
  name: myapp
  namespace: default
spec:
  containers:
  - image: nginx
    name: web-container
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-hr4gc
      readOnly: true
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  serviceAccountName: default
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-hr4gc
    projected:
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              fieldPath: metadata.namespace
            path: namespace

インストール

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

kubectl krew install neat

使い方

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

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

ローカル

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

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

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

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

Kubernetes

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

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

エイリアス

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

alias kng='kubectl neat get --'

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

kng pod myapp

気になった点

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

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

❯ kubectl neat get -- pod myapp

...

    resources:
      limits:
        cpu: 50m
        memory: 32Mi

...

参考

タイトルとURLをコピーしました