Как вы можете перечислить все контейнеры в контейнере кубернете?
Я ищу список всех контейнеров в контейнере в script, который собирает журналы после запуска теста. kubectl describe pods -l k8s-app=kube-dns
возвращает много информации, но я просто ищу возврат, например:
etcd
kube2sky
skydns
Я не вижу простого способа форматирования вывода описания. Есть ли другая команда? (и, я думаю, худший случай всегда анализирует вывод описания).
Ответы
Ответ 1
Вы можете использовать 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/
Ответ 2
Ответ
kubectl get pods POD_NAME_HERE -o jsonpath='{.spec.containers[*].name}'
объяснение
Это получает объект JSON, представляющий модуль. Затем он использует kubectl JSONpath для извлечения имени каждого контейнера из модуля.
Ответ 3
Быстрый взломать, чтобы избежать создания запроса JSONpath для одного контейнера:
$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]
Ответ 4
если вы хотите, чтобы явный вывод из каких контейнеров из каждого Pod
kubectl get po -l k8s-app=kube-dns \
-o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name
Ответ 5
Если вы используете 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")'
Ответ 6
Я использую это для отображения версий изображений на стручках.
kubectl get pods -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{end}{end}' && printf '\n'
Это лишь небольшая модификация скрипта из здесь, с добавлением новой строки для запуска следующей команды консоли на новой линии, удаленные запятые в конце каждой строки и список только мои стручков, без обслуживания стручков (например --all-namespaces
варианта удалены).
Ответ 7
Я собрал некоторые идеи в следующее:
Простая строка:
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}'