Kubernetes API - 在特定节点上获取 Pods
Kubernetes API - Get Pods on Specific Nodes
阅读 Kubernets documentation 看起来可以 select 基于标签的 pods 一定范围。我想 select 一个节点上的所有 pods 但我不想在相应节点上标记每个 pod。
我是不是遗漏了文档中的某些内容,还是无法通过节点 select?
如果我这样做:
kubectl get pods \
--output=wide
--namespace=$NS \
--server=$SERVER | head
#=>
NAME READY STATUS RESTARTS AGE NODE
这些 headers 中的任何一个都可以用作 selector 吗?如果是,如何使用 kubectl
来实现?如何使用 API?
示例排序 pods 按节点名称:
kubectl get pods -o wide --sort-by="{.spec.nodeName}"
使用标签过滤器在节点上获取 pods 的示例:
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
您还可以使用以下命令查询所有 pods 个节点
kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
kubectl describe node $NODE
将在 $NODE
.
上显示所有未终止的 pods 运行
如已接受的答案中所述,PR 现在已合并,您可以通过节点获得 pods,如下所示:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
我在 Go Client 上经历了同样的过程,它揭示了 CLI 使用的一些捷径。
func doNodesHavePods(clientset *kubernetes.Clientset) error {
nodeLabelSelector := "nodelabel=interesting_nodes"
nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{LabelSelector: nodeLabelSelector})
if err != nil {
return err
}
nodeNames := []string{}
for _, node := range nodes.Items {
nodeNames = append(nodeNames, node.Name)
}
// --all-namespaces -> listing and looping on namespaces
namespaces, err := clientset.CoreV1().Namespaces().List(metav1.ListOptions{})
if err != nil {
return err
}
for _, namespace := range namespaces.Items {
for _, name := range nodeNames {
// pods need a namespace to be listed.
pods, err := clientset.CoreV1().Pods(namespace.Name).List(metav1.ListOptions{FieldSelector: "spec.nodeName=" + name})
if err != nil {
println("%v", err)
}
for _, pod := range pods.Items {
fmt.Println(pod.Namespace, pod.Name)
}
}
}
return nil
}
我开始发现很多我需要问的问题对于 CLI 来说变得太复杂了,CLI 是一个很好的主力,但是学习使用 Go Client 可以帮助你得到第一个答案'正在寻找,但也更深入地挖掘这些答案提出的问题。
阅读 Kubernets documentation 看起来可以 select 基于标签的 pods 一定范围。我想 select 一个节点上的所有 pods 但我不想在相应节点上标记每个 pod。
我是不是遗漏了文档中的某些内容,还是无法通过节点 select?
如果我这样做:
kubectl get pods \
--output=wide
--namespace=$NS \
--server=$SERVER | head
#=>
NAME READY STATUS RESTARTS AGE NODE
这些 headers 中的任何一个都可以用作 selector 吗?如果是,如何使用 kubectl
来实现?如何使用 API?
示例排序 pods 按节点名称:
kubectl get pods -o wide --sort-by="{.spec.nodeName}"
使用标签过滤器在节点上获取 pods 的示例:
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
您还可以使用以下命令查询所有 pods 个节点
kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
kubectl describe node $NODE
将在 $NODE
.
如已接受的答案中所述,PR 现在已合并,您可以通过节点获得 pods,如下所示:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
我在 Go Client 上经历了同样的过程,它揭示了 CLI 使用的一些捷径。
func doNodesHavePods(clientset *kubernetes.Clientset) error {
nodeLabelSelector := "nodelabel=interesting_nodes"
nodes, err := clientset.CoreV1().Nodes().List(metav1.ListOptions{LabelSelector: nodeLabelSelector})
if err != nil {
return err
}
nodeNames := []string{}
for _, node := range nodes.Items {
nodeNames = append(nodeNames, node.Name)
}
// --all-namespaces -> listing and looping on namespaces
namespaces, err := clientset.CoreV1().Namespaces().List(metav1.ListOptions{})
if err != nil {
return err
}
for _, namespace := range namespaces.Items {
for _, name := range nodeNames {
// pods need a namespace to be listed.
pods, err := clientset.CoreV1().Pods(namespace.Name).List(metav1.ListOptions{FieldSelector: "spec.nodeName=" + name})
if err != nil {
println("%v", err)
}
for _, pod := range pods.Items {
fmt.Println(pod.Namespace, pod.Name)
}
}
}
return nil
}
我开始发现很多我需要问的问题对于 CLI 来说变得太复杂了,CLI 是一个很好的主力,但是学习使用 Go Client 可以帮助你得到第一个答案'正在寻找,但也更深入地挖掘这些答案提出的问题。