Skip to content

1. 概述

在Kubernetes中,字段选择器(Field Selectors)和标签选择器(Label Selectors)是两种不同的查询机制,用于过滤和选择特定的资源。字段选择器允许用户根据资源的内部字段来过滤资源,这些字段可以是资源的状态、元数据等。通过字段选择器,用户可以精确地选择出满足特定条件的资源,进而对这些资源执行进一步的操作,如查看、删除等。

2. 基本语法

bash
kubectl get --field-selector <key>([<operator>][<value>])
kubectl get --field-selector <key>([<operator>][<value>])
  • 使用 kubectl get 命令加上 --field-selector 选项来指定字段选择器。
  • 字段选择器的格式为 =,其中 是资源的字段名, 是要匹配的值。
  • 可以使用多个字段选择器,用逗号分隔。

3. 支持的字段

不同的 Kubernetes 资源类型支持不同的字段选择器。 所有资源类型都支持 metadata.namemetadata.namespace 字段。 使用不被支持的字段选择器会产生错误。

3.1 支持的字段列表

类别字段
Podspec.nodeName spec.restartPolicy spec.schedulerName spec.serviceAccountName spec.hostNetwork status.phase status.podIP status.nominatedNodeName
EventinvolvedObject.kind involvedObject.namespace involvedObject.name involvedObject.uid involvedObject.apiVersion involvedObject.resourceVersion involvedObject.fieldPath reason reportingComponent source type
Secrettype
Namespacestatus.phase
ReplicaSetstatus.replicas
ReplicationControllerstatus.replicas
Jobstatus.successful
Nodespec.unschedulable
CertificateSigningRequestspec.signerName

4. 支持的操作符

  • 等于(= 或 ==):选择字段值等于指定值的资源。
  • 不等于(!=):选择字段值不等于指定值的资源。
  • 基于集合的操作符 (in、notin、exists)不支持字段选择算符。

案例

bash
#查询集群中所有非运行状态的Pods
kubectl get pods -A --field-selector=status.phase!=Running
#查询集群中所有非运行状态的Pods
kubectl get pods -A --field-selector=status.phase!=Running
bash
#查询集群中所有处于运行状态(Running)并且重启策略设置为Always的Pods
kubectl get pods -A --field-selector=status.phase=Running,spec.restartPolicy=Always
#查询集群中所有处于运行状态(Running)并且重启策略设置为Always的Pods
kubectl get pods -A --field-selector=status.phase=Running,spec.restartPolicy=Always

多个字段选择器可以通过使用逗号分隔的列表组成一个选择链

bash
#跨资源
#查询集群中除default命名空间之外的所有命名空间内的StatefulSets和Services资源
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default
#跨资源
#查询集群中除default命名空间之外的所有命名空间内的StatefulSets和Services资源
kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default