Як ви чітко перелічуєте всі контейнери в стручку кубернету?


87

Я прагну перерахувати всі контейнери в pod в сценарії, який збирає журнали після запуску тесту. kubectl describe pods -l k8s-app=kube-dnsповертає багато інформації, але я просто шукаю повернення, як:

etcd
kube2sky
skydns

Я не бачу простого способу форматування результату опису. Чи є інша команда? (і, мабуть, найгірший випадок завжди є синтаксичний аналіз результату descri).

Відповіді:


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 був призначений для одного конкретного стручка
Олівер

71

Відповідь

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]

Ця відповідь - саме те, що там сказано .. швидкий хак. Дійсно корисно :) Звичайно, це не можна використовувати в сценаріях. Це відповідає вимозі.
Ракеш N,

Останній також дає обидва containersіinit containers
Нео

@Neo Я не бачу init containersцього шляху у версії 1.18.8 :(
витончений шукач

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
Shawn

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.