field-selector 字段选择器

字段选择器(Field selectors)可以根据一个或多个资源字段值筛选kubernetes资源。以下是一些案例:

  • metadata.name=my-service

  • metadata.namesapce!=default

  • status.phase=Pending

备注

获取特定节点的pods 就是通过 --field-selector 字段选择器来过滤出指定主机上的pods

以下案例查询出状态 status.phaseRunning 的Pods:

kubectl get pods --field-selector status.phase=Running

操作符

字段选择器可以使用 = / == / ! 操作符( === 意义相同 )

链式选择器(也就是 AND 逻辑)

标签和选择器(labels and selectors) 一样,字段选择器可以使用逗号分隔的列表组成选择链(也就是相当于 逻辑 AND ),以下案例将删选 status.phase 字段不等于 Running 同时 spec.restartPolicy 字段等于 Always 的所有Pods:

kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always

过滤daemonset

获取特定节点的pods 场景中,我们可能只需要查询出普通的 pods ,但过滤掉 DaemonSet ,则可以利用 daemonset 都具备的字段过滤 schedulerName: kubernetes.io/daemonset-controller

kubectl get pods -A -owide --field-selector=spec.nodeName=$node,schedulerName!=kubernetes.io/daemonset-controller

很不幸,这里会报错

Error from server (BadRequest): Unable to find "/v1, Resource=pods" that match label selector "", field selector "spec.nodeName=i-uf6i7oryfhjqlfbqiacw,schedulerName!=kubernetes.io/daemonset-controller": field label not supported: schedulerName

我暂时还没有找到解决方法,目前比较土的方法是对已知的 daemonset 对结果进行一遍过滤。后续等我学习和理解更深再尝试解决。

参考