логотип PurpleSchool
логотип PurpleSchool

Поиск ресурсов с помощью Find в Kubernetes

Автор

Олег Марков

Введение

В Kubernetes основная работа с ресурсами ведётся через kubectl — стандартную консольную утилиту. Когда кластер становится крупнее, вам всё чаще приходится искать нужный объект среди множества других. Находить поды, сервисы, деплойменты и другие ресурсы только по их именам зачастую неудобно или невозможно. Особенно если вы работаете в мультикомандном окружении или у вас сотни объектов.

В этой статье я покажу вам полезные приёмы поиска ресурсов в Kubernetes. Мы разберём, чем отличается поиск через стандартные kubectl get и describe от фильтрации с помощью label и field selectors, научимся пользоваться jq, grep, bash-командами, к примеру, find, а также рассмотрим сторонние инструменты и плагины. Я добавлю живые примеры и объяснения, чтобы вам было проще применять всё на практике.

Поиск ресурсов в Kubernetes: подходы и инструменты

Основные механизмы поиска

Kubernetes не содержит отдельной консольной команды find, как, например, в Linux. Здесь основное средство поиска — фильтрация с помощью селекторов, шаблонов и дополнительных команд обработки вывода. Я расскажу, как это работает.

Использование kubectl для поиска

Первое, что приходит на ум — использовать kubectl get с различными опциями. Вот базовый пример:

kubectl get pods
# Выводит все поды в текущем namespace

Но если ресурсов много, лучше использовать фильтрацию.

Фильтрация по label selector

Labels в Kubernetes — это ключевой способ помечать и легко находить ресурсы. Они удобны, когда вы ищете объекты, связанные с одной задачей, приложением или окружением.

Смотрите, как искать по label:

kubectl get pods -l app=frontend
# Показывает только те поды, у которых label app=frontend

Label selectors поддерживают логические операции:

kubectl get pods -l 'env in (dev,prod)'
# Найдёт все поды с label env=dev или env=prod
kubectl get pods -l 'tier!=backend'
# Поды, у которых label tier не равен backend

Вы также можете комбинировать несколько условий:

kubectl get pods -l 'app=frontend,env=prod'
# Поды, у которых оба label одновременно

Поиск по field selector

Field selectors позволяют фильтровать объекты по значениям стандартных полей.

Например, поиск по имени:

kubectl get pods --field-selector metadata.name=my-pod
# Найти под c конкретным именем

Поиск по статусу:

kubectl get pods --field-selector status.phase=Running
# Найти все поды в статусе Running

Важно: синтаксис field selectors ограничен определённым списком полей, который отличается для разных типов ресурсов. Например, не все поля можно использовать.

Использование шаблонов вывода и grep для поиска по тексту

Иногда удобнее искать объект по части названия или содержимого. Тогда пригодятся стандартные инструменты командной строки.

Посмотрите на этот пример:

kubectl get pods --all-namespaces | grep 'frontend'
# Ищет поды с именем, содержащим слово frontend среди всех неймспейсов

Здесь вы используете вывод kubectl как обычный текстовый поток и фильтруете знакомым способом.

Если нужно достать конкретное поле:

kubectl get pods -o custom-columns=NAME:.metadata.name | grep 'api'
# Находит все поды, имя которых содержит 'api'

А вот так можно получить UID ресурса по части имени:

kubectl get pods -o json | jq '.items[] | select(.metadata.name | contains("my-app")) | .metadata.uid'
# Используем jq для разбора JSON-вывода

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

По умолчанию kubectl работает только с текущим namespace. Если хотите искать глобально, используйте ключ --all-namespaces:

kubectl get pods --all-namespaces

А дальше можете применять и label, и field selectors, и дополнительные фильтры:

kubectl get services --all-namespaces -l team=devops

Найти все ресурсы: advanced find

Вам может понадобиться найти не конкретный pod или service, а все ресурсы, в которых встречается определённое слово или label. Такое бывает при миграции, разборе чужого кластера или аудите.

Просмотр всех объектов текущего namespace

