API de Kubernetes: obtiene pods en nodos específicos


102

Mirando http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes , parece que es posible seleccionar un cierto rango de pods según las etiquetas. Pero en mi caso, quiero seleccionar todos los pods en un nodo, pero no quiero etiquetar cada pod en su nodo correspondiente.

¿Me falta algo en la documentación o simplemente no es posible seleccionar por nodo? Si lo hago:

kubectl --server="<SERVER>" --namespace=<NS> get pods -o wide | head
    NAME   READY     STATUS             RESTARTS   AGE       NODE

¿Se puede usar alguno de estos encabezados como selector? Si es así, ¿cómo hacerlo con kubectl bust? Lo más importante, ¿cómo hacerlo con la API?

Gracias por adelantado


Considere cambiar la respuesta aceptada, ya que la respuesta aceptada actual está obsoleta.
deiga

Respuestas:


174

Como se menciona en la respuesta aceptada, el PR ahora se fusiona y puede obtener pods por nodo de la siguiente manera:

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

8
Esta es la solución más elegante.
Sergiu Marsavela

Tengo una aclaración: esto --all-namespacesprimero extraerá todos los pods de todo el clúster y luego filtrará por nodo. ¿O simplemente va a extraer todos los pods de ese nodo sin extraer en gran medida todos los pods de espacios de nombres de todo el clúster?
AhmFM

98

Ejemplo de clasificación de pods por nodeName:

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

Ejemplo de obtención de pods en nodos mediante el filtro de etiquetas:

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

o por número de reinicios

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

Ejemplo de filtrado por nodeName usando la marca --template:

$ 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

Es interesante que sea posible ordenar por estos datos, pero lo único que se puede filtrar con el selector es lo que está en ".spec.selector".
Regnoult

Los filtros se ejecutan en el lado del servidor, la clasificación es en el lado del cliente
Tim Hockin

18

También puede consultar todos los pods y un nodo con el siguiente comando

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

1
use -a también con kubectl ----- kubectl get pods -a -o wide --all-namespaces | grep <YOUR-NODE>
Pawan Kumar

3
En realidad, se trata de consultar todos los pods (y luego filtrar en el cliente), lo que puede ser mucho más lento en clústeres grandes. La mejor solución sería la respuesta de @Kristofer.
Guilherme Garnier

14

kubectl describe node <node> mostrará todos los pods no terminados que se ejecutan en ese nodo


10

Lo que desea es compatible con el lado del servidor de la API de Kubernetes de esta manera:

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

Sin embargo, esa opción de selector de campo kubectlaún no está integrada : https://github.com/kubernetes/kubernetes/pull/50140


3
FYI Esto ahora se ha fusionado
deedubs

3

Pasé por el mismo proceso con Go Client y descubrió algunos atajos que está tomando la 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
}

Comencé a encontrar que muchas de las preguntas que necesito hacer se están volviendo demasiado complejas para la CLI, que es un gran caballo de batalla, pero aprender a usar Go Client puede ayudarlo a obtener la primera respuesta que está buscando, pero también profundice en las preguntas que surgen de esas respuestas.


2
Puede usar un espacio de nombres vacío para obtener pods en todos los espacios de nombres
dimm

Esta es la solución que me ayudó, no estoy seguro de por qué se votó en contra.
Ingytron
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.