[Reading] kubectl
kubectl get <resource名>でNo resources foundが出るようなケースで、 kubectl get <resource名> -o yamlした時の内部挙動を見てみる
% kubectl version
Client Version: v1.30.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.0
リソースによって帰って来るyamlの結果が異なる気がしている。
namespaces
% kubectl get namespaces --selector "pipecd.dev/managed-by=piped,pipecd.dev/application=336391ea-e3d2-4469-bfea-a255e6afa4bc"
No resources found
kubectl get namespaces -o yaml --selector "pipecd.dev/managed-by=piped,pipecd.dev/application=336391ea-e3d2-4469-bfea-a255e6afa4bc"
apiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
validatingadmissionpolicies.admissionregistration.k8s.io
% kubectl get validatingadmissionpolicies.admissionregistration.k8s.io --selector "pipecd.dev/managed-by=piped,pipecd.dev/application=336391ea-e3d2-4469-bfea-a255e6afa4bc"
No resources found
kubectl get validatingadmissionpolicies.admissionregistration.k8s.io -o yaml --selector "pipecd.dev/managed-by=piped,pipecd.dev/application=336391ea-e3d2-4469-bfea-a255e6afa4bc"
apiVersion: v1
items:
- apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicyList
metadata:
resourceVersion: "675542"
kind: List
metadata:
resourceVersion: ""
kubectlのエントリーポイント
k8s.io/kubectl/pkg/cmd.NewDefaultKubectlCommand() を呼び出してcobraコマンドを作ってそう
サブコマンドの登録はこのあたり
k8s.io/kubectl/pkg/cmd
配下にサブコマンドごとにpackageが分けられている。
kubectl get
の実態は get.NewCmdGet()
で返されるコマンド
コマンドは3stepで実行される。
o.Complete(): コマンド引数とファクトリを受け取り、残りの必要なオプションを補完する。
o.Validate(): optionのバリデーション
o.Run(): kubectl getのロジック実行
今回はコマンドを実行することはできていたので、o.Run()
以降を見る必要がありそう
全体像
- Control PlaneにAPIリクエストを投げる
- リクエスト結果をprintする (2種類の方法がありそう)
- humabreadableに表示(おそらくデフォルト)
- 特定のフォーマットに応じて表示(オプションで指定)
No resources found
はここから出てそう。
humabreadableに表示(おそらくデフォルト)
- APIから帰ってきたリソースを簡易的に整形して出力
- 表示するリソースがなければ Not resources found を表示するはず
特定のフォーマットに応じて表示(オプションで指定)
こちらも単にAPIから帰ってきた値をパースしてyamlなりに変換して表示するっぽい
ValidatingAdmissionPolicyList, ValidatingAdmissionPolicyBindingList はリソースが存在しなくてもitemsが返ってくるバグがあったらしい。