3 minute read

Быстрый ответ №1:

export NAMESPACE="<NAMESPACE_NAME>"
kubectl get all -n &NAMESPACE

Быстрый ответ №2:

export NAMESPACE="<NAMESPACE_NAME>"
kubectl api-resources --verbs=list --namespaced -o name  | xargs -n 1 kubectl get --show-kind --ignore-not-found --no-headers -n $NAMESPACE

Почему get all не показывает ВСЕ ресурсы?

Как работают категории ресурсов в Kubernetes

Что на самом деле происходит, когда мы выполняем команду kubectl get all, и как Kubernetes воспринимает этот all?

В описании каждого ресурса (Custom Resource) в Kubernetes можно указать сцециальное поле - categories. Это поле используется для объеденения разных custom resource в единую группу. Делая запрос на получение этой группы(категории) мы получаем все ресурсы, связанные с этой категорией.

На примере Kyverno мы можем посмотреть, что в описании API своих ресурсов они используют category kyverno. (Например для ресурса clusterpolicy или updateRequest). При генерации манифестов CRD для таких типов появится поле category. Если у нас в кластере задеплоена Kyvern’а, то мы можем посмотреть ее CRD описание и увидеть это поле:

kubectl get crd clusterpolicies.kyverno.io -o yaml | grep "categories:" -A1
    categories:
    - kyverno

kubectl get crd updaterequest.kyverno.io -o yaml | grep "categories:" -A1
    categories:
    - kyverno

Получается, что наши CR объеденены в одну группу и мы можем выполнить такой запрос:

kubectl get kyverno -n kyverno
NAME                                                              BACKGROUND   VALIDATE ACTION   READY
clusterpolicy.kyverno.io/disallow-cap-audit-control               false        enforce           true
clusterpolicy.kyverno.io/disallow-cap-audit-read                  false        enforce           true
clusterpolicy.kyverno.io/disallow-cap-dac-read-search             false        enforce           true
clusterpolicy.kyverno.io/disallow-cap-net-admin                   false        enforce           true
...
...

NAME                                POLICY                 RULETYPE   RESOURCEKIND   RESOURCENAME           RESOURCENAMESPACE   STATUS      AGE
updaterequest.kyverno.io/ur-8qghh   generate-honeypot-sa   generate   Namespace      kubernetes-dashboard                       Completed   19d

Как мы видим, с помощью одного запроса мы получаем несколько ресурсов, которые логически связаны с одной категорией - Kyverno.

С Kyverno есть спорный момент на тему того, что запрашивая ресурсы конкретной категории (kyverno) в определенном namespace показываются ресурсы, которые не связаны с namespace (cluster scope). Но давайте оставим этот вопрос на совести разработчиком Kyverno

all - тоже категория ресурсов

Как мы уже поняли, что Kyverno - это категория ресурсов, объявленных в нашем кластере Kubernetes. Так вот all - то же самое.

All - это категория ресурсов, в которую по умолчанию входят:

  • pods
  • services
  • daemonsets
  • deployments
  • statefullsets
  • replicasets

Получается, что выполняя запрос

kubectl get all

Мы получаем список ресурсов, связанных с этой категорией.

Помимо прочего, разрабатывая собственный операторы и контроллеры мы можем для своих CRD указывать категорию all. Тогда наши ресурсы будут показываться при запросе kubectl get all. Есть даже правила, как это правильно делать.

Получаем список всех ресурсов

В Kubernetes все ресурсы делятся на 2 уровня. Ресурсы уровня “cluster” не связаны с каким-либо namespace (например, clusterrole, clusterrolebinding и т.д.). Ресурсы уровня “namespace”, которые всегда существуют в каком-то namespace. Если при определении такого ресурса namespace не указан, то ресурсы развернутся в namespace, который указан по умолчанию, чаще всего это default.

Для получения всех ресурсов в namespace нам сначала надо узнать какие вообще ресурсы уровня namespace существуют в кластере:

kubectl api-resources --verbs=list --namespaced -o name 

Команда kubectl api-resources показывает все ресурсы определенные в кластере, дефолтные и кастомные. Параметр --verbs=list указывает, что нам нужны только те ресурсы, которые можно получить с помощью запроса get через kubectl. Параметр --namespaced указывает, что нам нужны ресурсы уровня namespace, ну и параметр -o name нужен, чтобы вывести только имена ресурсов. На выходе получится что-то вроде:

configmaps
endpoints
events
limitranges
persistentvolumeclaims
pods
podtemplates
replicationcontrollers
resourcequotas
secrets
serviceaccounts
services
controllerrevisions.apps
daemonsets.apps
deployments.apps
replicasets.apps
statefulsets.apps
...
...

Получив этот список, нам нужно запросить каждый ресурс в искомом namespace. Для удобства можно указать несколько параметров: --show-kind - чтобы выдеть к какому kind принадлежит ресурс

--ignore-not-found - не выдавать ошибку, если такой ресурс не был найден в namespace

--no-headers - не писать хеадер, который пишется каждый раз, когда мы запрашиваем ресурсы

В итоге получится такая команда:

export NAMESPACE="<NAMESPACE_NAME>"
kubectl api-resources --verbs=list --namespaced -o name  | xargs -n 1 kubectl get --show-kind --ignore-not-found --no-headers -n $NAMESPACE

Если мы хотим получить список всех ресурсов уровня кластера, немного подредактировав, можно получить следующее:

kubectl api-resources --verbs=list --namespaced=false -o name  | xargs -n 1 kubectl get --show-kind --ignore-not-found --no-headers

На этом все. Вы прекрасны :)