7

Kubernetes GET API 是否真的支持fieldSelector参数来查询数组字段的值?

例如,我有一个像这样的 Pod:

apiGroup: v1
kind: Pod
metadata:
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: grpc-ping-r7f8r-deployment-54d688d777
    uid: 262bab1a-1c79-11ea-8e23-42010a800016

我可以做类似的事情:

kubectl get pods --field-selector 'metadata.ownerReferences.uid=262bab1a-1c79-11ea-8e23-42010a800016'

此命令失败 ( field label not supported: metadata.ownerReferences.uid)。我怀疑原因是ownerReferences数组字段本身。我也尝试过,但没有奏效:

  • metadata.ownerReferences[*].uid=
  • metadata.ownerReferences[].uid=

我可能会尝试用于 Kubernetes API 的 client-go SDK,但我怀疑出于同样的原因它不会工作。

有没有一种服务器端的方式来查询?非常感谢。

4

2 回答 2

23

--field-selector唯一适用于一些有限的领域。

其中包含:

"metadata.name",
"metadata.namespace",
"spec.nodeName",
"spec.restartPolicy",
"spec.schedulerName",
"spec.serviceAccountName",
"status.phase",
"status.podIP",
"status.podIPs",
"status.nominatedNodeName"

但是您可以使用jq. 这是我用来列出所有就绪节点的命令。它演示了您正在寻找的数组字段的使用。

$ kubectl get nodes -o json | jq -r '.items[] | select(.status.conditions[] | select(.type=="Ready" and .status=="True")) | .metadata.name '

master-0
node-1
node-3
于 2019-12-22T10:31:44.453 回答
0

我认为您真正想要做的是过滤器而不是查询。通过使用JSONPath,您可以使用?().

例如以下将起作用:

kubectl get pods -o jsonpath='{range .items[?(.metadata.ownerReferences.uid=262bab1a-1c79-11ea-8e23-42010a800016)]}{.metadata.name}{end}'
于 2020-11-23T20:39:51.383 回答