kubectl get all
# Покажет все основные типы ресурсов: pods, services, deployments и т.д.

Список всех ресурсов всех типов

Вот как получить вообще всё:

kubectl api-resources --verbs=list --namespaced -o name \
  | xargs -n 1 kubectl get --show-kind --ignore-not-found
# Показывает все ресурсы, учитывает, являются ли они пространственными или глобальными

В этом примере берём все ресурсы, поддерживающие list, и последовательно выводим их, если они есть.

Обратите внимание: этот способ выводит много информации, будьте готовы фильтровать.

Поиск по аннотациям, ownerReference, labels внутри описания

Иногда бывает важно найти ресурсы, имеющие определённую аннотацию или находящиеся "под управлением" другого ресурса.

kubectl get pods -o json | jq '.items[] | select(.metadata.annotations."annotation-key" == "value") | .metadata.name'
# Найти поды с определённой аннотацией

OwnerReferences:

kubectl get pods -o json | jq '.items[] | select(.metadata.ownerReferences[]? | .kind == "ReplicaSet") | .metadata.name'
# Найти поды, подчинённые ReplicaSet

Сторонние плагины и инструменты для поиска

Для расширения возможностей поиска существуют дополнительные инструменты:

krew и плагины для kubectl

krew — это менеджер плагинов для kubectl. С его помощью можно установить расширения, делающие поиск удобнее.

Например: плагин kubectl-fuzzy:

kubectl krew install fuzzy
kubectl fuzzy get pods
# Позволяет искать поды с интерактивным fuzzy search

kubens и kubectx

Эти плагины упрощают переключение между namespace'ами и контекстами — полезно, если вы ищете ресурсы в разных окружениях.

Использование stern для поиска по логам

Если ваша цель — найти ресурс по определённой строке в логах, используйте stern:

stern "frontend"
# Показывает логи всех подов, имя которых удовлетворяет "frontend"

Поиск по связям между ресурсами

Часто бывает нужно найти цепочку ресурсов. Например, определить, какой Deployment создал под, или к какому сервису привязан endpoint.

Выясняем чей это pod

kubectl get pod my-pod -o jsonpath="{.metadata.ownerReferences}"
# Показывает, кто 'владелец' пода (например, ReplicaSet)

Поиск по связанному сервису

kubectl get endpoints my-service
# Показывает ресурсы (обычно поды), на которые указывает сервис

Или в связке со списком подов:

kubectl get endpoints my-service -o json | jq '.subsets[].addresses[].targetRef.name'

Быстрый поиск "висячих" ресурсов ("orphans")

Если вы хотите найти ресурсы, которые не имеют связанных объектов (например, PVC без PV или наоборот), придётся комбинировать несколько команд и фильтровать результаты.

Пример:

kubectl get pvc --all-namespaces -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name,VOLUME:.spec.volumeName'
kubectl get pv
# Сопоставляете руками или с помощью скрипта, какие PVC "висят" без PV

Более гибкая фильтрация: Advanced Bash + kubectl

Если стандартных возможностей недостаточно, комбинируйте вывод kubectl с awk, sed, jq и другими инструментами bash.

Например, поиск всех деплойментов, которые используют образ nginx:

kubectl get deployments --all-namespaces -o json \
  | jq -r '.items[] | select(.spec.template.spec.containers[]?.image | test("nginx")) | .metadata.name'
# Выведет имена деплойментов, где встречается образ nginx

Здесь мы разбираем JSON-вывод, ищем нужную строку и выводим конкретные поля. Такой подход универсален для почти любых задач поиска и аудита.

Поиск с помощью UI-интерфейсов

Если вы пользуетесь веб-интерфейсом, например, Kubernetes Dashboard, Rancher, Lens или OpenLens, поиск осуществляется через поиск и фильтры по типу ресурса и меткам. Такой подход визуален, не требует дополнительных команд, но не пригоден для автоматизации или сложных фильтров.

Практические рецепты поиска

Найти все ресурсы с конкретным label во всех namespace

kubectl get all --all-namespaces -l app=backend

