我最近了解了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 documentation,Supported field selectors vary by Kubernetes resource type.
,所以我猜想这种行为是可以预期的。
烦人的是,我不得不单独尝试每个字段以了解是否可以使用它们。
有没有办法获取给定资源类型/资源版本/ kubectl版本支持的所有字段?
答案 0 :(得分:1)
您遇到的问题是您错误地使用了status.succeeded
而不是status.successful
,所以正确的命令是
kubectl delete jobs.batch --field-selector status.successful==1
No resources found
关于所有字段的问题:我的建议是深入研究代码,并在conversion.go中为每个API搜索合适的资源类型。
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:协调器 创建机器失败:启动实例失败:启动错误 实例:当前不支持请求的配置。 请查看文档以了解受支持的配置。