Как правильно составить список всех контейнеров в контейнере 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/


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")'

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


Примечание: очень краткие ответы и / или вопросы к постеру, вероятно, должны быть комментариями. Вам нужно всего 50 очков репутации, чтобы прокомментировать вопрос - не могли бы вы переместить это туда?
Tyler2P 07
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.