Поиск деплойментов по части имени

kubectl get deployments --all-namespaces | grep 'api'

Найти все сервисы, не имеющие селекторов (headless/misc)

kubectl get svc --all-namespaces -o json \
  | jq -r '.items[] | select(.spec.selector == null) | .metadata.name'

Поиск ресурсов по дате создания

kubectl get pods --sort-by=.metadata.creationTimestamp
# Сортирует поды по времени создания

Можно искать "старыми" командами, анализируя вывод:

kubectl get pods --all-namespaces -o=custom-columns=NAME:.metadata.name,CREATED:.metadata.creationTimestamp

Ошибки и ловушки при поиске ресурсов

  • По умолчанию kubectl ищет только в текущем namespace. Не забывайте про --all-namespaces, если требуется глобальный поиск.
  • Label и field selectors чувствительны к синтаксису.
  • Не все ресурсы поддерживают field selectors — это ограничено документацией.
  • Если ресурсов слишком много, сочетайте kubectl с фильтрацией bash-утилитами.
  • Контролируйте права доступа: если у пользователя нет необходимых разрешений, он не увидит часть ресурсов.

Заключение

Поиск ресурсов в Kubernetes — это не отдельная команда, а совокупность возможностей kubectl и сторонних инструментов. Основные приёмы — использование label и field selectors, фильтрация по output и комбинирование kubectl с инструментами Bash, jq, grep и плагинами. Чем лучше вы понимаете организацию ресурсов и их связи между собой, тем эффективнее ваши поисковые запросы и тем меньше времени уходит на аудит кластера или решение инцидентов.

Kubernetes предоставляет универсальные, но не всегда интуитивные инструменты для поиска. Совмещайте стандартные команды с расширениями и автоматизируйте рутинные действия — это сделает вашу работу заметно проще и продуктивнее.

Частозадаваемые технические вопросы по теме статьи и ответы на них

1. Как найти все ресурсы определённого типа не только в текущем namespace, но и в кластере целиком?

Используйте ключ --all-namespaces:

kubectl get pod --all-namespaces
# или для любого другого типа:
kubectl get deployment --all-namespaces

2. Как узнать, к какому namespace относится найденный ресурс?

Добавьте к команде опцию custom-columns:

kubectl get pods --all-namespaces -o custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name'

3. Как быстро найти, используется ли определённый Docker image в каком-либо pod или deployment?

Для pod:

kubectl get pods --all-namespaces -o json | jq -r '.items[] | select(.spec.containers[].image | test("nginx")) | .metadata.name'

Для deployment — аналогично, только используйте kubectl get deployments.

4. Как найти все ресурсы без определённого label?

Возможностью отрицания в селекторах: ```bash kubectl get pods -l '!app'

Покажет все поды без label 'app'

Для более сложных условий комбинируйте jq или grep.

**5. Как получить YAML определённого ресурса после поиска его с помощью label selector?**

Сначала определите имя ресурса, затем используйте его для вывода YAML:
bash kubectl get pod -l app=frontend -o yaml # Для нескольких: указывайте имена через пробел или используйте xargs

```

Стрелочка влевоУправление и мониторинг KubernetesМониторинг Kubernetes с GrafanaСтрелочка вправо

Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!

Kubernetes — часть карты развития DevOps

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Kubernetes

Terraform и Kubernetes инфраструктура как кодНастройка и использование Runners в KubernetesНастройка и деплой PostgreSQL в KubernetesСравнение и интеграция Openshift и KubernetesПримеры интеграции GitHub Actions и KubernetesDeploy приложений в Kubernetes - пошаговое руководство для начинающих и не толькоКак настроить CD в KubernetesИнтеграция Ansible в KubernetesИнтеграция CI/CD с Jenkins и KubernetesИнтеграция Kubernetes с GitLab - Автоматизация CI CD в облачной инфраструктуреГайд по DevOps инструментам в KubernetesОсобенности платформы Deckhouse в Kubernetes
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Kubernetes и Helm

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Микросервисы

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий