कुबेरनेट्स प्रतिकृति नियंत्रक के सभी पॉड्स से मुझे लॉग कैसे मिलते हैं?


123

रनिंग kubectl logsमुझे एक कुबेरनेट कंटेनर के स्टडर / स्टडआउट से पता चलता है।

मैं फली के सेट के कुल स्टैडर / स्टडआउट को कैसे प्राप्त कर सकता हूं, अधिमानतः जो एक निश्चित प्रतिकृति नियंत्रक द्वारा बनाया गया है?


ध्यान रखें कि चयनकर्ता का उपयोग करते समय पूंछ के तर्क को स्थापित नहीं करने पर हर पॉड लॉग 10 लाइनों की लंबाई में डिफ़ॉल्ट होगा
chachan

जवाबों:


175

आप लेबल का उपयोग कर सकते हैं

kubectl logs -l app=elasticsearch

21
अच्छा समाधान और मूल प्रश्न का उत्तर देने के लिए पर्याप्त रूप से पर्याप्त है लेकिन यह पूंछ नहीं करेगा: "त्रुटि: केवल एक (-f) या चयनकर्ता (-l) की अनुमति है"।
नेस्टर उरकिज़ा

3
इसके अलावा, नहीं --all-namespaces
एरिक वॉकर

उन लॉग का क्रम क्या होगा? मेरा मतलब है कि अगर कई पॉड हैं और प्रत्येक पॉड के अपने लॉग होंगे। इसलिए यदि सभी से लॉग प्रदर्शित किए जाते हैं, तो वे किस क्रम में प्रदर्शित होंगे और मैं किसी विशेष लॉग लाइन के स्रोत पॉड की पहचान कैसे करूं?
शुभम

6
ऐसा लगता है कि यह -fअब के साथ काम करता है (कुबेरनेट्स 1.12+ / kubectl1.12+ के रूप में)। इसके अलावा @ शुभम - यह प्राप्त आदेश में संदेशों को प्रदर्शित करता है, लॉग लाइनों पर कोई टैग या कुछ भी नहीं है। यह सिर्फ त्वरित डिबगिंग के लिए है। यदि आपको अधिक लॉग विवरण की आवश्यकता है, तो आपको अपने लॉग को केंद्रीय लॉगिंग सिस्टम जैसे EFK, SumoLogic, Datadog, आदि में
भेजना होगा

1
वैसे भी कुबेरनेट्स डैशबोर्ड का उपयोग करने के लिए ऐसा ही है।
माचव्रे

70

मैंने एक छोटी बैश स्क्रिप्ट बनाई है, जिसे kubetailयह संभव बनाता है। उदाहरण के लिए "app1" नाम के पॉड्स के सभी लॉग्स को आप कर सकते हैं:

kubetail app1

आप यहां स्क्रिप्ट पा सकते हैं ।


इसके साथ स्थापित: brew tap johanhaleby/kubetail && brew install kubetail --with-short-namesविस्तृत प्रलेखन: kt -hबहुत बढ़िया!
खलील घरौई 13

बहुत बढ़िया। मेरे पास दो सवाल है। `` `1. क्या हम अलग-अलग परिनियोजन से संबंधित कई पॉड्स के लॉग को टेल कर सकते हैं? "Kt -l app = service1, app = service2" 2. कुछ इस तरह से मैं किसी फाइल में कैसे लिखूं? ऐसा करने से "kt -l app = service1` >> filename.log" केवल पॉड नामों को लिखता है। 3. क्या यह आटोस्केलिंग तैनाती के मामले में भी पूंछता है? `` `
वासुदेव

19

आप एड्रियन एनजी के सुझाव के अनुसार लेबल का उपयोग करके कई कंटेनरों से लॉग प्राप्त कर सकते हैं:

kubectl logs --selector app=yourappname

यदि आपके पास कई कंटेनरों के साथ एक फली है, तो उपरोक्त आदेश विफल हो रहा है और आपको कंटेनर का नाम निर्दिष्ट करना होगा:

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

नोट: यदि आप यह देखना चाहते हैं कि कौन से लेबल आपके लिए उपलब्ध हैं, तो निम्न कमांड उन सभी को सूचीबद्ध करेगा:

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

... जहां आउटपुट कुछ इस तरह दिखेगा

नक्शा [ऐप: Yourappname नियंत्रक-संशोधन-हैश: 598302898 पॉड-टेम्प्लेट-पीढ़ी: 1]

ध्यान दें कि कुछ लेबल अन्य पॉड्स द्वारा साझा नहीं किए जा सकते हैं - "ऐप" चुनना सबसे आसान लगता है


13

यदि आप जोड़ते -fहैं तो पिछले उत्तर पर निर्माण करने के लिए आप लॉग को पूंछ सकते हैं।

kubectl logs -f deployment/app

10

पहले प्रदान किए गए समाधान इष्टतम नहीं हैं। खुद कुबेरनेट्स टीम ने कुछ समय पहले एक समाधान प्रदान किया है, जिसे स्टर्न कहा जाता है।

stern app1

यह नियमित अभिव्यक्ति से मेल खाता है और डिफ़ॉल्ट रूप से पूंछ और -f (अनुसरण) करता है। एक अच्छा लाभ यह है कि यह आपको फली दिखाता है जो लॉग को भी उत्पन्न करता है।

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

लिनक्स के लिए गो-बाइनरी को पकड़ो या 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 "परिनियोजन-नाम"।

स्क्रिप्ट तब सभी पॉड्स का लॉग दिखाएगा जो उस "तैनाती-नाम" से शुरू होता है।


5

एक विकल्प यह है कि फ्लोरेंट / ElasticSearch के माध्यम से क्लस्टर लॉगिंग को https://kubernetes.io/docs/user-guide/logging/elasticsearch/ पर वर्णित किया जाए । एक बार लॉग ईएस में होने के बाद, कुछ कंटेनरों से लॉग देखने के लिए किबाना में फ़िल्टर लागू करना आसान है।


4

आप kubectl logs -hजानकारी से और जानकारी के अनुसार मदद ले सकते हैं।

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

-cकंटेनर का नाम है और --tailनवीनतम संख्या रेखाओं को दिखाएगा will लेकिन यह सभी पॉड्स को नहीं बल्कि परिनियोजन के एक पॉड का चयन करेगा। यह कुछ ऐसा है जिसे आपको ध्यान में रखना है।

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

यदि पॉड्स का नाम सार्थक रूप से रखा जाता है, तो कोई साधारण सादा पुराना बैश इस्तेमाल कर सकता है:

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

स्पष्टीकरण: "नोडज" नाम वाले पॉड्स को चलाने के माध्यम से लूप करें। उनमें से प्रत्येक के लिए लॉग को समानांतर (एकल एम्परसेंड पृष्ठभूमि में चलाता है) सुनिश्चित करें कि यदि कोई भी फली पूरी कमांड से बाहर निकले (डबल एम्परसेंड)। पूंछ के प्रत्येक भाग से धाराओं को एक अनूठी धारा में मिलाते हैं। इस गतिशील रूप से निर्मित कमांड को चलाने के लिए Eval की आवश्यकता होती है।


-1

मैं इस कमांड का उपयोग करता हूं।

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

1
हैलो! हालांकि यह आदेश प्रश्न को हल कर सकता है, जिसमें यह भी बताया गया है कि यह समस्या कैसे और क्यों हल करती है, इससे वास्तव में आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद मिलेगी, और संभवत: अधिक वोट मिले। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है। कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें और संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
ब्रायन

-4

यकीन नहीं होता कि यह एक नई बात है, लेकिन तैनाती के साथ ऐसा करना संभव है:

kubectl logs deployment/app1

8
जब आप परिनियोजन के द्वारा लॉग प्राप्त करते हैं, तो यह किसी भी एक प्रतिकृति पॉड्स को चुनता है (यादृच्छिक रूप से चुनता है) लेकिन उन सभी को नहीं।
अखिल बोजेदला

डाउनवोटिंग क्योंकि यह केवल एक फली का चयन करता है
मैक्सिमिलियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.