kubernetes 포드의 모든 컨테이너를 어떻게 깔끔하게 나열합니까?


82

테스트를 실행 한 후 로그를 수집하는 스크립트의 포드에있는 모든 컨테이너를 나열하려고합니다. kubectl describe pods -l k8s-app=kube-dns많은 정보를 반환하지만 다음과 같은 반환을 찾고 있습니다.

etcd
kube2sky
skydns

설명 출력을 형식화하는 간단한 방법이 보이지 않습니다. 다른 명령이 있습니까? (그리고 최악의 경우는 항상 describe의 출력을 구문 분석하는 것입니다).

답변:


58

( ) 플래그 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입니다. jsonpath 템플릿을 사용하는 방법 은 http://kubernetes.io/docs/user-guide/jsonpath/ 를 참조하십시오 . go 템플릿 사용 방법 은 https://golang.org/pkg/text/template/#pkg-overview 를 참조 하세요 .

업데이트 : 컨테이너 이미지를 나열하는 다른 예제 명령은이 문서를 확인하십시오. https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/


3
json 출력을 보려면 kubectl get pods -o json.
janetkuo

19
특정 포드와 함께 작업하는 경우, 명령은kubectl get pods kube-dns-q2oh6 -o jsonpath={.spec.containers[*].name}
찰스 L.

66

대답

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

설명

포드를 나타내는 JSON 개체를 가져옵니다. 그런 다음 kubectl의 JSONpath 를 사용하여 포드에서 각 컨테이너의 이름을 추출합니다.


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

@Neo 나는 v1.18.8 init containers에서 이런 식으로 보지 않는다 :(
subtleseeker

10

몇 가지 아이디어를 다음과 같이 정리했습니다.

간단한 선 :

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 한 줄 형식을 더 좋아하는지 잘 모르겠습니다. 스크롤해야하는 팬이 아닙니다.
Shawn

두 가지 대안을 모두 표시 할 수 있습니다. 원하는 경우 다시 변경하십시오. 코드 형식화 (CTRL + K)를 사용하는 것이 일반적으로 코드의 입력 체계 때문에 따옴표 (CTRL + Q)보다 낫습니다.
EzLo

이 형식으로 각 컨테이너에 대해 포드 이름을 나열 할 수있는 방법이 있습니까?
Sam Thomas

스크롤 및 수동 검색이 필요하지 않도록하려면 다음 주소 less로 연결하십시오 vi. COMMAND | less 또는vi<(COMMAND)
Sergey Smolnikov

@SergeySmolnikov 스택 오버플로에서 스크롤
Shawn

7

각 Pod의 컨테이너에 대한 명확한 출력을 원하는 경우

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옵션이 제거됩니다).


0

아래 명령을 사용하여 특정 포드의 모든 정보를 확인하십시오.

kubectl get pod <pod name> -n <namespace name> -o yaml

0

특정 포드에있는 모든 컨테이너의 구성 맵과 함께 자세한 정보를 보려면 다음 명령어를 사용하세요. kubectl describe pod/<pod name> -n <namespace name>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.