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
kubernetes
kubectl
Regnoult
fuente
fuente
Respuestas:
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>
fuente
--all-namespaces
primero 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?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
fuente
También puede consultar todos los pods y un nodo con el siguiente comando
kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
fuente
kubectl describe node <node>
mostrará todos los pods no terminados que se ejecutan en ese nodofuente
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
kubectl
aún no está integrada : https://github.com/kubernetes/kubernetes/pull/50140fuente
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.
fuente