Как правильно составить список всех контейнеров в контейнере kubernetes?

86

Я хочу перечислить все контейнеры в модуле в сценарии, который собирает журналы после запуска теста. kubectl describe pods -l k8s-app=kube-dnsвозвращает много информации, но я просто ищу возврат, например:

etcd
kube2sky
skydns

Я не вижу простого способа отформатировать вывод описания. Есть еще одна команда? (и я предполагаю, что в худшем случае всегда есть анализ вывода описания).

Чарльз Л.
источник

Ответы:

60

Вы можете использовать getи выбрать один из поддерживаемых выходных шаблонов с флагом --output( -o).

Взять, jsonpathк примеру, kubectl get pods -l k8s-app=kube-dns -o jsonpath={.items[*].spec.containers[*].name}дает вам etcd kube2sky skydns.

Другие поддерживаемые шаблоны вывода: go-template, go-template-file, jsonpath-file. См http://kubernetes.io/docs/user-guide/jsonpath/ для того, как использовать шаблон jsonpath. См. Https://golang.org/pkg/text/template/#pkg-overview, чтобы узнать, как использовать шаблон go.

Обновление: проверьте этот документ для других примеров команд для отображения изображений контейнеров: https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/

Janetkuo
источник
3
Если вы хотите увидеть вывод json, используйте kubectl get pods -o json.
janetkuo
22
Если вы работаете с конкретным модулем, команда будетkubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
Чарльз Л.
OP был для одной конкретной капсулы
Оливер
70

Ответ

kubectl get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'

Объяснение

Это получает объект JSON, представляющий модуль. Затем он использует JSONpath kubectl для извлечения имени каждого контейнера из модуля.

Кори Кляйн
источник
27

Быстрый прием, позволяющий избежать построения запроса JSONpath для отдельного модуля:

$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]
Борек Бернар
источник
Это именно то, что он говорит ... быстрый взлом. Действительно полезно :) Конечно, нельзя использовать в скриптах. Он обслуживает требование.
Rakesh N
Последний также дает оба containersиinit containers
Нео
@Neo Я не вижу init containersэтого на v1.18.8 :(
subtleseeker
11

Я собрал некоторые идеи в следующем:

Простая строка:

kubectl get po -o jsonpath='{range .items[*]}{"pod: "}{.metadata.name}{"\n"}{range .spec.containers[*]}{"\tname: "}{.name}{"\n\timage: "}{.image}{"\n"}{end}'

Разделить (для удобства чтения):

kubectl get po -o jsonpath='
    {range .items[*]}
    {"pod: "}
    {.metadata.name}
    {"\n"}{range .spec.containers[*]}
    {"\tname: "}
    {.name}
    {"\n\timage: "}
    {.image}
    {"\n"}
    {end}'
Шон
источник
@EzLo Я не уверен, что мне больше нравится однострочный формат. Я не фанат прокрутки.
Шон
вы можете показать обе альтернативы. Не стесняйтесь возвращаться, если хотите. Использование форматирования кода (CTRL + K) обычно лучше, чем цитата (CTRL + Q) из-за типографики для кода.
EzLo
Есть ли способ указать имя модуля для каждого контейнера в этом формате?
Сэм Томас
Чтобы избежать необходимости прокрутки и ручного поиска - перенаправьте его на lessили к vi: COMMAND | less илиvi<(COMMAND)
Сергей Смольников
прокрутка при переполнении стека @SergeySmolnikov
Шон
7

если вам нужен четкий вывод о том, какие контейнеры из каждого модуля

kubectl get po -l k8s-app=kube-dns \
   -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name
Гонгора
источник
2

Если вы используете в jsonкачестве выходного формата, kubectl getвы получите много информации о pod. С jsonподобными процессорами jqлегко выбрать или отфильтровать определенные части, которые вам интересны.

Чтобы вывести список контейнеров модуля, jqзапрос выглядит следующим образом:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq --raw-output '.items[].spec.containers[].name'

Если вы хотите увидеть все подробности об одном конкретном контейнере, попробуйте что-то вроде этого:

kubectl get --all-namespaces --selector k8s-app=kube-dns --output json pods \
  | jq '.items[].spec.containers[] | select(.name=="etcd")'
Webwurst
источник
1

Я использую это для отображения версий изображений на модулях.

kubectl get pods  -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{end}{end}' && printf '\n'

Это всего лишь небольшая модификация скрипта отсюда , с добавлением новой строки для запуска следующей консольной команды в новой строке, удалением запятых в конце каждой строки и перечислением только моих модулей без служебных модулей (например, --all-namespacesопция удалена).

Дмитрий Попов
источник
1

Чтобы просмотреть подробную информацию вместе с конфигурационными картами всех контейнеров в конкретном модуле, используйте эту команду: kubectl describe pod/<pod name> -n <namespace name>

Потерянный в море
источник
1

Используйте команду ниже:

kubectl get pods -o=custom-columns=PodName:.metadata.name,Containers:.spec.containers[*].name,Image:.spec.containers[*].image
Сандип Арора
источник
0

Используйте команду ниже, чтобы просмотреть всю информацию о конкретном модуле.

kubectl get pod <pod name> -n <namespace name> -o yaml
Рэндил Теннакун
источник
0

Самый простой способ узнать контейнеры в контейнере:

журналы kubectl -c -n

Srikanth Praveen
источник
Примечание: очень краткие ответы и / или вопросы к постеру, вероятно, должны быть комментариями. Вам нужно всего 50 очков репутации, чтобы прокомментировать вопрос - не могли бы вы переместить это туда?
Tyler2P 07