kubectl get all は全リソースの情報を表示しない

TL;DR

  • kubectl get all は、v1.14.3 時点で次のリソースの情報のみを表示し、全リソースが対象ではない
    • pods.v1
    • replicationcontrollers.v1
    • services.v1
    • cronjobs.batch
    • daemonsets.apps
    • deployments.apps
    • horizontalpodautoscalers.autoscaling
    • jobs.batch
    • replicasets.apps
    • statefulsets.apps
  • 本当に全リソースの情報を表示するには、次のワンライナが利用できる
    kubectl get "$(kubectl api-resources --namespaced=true --verbs=list -o name | tr "\n" "," | sed -e 's/,$//')"
    
  • ワンライナを kubectl プラグインとしておくと便利

はじめに

kubectl get all は、その見た目からあたかも利用できる全リソースの情報を出力するように見えますが、Ingress、Role/RoleBinding といったリソースが含まれておらず、全リソースが対象ではありません。真に全リソースの情報を出力するには、簡単なワンライナが利用できます。また、それを kubectl プラグインとして使えるようにしておくと便利です。

kubectl get all はどのリソース情報を表示するのか

kubectl get all は Kubernetes v1.14.3 時点で次のリソースが対象となっており、全リソースが対象ではありません。

  • pods.v1
  • replicationcontrollers.v1
  • services.v1
  • cronjobs.batch
  • daemonsets.apps
  • deployments.apps
  • horizontalpodautoscalers.autoscaling
  • jobs.batch
  • replicasets.apps
  • statefulsets.apps

それでも kubectl get all を使いたい

ばっと大雑把にどんなリソースのオブジェクトが存在するのかを確認するのに kubectl get all はたしかに便利です。そこで、真に全リソースの情報を出力するには、次のワンライナが利用できます。

kubectl get "$(kubectl api-resources --namespaced=true --verbs=list --output=name | tr "\n" "," | sed -e 's/,$//')"

ここからはワンライナが何をやっているのかを説明します。気になる人だけ読んでください。

全リソースの情報を出力するワンライナの解説

$ kubectl api-resources --namespaced=true --verbs=list --output=name
configmaps
endpoints
events
limitranges
persistentvolumeclaims
(略...)

まず最初に上記のコマンドで、接続する Kubernetes API サーバで利用できる namespaced で、list に対応する全リソースの名前のみを取得しています。

kubectl api-resources コマンドは、接続する Kubernetes API サーバで利用できるリソースを一覧するコマンドです。ここではそのオプションである --namespaced=true を利用して、namespaced なリソースに絞り込んでいます。Kubernetes リソースには、namespaced とそうでないもの(cluster wide/クラスタレベル) なリソースがあり、namespaced なリソースは、Pods, Deployments などで、クラスタレベルのリソースは、Namespaces や PersistentVolumes などです。次の --verbs=list オプションで、リソースのリスト取得に対応しているリソースに絞り込んでいます。最後に出力する情報をリソース名だけにしています。

$ kubectl api-resources --namespaced=true --verbs=list --output=name | tr "\n" "," | sed -e 's/,$//'
configmaps,endpoints,events,limitranges,persistentvolumeclaims,(略...)

次に、trsed のコマンドを利用して、改行区切りの全リソースのリストをカンマ区切りに加工しています。

kubectl get configmaps,endpoints,events,limitranges,persistentvolumeclaims,(略...)

最後に kubectl get コマンドでリソース情報を取得しています。このコマンドは、引数にリソース名を取りますが、カンマ区切りで複数のリソースを並べて一度に取得できるため、この前の処理で全リソースのリストをカンマ区切りに加工しています。

ワンライナを kubectl プラグインとして便利に使う

ワンライナもいいのですが、常用するとなるとスクリプトとしてまとめておくとよさそうです。ここでは単にスクリプトとせずにせっかくなので kubectl get-all コマンドとして利用できるように kubectl プラグインにしたいと思います。

次のステップでコマンドをインストールします。ここでは、/usr/local/bin/ にインストールしていますが、パスが通っているディレクトリであればどこでも大丈夫です。必要に応じて変更してください。

cat <<'EOL' > /usr/local/bin/kubectl-get_all
#!/usr/bin/env bash

set -e -o pipefail; [[ -n "$DEBUG" ]] && set -x

exec kubectl get "$(kubectl api-resources --namespaced=true --verbs=list --output=name | tr "\n" "," | sed -e 's/,$//')" "$@"
EOL
chmod +x /usr/local/bin/kubectl-get_all

これで、真に全リソースの情報を出力する kubectl get-all コマンドが利用できます。

# 全リソースの情報を出力する
$ kubectl get-all

# kube-system ネームスペースの全リソースの情報を出力する
$ kubectl get-all -n kube-system

kubectl プラグインについての詳細は、kubectl のプラグイン機能 kubectl plugin を使おう!を参照してください。

まとめ

ここでは、kubectl get all は全リソースの情報を出力しないことと、真に全リソースの情報を出力するワンライナを紹介しました。ワンライナを kubectl プラグインとして利用できるようにしておくと何かと便利です。

次のエントリでは、kubectl get all で出力されるリソースはどこで指定されているのか、その仕組みについて解説します。