Kubernetes API - получает блоки на определенных узлах
Если посмотреть на 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?
заранее спасибо
Ответы
Ответ 1
То, что вы хотите, поддерживается на стороне сервера 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
Ответ 2
Пример сортировки контейнеров по имени nodeName:
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}"
Пример фильтрации с помощью nodeName с использованием флага --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
Ответ 3
Как уже упоминалось в принятом ответе, PR теперь объединен, и вы можете получать пакеты по узлам следующим образом:
kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=<node>
Ответ 4
Вы также можете запросить для всех контейнеров узел со следующей командой
kubectl get pods -o wide --all-namespaces | grep <YOUR-NODE>
Ответ 5
kubectl describe node <node>
покажет все неиспользуемые контейнеры, запущенные на этом узле
Ответ 6
Я прошел через тот же процесс с 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, который является отличной рабочей лошадкой, но изучение использования Go Client может помочь вам получить первый ответ, который вы ищете, но также углубиться в вопросы, которые поднимают эти ответы.