การรันkubectl logs
แสดง stderr / stdout ของ Kubernetes container หนึ่งคอนเทนเนอร์
ฉันจะรับ stderr / stdout รวมของชุดพ็อดได้อย่างไรโดยเฉพาะที่สร้างโดยตัวควบคุมการจำลองแบบบางตัว
การรันkubectl logs
แสดง stderr / stdout ของ Kubernetes container หนึ่งคอนเทนเนอร์
ฉันจะรับ stderr / stdout รวมของชุดพ็อดได้อย่างไรโดยเฉพาะที่สร้างโดยตัวควบคุมการจำลองแบบบางตัว
คำตอบ:
คุณสามารถใช้ป้ายกำกับ
kubectl logs -l app=elasticsearch
--all-namespaces
นอกจากนี้ยังไม่มี
-f
ตอนนี้ (ณ Kubernetes 1.12+ / kubectl
1.12+) นอกจากนี้ @Shubham - แสดงข้อความตามลำดับที่ได้รับไม่มีแท็กหรือสิ่งใด ๆ บนบรรทัดบันทึก นี่เป็นเพียงการแก้ไขจุดบกพร่องอย่างรวดเร็ว หากต้องการรายละเอียดบันทึกเพิ่มเติมคุณจะต้องจัดส่งบันทึกของคุณไปยังระบบบันทึกส่วนกลางเช่น EFK, SumoLogic, Datadog เป็นต้น
ฉันได้สร้างสคริปต์ทุบตีขนาดเล็กที่เรียกkubetail
ว่าทำให้สิ่งนี้เป็นไปได้ ตัวอย่างเช่นในการระบุบันทึกทั้งหมดสำหรับพ็อดที่ชื่อ "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}}'
... โดยที่ผลลัพธ์จะมีลักษณะดังนี้
แผนที่ [app: yourappname controller-revision-hash: 598302898 pod-template-generation: 1]
โปรดทราบว่าพ็อดอื่นอาจไม่แชร์ป้ายกำกับบางป้ายการเลือก "แอป" ดูเหมือนจะเป็นป้ายที่ง่ายที่สุด
ในการสร้างคำตอบก่อนหน้านี้หากคุณเพิ่ม-f
คุณสามารถหางบันทึก
kubectl logs -f deployment/app
โซลูชันที่ให้ไว้ก่อนหน้านี้ไม่เหมาะสม ทีมงาน 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/
ฉันใช้สคริปต์ง่ายๆนี้เพื่อรับบันทึกจากพ็อดของการปรับใช้:
#!/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" นั้น
คุณสามารถขอความช่วยเหลือจาก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
จะไม่ใช้ในเวลาเดียวกัน
คุณสามารถทำได้โดยใช้ชื่อบริการ
ขั้นแรกพยายามค้นหาชื่อบริการของพ็อดที่เกี่ยวข้องซึ่งสอดคล้องกับหลายพ็อดของบริการเดียวกัน kubectl get svc
.
จากนั้นรันคำสั่งต่อไปนี้เพื่อแสดงบันทึกจากแต่ละคอนเทนเนอร์
kubectl logs -f service/<service-name>
ในตัวอย่างนี้คุณสามารถแทนที่<namespace>
และ<app-name>
เพื่อรับบันทึกเมื่อมีหลายคอนเทนเนอร์ที่กำหนดไว้ในพ็อด
kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m
หากตั้งชื่อพ็อดอย่างมีความหมายสามารถใช้ 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 เพื่อรันคำสั่งที่สร้างขึ้นแบบไดนามิกนี้
ฉันใช้คำสั่งนี้
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
ไม่แน่ใจว่านี่เป็นสิ่งใหม่หรือไม่ แต่ด้วยการปรับใช้จึงเป็นไปได้ที่จะทำเช่นนี้:
kubectl logs deployment/app1