获取特定节点的pods

我们在生产环境会有一种查询需求:

找出特定(labels)服务器上运行的所有pods

这个操作可以解析为2步:

  • 找出特定(labels)服务器

    • -l <labels> 根据节点label查询

    • -ojsonpath='{.items[*].metadata.name}' 仅输出节点名

  • 查询出这批服务器上应用pods

    • --field-selector spec.nodeName=$node

完整案例:

# 这里案例采用查询出集群中ARM服务器节点上pods
LABEL="kubernetes.io/arch=arm64"
for node in $(kubectl get nodes -l $LABEL -ojsonpath='{.items[*].metadata.name}'); do kubectl get pods -A -owide --field-selector spec.nodeName=$node; done
  • --field-selector 也提供了反过来的过滤,例如想查询出非 kube-system namespace的pods:

    kubectl get pods -A --field-selector metadata.namespace!=kube-system
    

注解

field-selector 字段选择器 是查询关键,但是不是所有 filed label 都支持

注解

Kubernetes目前支持AND交集的多标签查询,也即是只支持同时满足多个标签的节点查询,但不支持这些标签的OR满足

不过,Kubernetes还是支持一个单一标签的多个值的OR查询:

kubectl get pods -l 'app in (foo,bar)'

pod标签

如果可行,可以在pod上增加一些特定标签,这将大大方便查询。例如,将上述节点架构标签也加入到pods上,那么查询的时候就不需要拆分成2步(先查节点,再查节点上的pod),可以一步到位,结合多个标签进行查询:

kubectl get pods -A -owide --selector kubernetes.io/arch=arm64,labelXXX,labelYYY

参考