Продвинутые методы kubectl get: фильтрация вывода с помощью меток и JSONPath

Фильтруйте вывод kubectl get с помощью селекторов меток, JSONPath и пользовательских столбцов для более чистого устранения неполадок в Kubernetes.

Продвинутые методы kubectl get: фильтрация вывода с помощью меток и JSONPath

kubectl get становится гораздо полезнее, когда вы можете сузить вывод до точных ресурсов и полей, которые вам нужны. В загруженном пространстве имен разница между стеной подов и сфокусированным списком имен, узлов и образов может сэкономить минуты во время инцидента.

Это руководство показывает, как комбинировать селекторы меток с выводом JSONPath. Вы также увидите, когда custom-columns или jq подходят лучше, чем попытка втиснуть все в одно выражение JSONPath.

Понимание меток Kubernetes: основа выбора ресурсов

Прежде чем углубляться в продвинутую фильтрацию, крайне важно понять метки Kubernetes. Метки — это пары ключ-значение, прикрепленные к объектам Kubernetes (таким как Pods, Services, Deployments и т.д.), которые используются для идентификации и организации ресурсов. Это метаданные, которые клиенты и пользователи могут использовать для выбора подмножеств объектов.

Метки отличаются от аннотаций; метки предназначены для идентификации характеристик, которые имеют значение и актуальны для пользователей при запросе и выборе объектов, в то время как аннотации предназначены для неидентифицирующих метаданных. Хорошие практики использования меток необходимы для эффективного управления ресурсами и продвинутых операций kubectl get.

Чтобы увидеть метки, назначенные вашим ресурсам, вы можете использовать флаг --show-labels:

kubectl get pods --show-labels

Это добавит столбец LABELS в ваш вывод, показывая все метки, связанные с каждым Pod.

Продвинутые селекторы меток с kubectl get -l

Флаг -l или --selector — ваш основной инструмент для фильтрации вывода kubectl get на основе меток. Он позволяет указать набор требований к меткам, которым должны соответствовать ресурсы, чтобы быть включенными в вывод. Селекторы могут быть простыми парами ключ-значение или более сложными выражениями на основе множеств.

Базовый выбор меток

Точное совпадение

Чтобы выбрать ресурсы, имеющие определенную метку с точным значением, используйте синтаксис key=value.

# Получить все поды с меткой 'app', установленной в 'nginx'
kubectl get pods -l app=nginx

# Получить все сервисы в пространстве имен 'default' с меткой 'tier', установленной в 'frontend'
kubectl get services -n default -l tier=frontend

Неравенство

Чтобы выбрать ресурсы, имеющие определенную метку не установленную в конкретное значение, используйте синтаксис key!=value.

# Получить все поды, где метка 'app' не равна 'nginx'
kubectl get pods -l app!=nginx

Существование (только ключ)

Чтобы выбрать ресурсы, которые просто имеют определенную метку, независимо от ее значения, просто укажите key.

# Получить все поды, имеющие метку 'environment', независимо от ее значения
kubectl get pods -l environment

Отсутствие (только ключ)

Чтобы выбрать ресурсы, которые не имеют определенной метки, добавьте префикс ! к key.

# Получить все поды, у которых НЕТ метки 'component'
kubectl get pods -l !component

Комбинирование нескольких селекторов меток (логика И)

Вы можете комбинировать несколько селекторов меток, разделяя их запятой. Это подразумевает отношение И, то есть ресурс должен удовлетворять всем указанным условиям меток, чтобы быть включенным.

# Получить поды с 'app=nginx' И 'env=production'
kubectl get pods -l app=nginx,env=production

# Получить развертывания с 'tier=backend' И которые НЕ имеют метки 'version'
kubectl get deployments -l tier=backend,!version

Селекторы меток на основе множеств

Kubernetes также поддерживает более мощные селекторы меток на основе множеств, которые особенно полезны при работе с несколькими возможными значениями для одной метки.

key in (value1, value2, ...)

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

# Получить поды, где метка 'app' равна 'nginx' ИЛИ 'redis'
kubectl get pods -l 'app in (nginx,redis)'

# Получить сервисы в пространстве имен 'kube-system', где метка 'k8s-app' равна 'kube-dns' ИЛИ 'kubernetes-dashboard'
kubectl get services -n kube-system -l 'k8s-app in (kube-dns,kubernetes-dashboard)'

