Open10

[Reading] kubectl

fujiwofujiwo

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: ""
fujiwofujiwo

サブコマンドの登録はこのあたり
https://github.com/kubernetes/kubernetes/blob/7c48c2bd72b9bf5c44d21d7338cc7bea77d0ad2a/staging/src/k8s.io/kubectl/pkg/cmd/cmd.go#L382-L460

k8s.io/kubectl/pkg/cmd 配下にサブコマンドごとにpackageが分けられている。

kubectl get の実態は get.NewCmdGet() で返されるコマンド
https://github.com/kubernetes/kubernetes/blob/7c48c2bd72b9bf5c44d21d7338cc7bea77d0ad2a/staging/src/k8s.io/kubectl/pkg/cmd/get/get.go#L156-L191

fujiwofujiwo
fujiwofujiwo

全体像
https://github.com/kubernetes/kubernetes/blob/7c48c2bd72b9bf5c44d21d7338cc7bea77d0ad2a/staging/src/k8s.io/kubectl/pkg/cmd/get/get.go#L439-L571

  • Control PlaneにAPIリクエストを投げる
  • リクエスト結果をprintする (2種類の方法がありそう)
    • humabreadableに表示(おそらくデフォルト)
    • 特定のフォーマットに応じて表示(オプションで指定)

No resources found はここから出てそう。
https://github.com/kubernetes/kubernetes/blob/7c48c2bd72b9bf5c44d21d7338cc7bea77d0ad2a/staging/src/k8s.io/kubectl/pkg/cmd/get/get.go#L567

fujiwofujiwo

こちらも単にAPIから帰ってきた値をパースしてyamlなりに変換して表示するっぽい