命令定位
--field-selector 按资源自身的字段值过滤列表,而不是按标签。适用平台是 Kubernetes,它由 API 服务端执行过滤,比拉全量再 grep 更省带宽。支持的字段是有限白名单,每个资源各不相同:Pod 常用 spec.nodeName、status.phase,事件常用 type、involvedObject.name。它是「按属性找对象」的快捷方式,尤其适合查某节点的负载、非 Running 的 Pod、Warning 事件。
基本信息
| 适用平台 | Kubernetes(服务端过滤,需 API 支持该字段) |
|---|---|
| 语法 | kubectl get <资源> --field-selector <字段>=<值>[,<字段2>!=<值2>] |
| 运算符 | 支持 =、== 与 !=,不支持大于小于等范围比较 |
| 权限要求 | 与普通 get 相同 |
典型使用场景
- 定位单节点问题:列出某台机器上的全部 Pod,判断节点故障影响面
- 找异常副本:过滤出非 Running 或非 Succeeded 的 Pod 做批量核对
- 事件收敛:只看 type=Warning 的事件,跳过海量 Normal 噪音
- 排除系统命名空间:快速看清业务侧的 Pod 列表
- 接流水线断言:确认某节点上没有业务 Pod 后才执行 drain 维护
常用示例
常用示例
kubectl get pods --field-selector spec.nodeName=node-1 -A # 某节点上的全部 Pod
kubectl get pods --field-selector status.phase!=Running -A # 非 Running 的 Pod
kubectl get events --field-selector type=Warning # 只看告警事件
kubectl get pods --field-selector metadata.namespace!=kube-system # 排除系统命名空间
kubectl get pods -A --field-selector spec.nodeName=node-1,status.phase=Running # 多条件与关系
kubectl get events -A --field-selector involvedObject.name=web-x # 某个对象的全部事件输出逐列读法
| 列 | 含义 | 排查用途 |
|---|---|---|
| NAME | 资源名 | 与 describe 结合做下钻 |
| STATUS / type | 资源状态或事件类型 | Warning 优先看,Normal 多为参考 |
| AGE / lastTimestamp | 创建时间或最后发生时间 | 配合 --sort-by 找最近的异常 |
| NODE(-o wide) | 所在节点 | 判断是节点级还是应用级问题 |
字段名写错会直接报错,报错信息里会列出该资源实际支持的字段清单,按提示改即可,不需要去翻文档。
字段选择器只支持等值与不等值比较;涉及时间范围、数值大小(如重启次数超过 5)这类条件,仍需拿到结果后用 jsonpath 或 jq 再过滤。
组合使用技巧
- 叠加标签选择器:-l app=web --field-selector status.phase!=Running 能同时按标签和字段收窄范围
- 配合 --sort-by 看最近异常:事件按 lastTimestamp 排序后取末尾几条就是最新告警
- 配 -o custom-columns 留档:把节点、相位、重启次数拼成表格,便于跨时段对比
- 维护前做预检:先用它确认目标节点上还有哪些 Pod,再决定 drain 的窗口与顺序