key notin (value1, value2, ...)

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

# Получить поды, где метка 'env' НЕ равна 'dev' И 'test'
kubectl get pods -l 'env notin (dev,test)'

Совет: При использовании селекторов на основе множеств или селекторов со специальными символами всегда заключайте все выражение селектора в одинарные кавычки ('...'), чтобы избежать проблем с интерпретацией оболочкой.

Лучшие практики маркировки

  • Согласованность: Установите четкую схему маркировки и придерживайтесь ее во всем кластере. Это делает фильтрацию предсказуемой и надежной.
  • Осмысленные имена: Используйте метки, которые четко описывают характеристики ресурса (например, app, tier, environment, version).
  • Детализация: Метки должны быть достаточно конкретными, чтобы обеспечить точный выбор, но не настолько детальными, чтобы стать неуправляемыми.
  • Неизменность: Избегайте использования меток для данных, которые часто меняются. Метки лучше всего подходят для статических идентифицирующих свойств.
  • Общие метки: Используйте широко распространенные метки, такие как app.kubernetes.io/name, app.kubernetes.io/instance, app.kubernetes.io/version и т.д., для лучшей совместимости с инструментами.

Извлечение пользовательских данных с помощью JSONPath

В то время как селекторы меток помогают вам определить какие ресурсы вам нужны, JSONPath помогает вам определить какую информацию вы хотите извлечь из этих ресурсов и как она должна быть отформатирована. kubectl get позволяет выводить детали ресурсов в различных форматах, таких как yaml, json и wide; -o jsonpath полезен, когда вам нужен компактный пользовательский вывод.

kubectl имеет собственную реализацию JSONPath для навигации по JSON-структуре объектов Kubernetes. Она поддерживает полезный текст шаблона и циклы range, но это не то же самое, что шаблоны Go или jq.

Чтобы использовать JSONPath, укажите формат вывода с помощью -o jsonpath='<template>'.

Основы JSONPath и распространенные случаи использования

Сначала часто полезно просмотреть полный JSON-вывод ресурса, чтобы понять его структуру, прежде чем писать выражение JSONPath:

# Получить полную JSON-структуру пода
kubectl get pod <pod-name> -o json

Это даст вам четкую карту для построения ваших запросов JSONPath.

Доступ к одному полю

Используйте {.field.subfield} для доступа к конкретным значениям. Например, чтобы получить имя пода:

# Получить имя конкретного пода
kubectl get pod my-nginx-pod-12345 -o jsonpath='{.metadata.name}'

# Получить имя узла, на котором работает под
kubectl get pod my-nginx-pod-12345 -o jsonpath='{.spec.nodeName}'

Доступ к элементам массива

Для доступа к элементам внутри массива вы можете использовать [*] для итерации по всем элементам или [index] для конкретного.

# Получить имена всех контейнеров в конкретном поде
kubectl get pod my-nginx-pod-12345 -o jsonpath='{.spec.containers[*].name}'

# Получить образ первого контейнера в конкретном поде
kubectl get pod my-nginx-pod-12345 -o jsonpath='{.spec.containers[0].image}'

Итерация по списку ресурсов (с помощью range)

Когда kubectl get возвращает несколько ресурсов (например, все поды), вывод обычно представляет собой объект, содержащий массив items. Вам понадобится функция шаблона Go range для итерации по ним.

# Вывести все имена подов и их IP-адреса, каждый на новой строке
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'

# Вывести все имена развертываний и количество готовых реплик
kubectl get deployments -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.readyReplicas}{"\n"}{end}'
  • {range .items[*]}: Начинает итерацию по каждому элементу в массиве .items.
  • {.metadata.name}: Внутри цикла . относится к текущему элементу (например, к одному объекту Pod).
  • {"\t"}: Вставляет символ табуляции для форматирования.
  • {"\n"}: Вставляет символ новой строки.
  • {end}: Закрывает цикл range.

Условный вывод: используйте вместо этого шаблоны Go

kubectl -o jsonpath не поддерживает блоки шаблонов Go if, with или else. Если вам нужен условный рендеринг, переключитесь на -o go-template:

# Вывести имена подов и напечатать N/A, когда podIP пуст
kubectl get pods -o go-template='{{range .items}}{{.metadata.name}}{{"\t"}}{{if .status.podIP}}{{.status.podIP}}{{else}}N/A{{end}}{{"\n"}}{{end}}'

