Глядя на http://kubernetes.io/docs/user-guide/labels/#selecting-sets-of-nodes, кажется, что можно выбрать определенный диапазон модулей на основе меток. Но в моем случае я хочу выбрать все модули на одном узле, но я не хочу маркировать каждый модуль на соответствующем узле.
Мне что-то не хватает в документации или просто невозможно выбрать по узлу? Если я сделаю:
kubectl --server="<SERVER>" --namespace=<NS> get pods -o wide | head
NAME READY STATUS RESTARTS AGE NODE
Можно ли использовать какой-либо из этих заголовков в качестве селектора? Если да, то как это сделать с помощью kubectl bust, самое главное, как это сделать с помощью API?
заранее спасибо
kubernetes
kubectl
Regnoult
источник
источник
Ответы:
Как упоминалось в принятом ответе, PR теперь объединен, и вы можете получить поды по узлам следующим образом:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
источник
--all-namespaces
сначала будут извлечены все модули из всего кластера, а затем он будет отфильтрован для узла? или он просто будет извлекать все модули только из этого узла, не сильно вытягивая все модули пространства имен из всего кластера?Пример сортировки модулей по имени узла:
kubectl get pods -o wide --sort-by="{.spec.nodeName}"
Пример получения подов на узлах с помощью фильтра меток:
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:
$ 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
источник
Вы также можете запросить все модули в узле с помощью следующей команды
kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
источник
kubectl describe node <node>
покажет все незавершенные модули, работающие на этом узлеисточник
То, что вы хотите, поддерживается на стороне сервера 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источник
Я прошел через тот же процесс с 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 }
Я начал обнаруживать, что многие вопросы, которые мне нужно задать, становятся слишком сложными для интерфейса командной строки, который является отличной рабочей лошадкой, но обучение использованию Go Client может помочь вам получить первый ответ, который вы ищете, но также углубитесь в вопросы, которые поднимают эти ответы.
источник