Kubernetes 복제 컨트롤러의 모든 포드에서 로그를 가져 오려면 어떻게해야합니까?


123

실행 kubectl logs하면 Kubernetes 컨테이너 하나의 stderr / stdout이 표시됩니다.

가급적 특정 복제 컨트롤러에 의해 생성 된 포드 집합의 집계 된 stderr / stdout을 얻으려면 어떻게해야합니까?


염두에두고 그 선택기를 사용하여 10 선 길이로 모든 포드 로그를 기본 때 꼬리 인수를 설정하지 않는
chachan

답변:


175

레이블을 사용할 수 있습니다.

kubectl logs -l app=elasticsearch

21
좋은 솔루션이고 원래 질문에 답할 수있을만큼 충분히 가능하지만 "오류 : 따르기 (-f) 또는 선택기 (-l) 중 하나만 허용됩니다."
Nestor Urquiza

3
또한 --all-namespaces.
Eric Walker

로그의 순서는 무엇입니까? 즉, 여러 포드가 있고 각 포드에 자체 로그가 있습니다. 따라서 모든 로그가 표시되면 어떤 순서로 표시되며 특정 로그 라인의 소스 포드를 어떻게 식별합니까?
Shubham

6
이것이 현재 작동하는 것처럼 보입니다 -f(Kubernetes 1.12+ / kubectl1.12+ 기준). 또한 @Shubham-수신 된 순서대로 메시지를 표시하며 로그 라인에 태그 나 아무것도 없습니다. 이것은 빠른 디버깅을위한 것입니다. 더 로그 세부 사항이 필요한 경우 등 EFK, SumoLogic, Datadog 같은 중앙 로깅 시스템에 로그를 제공해야합니다
geerlingguy

1
어쨌든 kubernetes 대시 보드를 사용하여 동일한 작업을 수행 할 수 있습니까?
mchawre

70

kubetail이것을 가능하게 하는 작은 bash 스크립트를 만들었습니다 . 예를 들어 "app1"이라는 포드의 모든 로그를 테일링하려면 다음을 수행 할 수 있습니다.

kubetail app1

여기 에서 스크립트를 찾을 수 있습니다 .


다음과 함께 설치 : brew tap johanhaleby/kubetail && brew install kubetail --with-short-names자세한 문서 : kt -h훌륭합니다!
Khalil Gharbaoui

대박. 몇 가지 질문이 있습니다. ```1. 다른 배포에 속하는 여러 포드의 로그를 추적 할 수 있습니까? "kt -l app = service1, app = service2"와 같은 것입니다. 2. 어떻게 그들을 파일에 모두 쓰나요? "kt -l app = service1` >> filename.log"를 수행하면 포드 이름 만 기록됩니다. 3. 자동 확장 배포의 경우에도 뒤 따르나요? ```
Vasudev

19

Adrian Ng가 제안한대로 레이블을 사용하여 여러 컨테이너에서 로그를 가져올 수 있습니다.

kubectl logs --selector app=yourappname

컨테이너가 여러 개인 포드가있는 경우 위 명령이 실패하고 컨테이너 이름을 지정해야합니다.

kubectl logs --selector app=yourappname --container yourcontainername

참고 : 사용할 수있는 레이블을 확인하려면 다음 명령을 사용하여 모두 나열합니다.

kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'

... 출력은 다음과 같이 보일 것입니다.

map [app : yourappname controller-revision-hash : 598302898 pod-template-generation : 1]

일부 라벨은 다른 포드에서 공유 할 수 없습니다. "앱"을 선택하는 것이 가장 쉬운 것 같습니다.


13

추가 -f하면 이전 답변을 바탕으로 로그를 추적 할 수 있습니다.

kubectl logs -f deployment/app

10

이전에 제공된 솔루션은 최적이 아닙니다. kubernetes 팀 자체는 얼마 전에 stern이라는 솔루션을 제공했습니다.

stern app1

또한 정규식과 일치하며 기본적으로 tail 및 -f (follow)를 수행합니다. 좋은 이점은 로그를 생성 한 포드도 표시된다는 것입니다.

app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2

Linux 용 go-binary를 가져 오거나 OSX 용 brew를 통해 설치합니다.

https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/

https://github.com/wercker/stern


6

이 간단한 스크립트를 사용하여 배포 포드에서 로그를 가져옵니다.

#!/usr/bin/env bash

DEPLOYMENT=$1

for p in $(kubectl get pods | grep ^${DEPLOYMENT}- | cut -f 1 -d ' '); do 
    echo --------------------------- 
    echo $p 
    echo --------------------------- 
    kubectl logs $p
done

대본의 요점

사용법 : log_deployment.sh "deployment-name".

그러면 스크립트는 해당 "배포 이름"으로 시작하는 모든 포드의 로그를 표시합니다.



4

kubectl logs -h정보에 따라 도움을받을 수 있습니다 .

kubectl logs -f deployment/myapp -c myapp --tail 100

-c컨테이너 이름이며 --tail최신 num 행을 표시하지만 모든 pod가 아닌 배포에서 하나의 pod를 선택합니다. 이것은 당신이 명심해야 할 것입니다.

kubectl logs -l app=myapp -c myapp --tail 100

모든 포드의 로그를 표시하려면 -l레이블을 사용 하고 지정할 수 있지만 동시에 -f사용되지는 않습니다.


3

서비스 이름으로도이 작업을 수행 할 수 있습니다.

먼저 동일한 서비스의 여러 포드에 해당하는 각 포드의 서비스 이름을 찾습니다. kubectl get svc.

다음으로 다음 명령을 실행하여 각 컨테이너의 로그를 표시합니다.

kubectl logs -f service/<service-name>

2

이 예제에서는 대체 할 수 <namespace><app-name>포드에 정의 된 여러 개의 컨테이너가있는 경우 로그를 얻을 수 있습니다.

kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m

1

포드의 이름이 의미있는 경우 간단한 Plain Old Bash를 사용할 수 있습니다.

keyword=nodejs
command="cat <("
for line in $(kubectl get pods | \
  grep $keyword | grep Running | awk '{print $1}'); do 
    command="$command (kubectl logs --tail=2 -f $line &) && "
  done
command="$command echo)"
eval $command

설명 : "nodejs"를 포함하는 이름으로 실행중인 포드를 통해 루프합니다. 팟 (Pod) 중 하나가 실패하면 전체 명령이 종료 (이중 앰퍼샌드)되도록 병렬로 각각의 로그를 추적하십시오 (백그라운드에서 단일 앰퍼샌드 실행). 각 꼬리 명령의 스트림을 고유 한 스트림으로 분류합니다. 이 동적으로 빌드 된 명령을 실행하려면 Eval이 필요합니다.


-1

이 명령을 사용합니다.

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m

1
여보세요! 이 명령이 문제를 해결하는 방법과 그 이유에 대한 설명포함 하여 문제를 해결할 수 있지만 게시물의 품질을 향상시키는 데 실제로 도움이되며 더 많은 찬성 투표가 발생할 수 있습니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Brian

-4

이것이 새로운 것인지 확실하지 않지만 배포를 통해 다음과 같이 할 수 있습니다.

kubectl logs deployment/app1

8
배포별로 로그를 가져 오면 복제 된 포드 (무작위 선택) 중 하나를 선택하지만 전부는 아닙니다.
Akhil Bojedla

하나의 pod 만 선택하기 때문에 반대 투표
Maximilian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.