如何列出Kubernetes特定节点池的所有节点?支持JSON/awk过滤吗?
方法1:利用节点标签直接筛选
大多数托管K8s集群(GKE、EKS、AKS)会自动给节点打上对应节点池的标签,直接用kubectl的标签选择器就能过滤:
- GKE集群:
kubectl get nodes -l cloud.google.com/gke-nodepool=<你的节点池名称> - EKS集群:
kubectl get nodes -l eks.amazonaws.com/nodegroup=<你的节点池名称> - AKS集群:
kubectl get nodes -l kubernetes.azure.com/agentpool=<你的节点池名称>
如果是自定义节点池(自己给节点打了标签),比如标签键是nodepool、值为my-custom-pool,命令是:kubectl get nodes -l nodepool=my-custom-pool
方法2:通过JSON元数据精准输出(jsonpath)
如果只需要提取节点名称等特定字段,用jsonpath格式输出更灵活:
以GKE节点池my-nodepool为例:kubectl get nodes -o jsonpath='{range .items[?(@.metadata.labels.cloud\.google\.com/gke-nodepool=="my-nodepool")]}{.metadata.name}{"\n"}{end}'
自定义标签的情况(比如nodepool=my-custom-pool):kubectl get nodes -o jsonpath='{range .items[?(@.metadata.labels.nodepool=="my-custom-pool")]}{.metadata.name}{"\n"}{end}'
方法3:用awk过滤输出
先通过--show-labels查看节点的标签列,再用awk匹配目标节点池标签并提取节点名:
比如GKE节点池my-nodepool:kubectl get nodes --show-labels | awk '/cloud.google.com\/gke-nodepool=my-nodepool/ {print $1}'
自定义标签的情况:kubectl get nodes --show-labels | awk '/nodepool=my-custom-pool/ {print $1}'
小提示
如果不知道节点池对应的标签键,先选一个节点执行kubectl describe node <节点名称>,在Labels部分找到对应节点池的标识标签即可。
内容的提问来源于stack exchange,提问作者Kiara Parks

