Список модулей для каждого пространства имен в kubernetes

#kubernetes

#kubernetes

Вопрос:

У меня есть несколько пространств имен в моем кластере, и мне нужен журнал, подобный:

 NAMESPACE            NAME                                          PODS  
MY_NAMESPACE         my_ns6446f67599-25g7f                         10   
  

Ответ №1:

Вы можете использовать --all-namespaces флаг для получения модулей.

 kubectl get pods --all-namespaces
  

Из вашего вывода похоже, что вы пытаетесь напечатать replicaset s, поскольку в выходных данных есть столбец подсчета модулей.

 kubectl get replicaset --all-namespaces
  

Если вы хотите ограничить результирующие столбцы, мы можем использовать --0 custom-columns= параметр, как показано ниже.

 $ kubectl get replicaset --all-namespaces -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,PODS:.status.replicas     
NAMESPACE            NAME                                          PODS  
MY_NAMESPACE         my_ns6446f67599-25g7f                         10  
  

Комментарии:

1. @RamonMedeiros — Вы упоминаете, что --all-namespaces это не работает в вашей среде? Можете ли вы поделиться двумя командами, которые вы используете сейчас, включая их выходные данные.

Ответ №2:

Вы также можете попробовать этот вариант:

 kubectl get pods --all-namespaces | awk '{print $1}' | sort | uniq -c | sort -k1 -n -r
  

Что даст:

 136 some-ns
133 kube-system
119 other-ns
  

Немного объясняя:

  • kubectl get pods --all-namespaces в первом столбце будут перечислены все модули с пространством имен.
  • awk { print $1 } будет «отфильтровывать» первый столбец, который является пространством имен
  • sort сортирует имена пространств имен в алфавитном порядке
  • uniq -c подсчитает, сколько раз появлялось каждое пространство имен, и агрегирует с количеством в качестве первого столбца (например 136 some-ns , означает, что some-ns оно появилось 136 раз).
  • sort -k1 -n -r этот модуль будет отсортирован от пространства имен, которое появилось больше всего (т. Е. Имело Больше Всего модулей), к тому, которое появилось меньше всего. -k1 означает, что я использую первый столбец для сортировки, -n я использую числовое сравнение -r и выполняю обратный порядок.

Комментарии:

1. Небольшое улучшение: добавление --no-headers в команду kubectl предотвратит NAMESPACE отображение в списке в качестве пространства имен. Последняя команда будет выглядеть так: kubectl get pods --no-headers --all-namespaces | awk '{print $1}' | sort | uniq -c | sort -k1 -n -r к сожалению, этот подход не вернет пустые пространства имен.

Ответ №3:

Это решение объединяет вывод json kubectl get pods и kubectl get namespaces для того, чтобы также отображать пространства имен, в которых не развернуты модули.

 kubectl get pods -o json --all-namespaces | jq --argjson ns "$(kubectl get namespaces -o json)" '.items | group_by(.metadata.namespace) | map({namespace: .[].metadata.namespace, count: . | length}) | .  = ($ns.items | map({namespace: .metadata.name, count: 0})) | unique_by(.namespace) | sort_by(.count)'
  

Решение предоставляет массив объектов json, отсортированных по количеству модулей в порядке возрастания, и может быть легко расширено для получения желаемого результата.

«Волшебство» происходит, когда мы добавляем содержимое $ns переменной, которая содержит пространства имен, в конец массива с count=0 . Эти записи будут отброшены, unique_by если пространство имен уже было найдено ранее, что означает, что оно содержит модули.

Примечание: решение основано на unique_by функции jq для отмены второго появления объекта с тем же значением ключа, которое, как и в документации, не предоставляется, но оно реализовано таким образом.