ฉันจะรับบันทึกจากพ็อดทั้งหมดของตัวควบคุมการจำลองแบบ Kubernetes ได้อย่างไร


123

การรันkubectl logsแสดง stderr / stdout ของ Kubernetes container หนึ่งคอนเทนเนอร์

ฉันจะรับ stderr / stdout รวมของชุดพ็อดได้อย่างไรโดยเฉพาะที่สร้างโดยตัวควบคุมการจำลองแบบบางตัว


โปรดทราบว่าการไม่ตั้งค่าอาร์กิวเมนต์ tail เมื่อใช้ตัวเลือกจะเริ่มต้นทุก pod log ที่มีความยาว 10 บรรทัด
chachan

คำตอบ:


176

คุณสามารถใช้ป้ายกำกับ

kubectl logs -l app=elasticsearch

21
ทางออกที่ดีและน่าจะเพียงพอที่จะตอบคำถามเดิม แต่จะไม่ตอบ: "error: only one of follow (-f) or selector (-l) is licensed"
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ว่าทำให้สิ่งนี้เป็นไปได้ ตัวอย่างเช่นในการระบุบันทึกทั้งหมดสำหรับพ็อดที่ชื่อ "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. ฉันจะเขียน em ทั้งหมดลงในไฟล์ได้อย่างไร? การทำเช่นนี้ "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}}'

... โดยที่ผลลัพธ์จะมีลักษณะดังนี้

แผนที่ [app: yourappname controller-revision-hash: 598302898 pod-template-generation: 1]

โปรดทราบว่าพ็อดอื่นอาจไม่แชร์ป้ายกำกับบางป้ายการเลือก "แอป" ดูเหมือนจะเป็นป้ายที่ง่ายที่สุด


13

ในการสร้างคำตอบก่อนหน้านี้หากคุณเพิ่ม-fคุณสามารถหางบันทึก

kubectl logs -f deployment/app

10

โซลูชันที่ให้ไว้ก่อนหน้านี้ไม่เหมาะสม ทีมงาน kubernetes ได้ให้วิธีการแก้ปัญหาเมื่อไม่นานมานี้เรียกว่า stern

stern app1

นอกจากนี้ยังจับคู่นิพจน์ทั่วไปและทำ tail และ -f (ตาม) ตามค่าเริ่มต้น ประโยชน์ที่ดีคือมันแสดงให้คุณเห็นพ็อดที่สร้างบันทึกด้วย

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

หยิบ go-binary สำหรับ linux หรือติดตั้งผ่าน brew สำหรับ OSX

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"

สคริปต์จะแสดงบันทึกของพ็อดทั้งหมดที่ขึ้นต้นด้วย "deployment-name" นั้น


5

ทางเลือกหนึ่งคือการตั้งค่าการเข้าสู่ระบบคลัสเตอร์ผ่าน Fluentd / ElasticSearch ตามที่อธิบายไว้ในhttps://kubernetes.io/docs/user-guide/logging/elasticsearch/ เมื่อบันทึกอยู่ใน ES แล้วคุณสามารถใช้ตัวกรองใน Kibana เพื่อดูบันทึกจากคอนเทนเนอร์บางอย่างได้อย่างง่ายดาย


4

คุณสามารถขอความช่วยเหลือจากkubectl logs -hและตามข้อมูล

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

-cคือชื่อคอนเทนเนอร์และ--tailจะแสดงบรรทัดจำนวนล่าสุด, แต่จะเลือกพ็อดหนึ่งของการปรับใช้ไม่ใช่พ็อดทั้งหมด นี่คือสิ่งที่คุณต้องจำไว้

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" จัดเรียงบันทึกสำหรับแต่ละรายการแบบขนาน (เครื่องหมายแอมเพอร์แซนด์เดี่ยวและทำงานในพื้นหลัง) เพื่อให้แน่ใจว่าพ็อดใด ๆ ล้มเหลวคำสั่งทั้งหมดจะออก (เครื่องหมายแอมเพอร์แซนด์คู่) จับกระแสจากหางแต่ละคำสั่งลงในสตรีมที่ไม่ซ้ำ ต้องใช้ 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

การลงคะแนนเนื่องจากเลือกเพียงหนึ่งพ็อด
Maximilian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.