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

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

etcd
kube2sky
skydns

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



답변

( ) 플래그 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/


답변

대답

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

설명

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


답변

단일 포드에 대한 JSONpath 쿼리를 생성하지 않도록하는 빠른 해킹 :

$ kubectl logs mypod-123
a container name must be specified for pod mypod-123, choose one of: [etcd kubesky skydns]


답변

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

간단한 선 :

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}'


답변

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

kubectl get po -l k8s-app=kube-dns \
   -o=custom-columns=NAME:.metadata.name,CONTAINERS:.spec.containers[*].name


답변

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


답변

나는 이것을 사용하여 포드에 이미지 버전을 표시합니다.

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

그것은에서 스크립트의 단지 작은 수정의 여기 (예 : 서비스 포드 않고, 각 행의 마지막에 새로운 행에 다음 콘솔 명령을 제거 쉼표를 시작하는 새로운 라인을 추가하고 단지 내 포드를 목록으로 --all-namespaces옵션이 제거됩니다).