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

时间:2019-04-19 12:45:58

标签: 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

根据the documentationSupported field selectors vary by Kubernetes resource type.,所以我猜想这种行为是可以预期的。

烦人的是,我不得不单独尝试每个字段以了解是否可以使用它们。

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

3 个答案:

答案 0 :(得分:1)

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

kubectl delete jobs.batch --field-selector status.successful==1
No resources found

关于所有字段的问题:我的建议是深入研究代码,并在conversion.go中为每个API搜索合适的资源类型。

示例: Batch Jobs conversion.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)
            }
        },
    )
}

另一个例子: https://github.com/kubernetes/kubernetes/blob/master/pkg/apis/core/v1/conversion.go#L462-L510

答案 1 :(得分:0)

为记录起见,尽管这不能回答问题,但可以通过jsonPath解决此限制。

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

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

(该解决方案的灵感来自https://stackoverflow.com/a/53540996/5771067

答案 2 :(得分:-1)

以下是在所有名称空间中列出资源(例如“机器”类型的资源)的方法,其中状态阶段未运行

kubectl get Machine -A -o jsonpath='{.items[?(@.status.phase!="Running")].metadata.name}'

打印这些失败资源的错误消息

kubectl get Machine -A -o jsonpath='{.items[?(@.status.phase=="Failed")].status.errorMessage}'

输出示例:

nmanos-cluster-a-v5jcx-submariner-gw-us-west-1b-pwwrk:协调器 创建机器失败:启动实例失败:启动错误 实例:当前不支持请求的配置。 请查看文档以了解受支持的配置。