실행 kubectl logs
하면 Kubernetes 컨테이너 하나의 stderr / stdout이 표시됩니다.
가급적 특정 복제 컨트롤러에 의해 생성 된 포드 집합의 집계 된 stderr / stdout을 얻으려면 어떻게해야합니까?
실행 kubectl logs
하면 Kubernetes 컨테이너 하나의 stderr / stdout이 표시됩니다.
가급적 특정 복제 컨트롤러에 의해 생성 된 포드 집합의 집계 된 stderr / stdout을 얻으려면 어떻게해야합니까?
답변:
레이블을 사용할 수 있습니다.
kubectl logs -l app=elasticsearch
--all-namespaces
.
-f
(Kubernetes 1.12+ / kubectl
1.12+ 기준). 또한 @Shubham-수신 된 순서대로 메시지를 표시하며 로그 라인에 태그 나 아무것도 없습니다. 이것은 빠른 디버깅을위한 것입니다. 더 로그 세부 사항이 필요한 경우 등 EFK, SumoLogic, Datadog 같은 중앙 로깅 시스템에 로그를 제공해야합니다
kubetail
이것을 가능하게 하는 작은 bash 스크립트를 만들었습니다 . 예를 들어 "app1"이라는 포드의 모든 로그를 테일링하려면 다음을 수행 할 수 있습니다.
kubetail app1
여기 에서 스크립트를 찾을 수 있습니다 .
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
자세한 문서 : kt -h
훌륭합니다!
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]
일부 라벨은 다른 포드에서 공유 할 수 없습니다. "앱"을 선택하는 것이 가장 쉬운 것 같습니다.
이전에 제공된 솔루션은 최적이 아닙니다. 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/
이 간단한 스크립트를 사용하여 배포 포드에서 로그를 가져옵니다.
#!/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".
그러면 스크립트는 해당 "배포 이름"으로 시작하는 모든 포드의 로그를 표시합니다.
한 가지 옵션은 https://kubernetes.io/docs/user-guide/logging/elasticsearch/에 설명 된대로 Fluentd / ElasticSearch를 통해 클러스터 로깅을 설정하는 것 입니다. 로그가 ES에 있으면 Kibana에서 필터를 적용하여 특정 컨테이너의 로그를 쉽게 볼 수 있습니다.
포드의 이름이 의미있는 경우 간단한 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이 필요합니다.
이 명령을 사용합니다.
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
이것이 새로운 것인지 확실하지 않지만 배포를 통해 다음과 같이 할 수 있습니다.
kubectl logs deployment/app1