我可以在 kubectl 中按 apiVersion 过滤吗?

Can I filter by apiVersion in kubectl?

我想找到所有仍然 apiVersion: networking.k8s.io/v1beta1 的 kubernetes 入口,因为我已将我的 kubernetes 集群 (EKS) 从 1.21 升级到 1.22,我们应该改用 networking.k8s.io/v1

我试过了

kubectl  get ingress --all-namespaces --field-selector apiVersion="networking.k8s.io/v1beta1 "
Error from server (BadRequest): Unable to find "networking.k8s.io/v1, Resource=ingresses" that match label selector "", field selector "apiVersion=networking.k8s.io/v1beta1": "apiVersion" is not a known field selector: only "metadata.name", "metadata.namespace"

有没有办法在 kubectl 中通过 apiVersion 很好地过滤?

我目前的解决方法是将所有入口请求为 JSON 并使用 jq

在本地过滤
kubectl  get ingress --all-namespaces -o json > result.json
cat result.json |  jq '.items[]|select(.apiVersion=="networking.k8s.io/v1beta1")|[.apiVersion,.metadata.name, .metadata.namespace]'

会产生

[
  "networking.k8s.io/v1beta1",
  "rubelagu-helloworld",
  "hello-world"
], 
[
  "networking.k8s.io/v1beta1",
  "rubelagu-helloworld",
  "hello-world2"
]

您可以使用 go-template 来避免管道连接到其他工具,例如 jq:

kubectl get ingress  -A -o go-template='{{range .items}}{{if (eq .apiVersion "networking.k8s.io/v1")}}{{ .metadata.name }}{{"\n"}}{{end}}{{end}}'

采用更具可读性的格式:

kubectl get ingress  -A -o go-template='{{range .items}}
                                          {{- if (eq .apiVersion "networking.k8s.io/v1") -}}
                                            {{ .metadata.name }}{{"\n"}}
                                          {{- end -}}
                                       {{end}}'