如何通过kubectl获取K8s主节点上运行的Pod列表?
当然可以!你之前的命令只是按节点名排序,但没法区分主节点和工作节点的角色。要获取主节点上处于Running状态的Pod列表,咱们可以利用K8s主节点自带的角色标签来精准过滤,下面给你几种好用的方法:
方法1:分步过滤(直观易上手)
首先,先拿到所有主节点的名称(K8s主节点通常带有node-role.kubernetes.io/master或node-role.kubernetes.io/control-plane标签,具体取决于你的集群版本):
# 获取所有主节点名称(兼容新旧版K8s) MASTER_NODES=$(kubectl get nodes --selector='node-role.kubernetes.io/master,node-role.kubernetes.io/control-plane' -o jsonpath='{.items[*].metadata.name}')
接着查询这些节点上状态为Running的所有Pod(记得加--all-namespaces,因为主节点上的系统Pod大多在kube-system这类命名空间里):
kubectl get pods --all-namespaces -o wide --field-selector=status.phase=Running | grep -E "$(echo $MASTER_NODES | tr ' ' '|')"
方法2:用kubectl模板一步输出(无需额外工具)
如果你不想依赖grep,可以用kubectl的Go模板直接关联节点标签和Pod状态,一次性输出结果:
kubectl get pods --all-namespaces -o go-template=' {{- range $pod := .items -}} {{- if eq $pod.status.phase "Running" -}} {{- $nodeName := $pod.spec.nodeName -}} {{- $node := (kubectl get node $nodeName -o json | fromJson) -}} {{- if or (index $node.metadata.labels "node-role.kubernetes.io/master") (index $node.metadata.labels "node-role.kubernetes.io/control-plane") -}} {{ $pod.metadata.namespace }}/{{ $pod.metadata.name }} {{ $nodeName }} {{- end -}} {{- end -}} {{- end -}}'
要是你的kubectl版本不支持fromJson,可以搭配jq工具(需要提前安装)来处理JSON输出:
kubectl get pods --all-namespaces -o json | jq -r ' .items[] | select(.status.phase == "Running") | .spec.nodeName as $nodeName | (kubectl get node $nodeName -o json | fromjson) as $node | select($node.metadata.labels["node-role.kubernetes.io/master"] or $node.metadata.labels["node-role.kubernetes.io/control-plane"]) | [.metadata.namespace, .metadata.name, $nodeName] | @tsv'
小提示:确认主节点标签
如果上面的命令没返回结果,可能你的主节点用了自定义角色标签。可以先查看所有节点的标签来确认:
kubectl get nodes --show-labels
找到主节点对应的角色标签(比如node-role.kubernetes.io/my-control-plane),然后替换命令里的selector就行。
内容的提问来源于stack exchange,提问作者shiv455
相关产品推荐
相关产品推荐

