如何找到 kubectl 支持的给定资源类型的字段选择器列表?

toa*_*une 29 kubernetes kubectl

我最近了解了 kubectl--field-selector标志,但在尝试将其与各种对象一起使用时遇到了错误。

例如 :

$ kubectl delete jobs.batch --field-selector status.succeeded==1
Error from server (BadRequest): Unable to find "batch/v1, Resource=jobs" that match label selector "", field selector "status.succeeded==1": field label "status.succeeded" not supported for batchv1.Job
Run Code Online (Sandbox Code Playgroud)

根据文档, Supported field selectors vary by Kubernetes resource type.,所以我想这种行为是可以预料的。

烦人的部分是我必须单独尝试每个字段才能知道我是否可以使用它们。

有没有办法获得给定资源类型/资源版本/kubectl 版本支持的所有字段?

Vit*_*Vit 11

你的问题是你错误地使用了status.succeeded而不是status.successful,所以正确的命令是

kubectl delete jobs.batch --field-selector status.successful==1
No resources found
Run Code Online (Sandbox Code Playgroud)

关于您关于所有领域的问题:我的建议是深入代码并在 convert.go 中为每个 API 搜索合适的资源类型。

示例: 批量作业转换.go

    return scheme.AddFieldLabelConversionFunc(SchemeGroupVersion.WithKind("Job"),
        func(label, value string) (string, string, error) {
            switch label {
            case "metadata.name", "metadata.namespace", "status.successful":
                return label, value, nil
            default:
                return "", "", fmt.Errorf("field label %q not supported for batchv1.Job", label)
            }
        },
    )
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有回答问题。有没有办法获取给定资源类型/资源版本/kubectl 版本支持的所有字段? (3认同)

toa*_*une 5

根据记录,虽然这不能回答问题,但可以使用 来解决此限制jsonPath

例如,上面的例子可以这样完成:

kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')
Run Code Online (Sandbox Code Playgroud)

(解决方案灵感来自/sf/answers/3747869751/