K8S字段选择算符
“字段选择算符(Field selectors)"允许你根据一个或多个资源字段的值筛选K8S对象,如
metadata.name=my-service
metadata.namespace!=default
status.phase=Pending
下面这个kubectl
命令将筛选出status.phase
字段值为Running
的所有Pod:
kubectl get pods --field-selector status.phase=Running
说明:
字段选择算符本质上是资源“过滤器(Filters)”。默认情况下,字段选择算符/过滤器是未被应用的,这意味着指定类型的所有资源都会被筛选出来。这使得kubectl get pods
和kubectl get pods --field-selector""
这两个kubectl
查询时等价的。
支持的字段
不同的K8S资源类型支持不同的字段选择算符。所有资源类型都支持metadata.name
和metadata.namespace
字段。使用不被支持的字段选择算符会产生错误,如:
kubectl get ingress --field-selector foo.bar=baz
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"
支持字段列表 | 类别 | 字段 |
---|---|---|
Pod | spec.nodeName | |
Pod | spec.restartPolicy | |
Pod | spec.schedulerName | |
Pod | spec.serviceAccountName | |
Pod | spec.hostNetwork | |
Pod | status.phase | |
Pod | status.podIP | |
Pod | status.nominatedNodeName | |
Event | involvedObject.kind | |
Event | involvedObject.namespace | |
Event | involvedObject.name | |
Event | involvedObject.uid | |
Event | involvedObject.apiVersion | |
Event | involvedObject.resourceVersion | |
Event | involvedObject.fieldPath | |
Event | reason | |
Event | reportingComponent | |
Event | source | |
Event | type | |
Secret | type | |
Namespace | status.phase | |
ReplicaSet | status.replicas | |
ReplicationController | status.replicas | |
Job | status.successful | |
Node | spec.unschedulable | |
CertificateSigningRequest | spec.signeerName |
自定义资源字段
所有自定义资源类型都支持metadata.name
和metadata.namespace
字段
此外,CustomResourceDefinition的spec.versions[*].selectableFields
字段声明了自定义资源中那些其他字段可以用于字段选择算符。
支持的操作符
可以在字段选择算符中使用=
、`==``和!=
(=
和==
的意义是相同的)操作符。,例如,下面这个kubectl
命令将筛选所有不属于default
命名空间的K8S服务:
kubectl get services --all-namespaces --field-selector metadata.namespace!=default
说明:
基于集合的操作符(in
、notin
、exists
)不支持字段选择算符
链式选择算符
同标签和其他选择算符一样,字段选择算符可以通过使用都好分隔的列表组成一个选择链。下面这个kubectl
命令将筛选status.phase
字段不等于Running
同时spec.restartPolicy
字段等于Always
的所有Pod:
kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always
多种资源类型
字段选择算符也可以跨多种资源类型来使用,下面这个``kubectl命令将筛选出所有不在
default```命名空间中的StatefulSet和Service
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default
交流群: