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

Regnoult
fuente
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>
Kristofer
fuente
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
Camil
fuente
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>
Mal
fuente
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

Matt Hamann
fuente
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

coreypobrien
fuente
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.

Raza
fuente
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