IT story

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

hot-time 2020. 9. 15. 19:23
반응형

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


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

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


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

kubectl logs -l app=elasticsearch

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

kubetail app1

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


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]

레이블 중 일부는 다른 창에서 공유 할 수 없습니다. "앱"을 선택하는 것이 가장 쉬운 것 같습니다.


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

kubectl logs -f deployment/app

한 가지 옵션은 https://kubernetes.io/docs/user-guide/logging/elasticsearch/에 설명 된대로 Fluentd / ElasticSearch를 통해 클러스터 로깅을 설정하는 것 입니다. 로그가 ES에 있으면 Kibana에서 필터를 적용하여 특정 컨테이너의 로그를 쉽게 볼 수 있습니다.


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

#!/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".

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


이전에 제공된 솔루션은 최적이 아닙니다. 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


포드의 이름이 의미있는 경우 간단한 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

Explanation: Loop through running pods with name containing "nodejs". Tail the log for each of them in parallel (single ampersand runs in background) ensuring that if any of the pods fail the whole command exits (double ampersand). Cat the streams from each of the tail commands into a unique stream. Eval is needed to run this dynamically built command.


You can get help from kubectl logs -h and according the info,

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

-c is the container name and --tail will show the latest num lines,but this will choose one pod of the deployment, not all pods. This is something you have to bear in mind.

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

If you want to show logs of all pods, you can use -l and specify a lable, but at the same time -f won't be used.


Not sure if this is a new thing, but with deployments it is possible to do it like this:

kubectl logs deployment/app1

참고 URL : https://stackoverflow.com/questions/33069736/how-do-i-get-logs-from-all-pods-of-a-kubernetes-replication-controller

반응형