Для безусловного вывода JSONPath короче:

kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'

Пользовательское форматирование и заголовок

Вы можете добавить свой собственный статический текст и создать заголовок для вывода в виде таблицы.

# Пользовательский вывод для имен подов, образов и узла с заголовком
kubectl get pods -o=jsonpath='{"NAME\tIMAGE\tNODE\n"}{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\t"}{.spec.nodeName}{"\n"}{end}'

Предупреждение: kubectl имеет собственную реализацию JSONPath. Она полезна для извлечения полей и циклов range, но это не то же самое, что jq, и не поддерживает все функции JSONPath, которые вы можете знать из других инструментов.

Советы по JSONPath

  • Начинайте с простого: Начните с базового пути, затем добавляйте больше сложности.
  • Проверяйте JSON: Всегда используйте kubectl get <resource> <name> -o json, чтобы понять точную структуру, которую вы запрашиваете.
  • Экранируйте символы: Не забывайте экранировать специальные символы, такие как новые строки (\n) и табуляции (\t), внутри строки шаблона JSONPath, если вы хотите, чтобы они отображались как литералы в выводе.
  • Сохраняйте шаблоны: Для сложных или часто используемых выражений JSONPath сохраняйте их в файл и используйте -o jsonpath-file=/path/to/template.jsonpath.

Комбинирование меток и JSONPath

Настоящая сила заключается в комбинировании этих методов. Сначала используйте селекторы меток, чтобы сузить круг ресурсов, а затем примените JSONPath для извлечения и форматирования конкретных данных из этого отфильтрованного набора.

# Получить имена и образы контейнеров всех подов с 'app=my-app' и 'env=production'
kubectl get pods -l 'app=my-app,env=production' -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[*].image}{"\n"}{end}'

# Получить имена и IP-адреса кластера всех сервисов, у которых метка 'tier' установлена в 'backend'
kubectl get services -l tier=backend -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.clusterIP}{"\n"}{end}'

# Найти все поды, работающие на конкретном узле 'worker-node-1', и вывести их имена и статусы
kubectl get pods --field-selector spec.nodeName=worker-node-1 -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.phase}{"\n"}{end}'

Примечание: В то время как селекторы меток (-l) предназначены для произвольных пар ключ-значение, kubectl также предлагает --field-selector для фильтрации на основе полей ресурса (например, status.phase=Running, metadata.namespace=default). Это обеспечивает еще один мощный уровень фильтрации, который можно комбинировать как с метками, так и с JSONPath.

Устранение неполадок и распространенные ошибки

  • Синтаксические ошибки JSONPath: Даже небольшая опечатка может сломать шаблон. Дважды проверяйте фигурные скобки, точки и доступ к массивам.
  • Отсутствующие поля: Если поле не существует для конкретного ресурса, JSONPath может вывести <no value> или пустую строку. Используйте конструкции шаблонов Go if или with, чтобы корректно обрабатывать такие случаи.
  • Экранирование оболочки: Одинарные кавычки вокруг выражения JSONPath имеют решающее значение. Если ваше выражение содержит внутренние кавычки или специальные символы, вам может потребоваться дополнительное экранирование оболочки.
  • Шаблон Go против чистого JSONPath: Помните, что kubectl использует шаблоны Go, а не универсальный движок JSONPath. Такие функции, как расширенная фильтрация (?()), обычно являются частью jq или других специализированных процессоров JSON и не поддерживаются напрямую в -o jsonpath от kubectl.
  • Пустой массив items: Если ваш селектор меток не соответствует ни одному ресурсу, items будет пустым, и ваш цикл range не выдаст никакого вывода.

Вывод

Освоение продвинутых методов kubectl get с селекторами меток и JSONPath — бесценный навык для любого пользователя Kubernetes. Эти мощные возможности фильтрации и форматирования превращают kubectl get из простого инструмента списка в сложную утилиту извлечения данных. Вы можете быстро выявить проблемные ресурсы, создавать пользовательские отчеты или передавать точные данные в скрипты автоматизации.

Используйте метки для выбора ресурсов, затем выберите самый простой формат вывода, который дает вам необходимые поля. JSONPath отлично подходит для компактного извлечения, custom-columns проще для быстрых таблиц, а jq или шаблоны Go лучше, когда вывод требует реальной логики.