field-selector 字段选择器¶
字段选择器(Field selectors)可以根据一个或多个资源字段值筛选kubernetes资源。以下是一些案例:
metadata.name=my-service
metadata.namesapce!=default
status.phase=Pending
备注
在 获取特定节点的pods 就是通过 --field-selector
字段选择器来过滤出指定主机上的pods
以下案例查询出状态 status.phase
为 Running
的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
对结果进行一遍过滤。后续等我学习和理解更深再尝试解决。