阅读Kubernets文档,似乎可以根据标签选择一定范围的pod。我想选择一个节点上的所有pod,但不想在相应的节点上标记每个pod。

我是否从文档中遗漏了一些东西,或者只是不可能按节点选择?

如果我这样做:

kubectl get pods \
--output=wide
--namespace=$NS \
--server=$SERVER | head

#=>

NAME   READY     STATUS             RESTARTS   AGE       NODE

这些头可以用作选择器吗?如果是,如何使用kubectl?如何用API做到这一点?


当前回答

正如接受的答案中提到的,PR现在被合并了,你可以按节点获取pods,如下所示:

kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>

其他回答

按nodeName排序的示例:

kubectl get pods -o wide --sort-by="{.spec.nodeName}"

使用标签过滤器在节点上获取pod的示例:

for n in $(kubectl get nodes -l your_label_key=your_label_value --no-headers | cut -d " " -f1); do 
    kubectl get pods --all-namespaces  --no-headers --field-selector spec.nodeName=${n} 
done

或者通过重新启动的次数

kubectl get pods --sort-by="{.status.containerStatuses[:1].restartCount}"

使用——template标志过滤nodeName的示例:

$ kubectl get nodes

NAME                         STATUS                     AGE
ip-10-0-90-30.ec2.internal   Ready                      2d
ip-10-0-90-35.ec2.internal   Ready                      2d
ip-10-0-90-50.ec2.internal   Ready,SchedulingDisabled   2d
ip-10-0-91-60.ec2.internal   Ready                      2d
ip-10-0-91-65.ec2.internal   Ready                      2d


$kubectl get pods --template '{{range .items}}{{if eq .spec.nodeName "ip-10-0-90-30.ec2.internal"}}{{.metadata.name}}{{"\n"}}{{end}}}{{end}}'

filebeat-pezch
app-5xole
node-exporter-6kfs8
prometheus-0
sso-359976856-wu8zt

你想要的在Kubernetes API服务器端是这样支持的:

curl --cacert ca.crt --cert apiserver.crt --key apiserver.key  https://<server>:<port>/api/v1/namespaces/<namespace>/pods?fieldSelector=spec.nodeName%3Dsomenodename

但是,字段选择器选项还没有内置到kubectl中:https://github.com/kubernetes/kubernetes/pull/50140

正如接受的答案中提到的,PR现在被合并了,你可以按节点获取pods,如下所示:

kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>

你也可以用下面的命令查询一个节点上的所有pod

kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
kubectl describe node $NODE

将显示在$NODE上运行的所有未终止的pod。