रनिंग kubectl logs
मुझे एक कुबेरनेट कंटेनर के स्टडर / स्टडआउट से पता चलता है।
मैं फली के सेट के कुल स्टैडर / स्टडआउट को कैसे प्राप्त कर सकता हूं, अधिमानतः जो एक निश्चित प्रतिकृति नियंत्रक द्वारा बनाया गया है?
रनिंग kubectl logs
मुझे एक कुबेरनेट कंटेनर के स्टडर / स्टडआउट से पता चलता है।
मैं फली के सेट के कुल स्टैडर / स्टडआउट को कैसे प्राप्त कर सकता हूं, अधिमानतः जो एक निश्चित प्रतिकृति नियंत्रक द्वारा बनाया गया है?
जवाबों:
आप लेबल का उपयोग कर सकते हैं
kubectl logs -l app=elasticsearch
--all-namespaces
।
-f
अब के साथ काम करता है (कुबेरनेट्स 1.12+ / kubectl
1.12+ के रूप में)। इसके अलावा @ शुभम - यह प्राप्त आदेश में संदेशों को प्रदर्शित करता है, लॉग लाइनों पर कोई टैग या कुछ भी नहीं है। यह सिर्फ त्वरित डिबगिंग के लिए है। यदि आपको अधिक लॉग विवरण की आवश्यकता है, तो आपको अपने लॉग को केंद्रीय लॉगिंग सिस्टम जैसे EFK, SumoLogic, Datadog, आदि में
मैंने एक छोटी बैश स्क्रिप्ट बनाई है, जिसे kubetail
यह संभव बनाता है। उदाहरण के लिए "app1" नाम के पॉड्स के सभी लॉग्स को आप कर सकते हैं:
kubetail app1
आप यहां स्क्रिप्ट पा सकते हैं ।
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
विस्तृत प्रलेखन: kt -h
बहुत बढ़िया!
आप एड्रियन एनजी के सुझाव के अनुसार लेबल का उपयोग करके कई कंटेनरों से लॉग प्राप्त कर सकते हैं:
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]
ध्यान दें कि कुछ लेबल अन्य पॉड्स द्वारा साझा नहीं किए जा सकते हैं - "ऐप" चुनना सबसे आसान लगता है
पहले प्रदान किए गए समाधान इष्टतम नहीं हैं। खुद कुबेरनेट्स टीम ने कुछ समय पहले एक समाधान प्रदान किया है, जिसे स्टर्न कहा जाता है।
stern app1
यह नियमित अभिव्यक्ति से मेल खाता है और डिफ़ॉल्ट रूप से पूंछ और -f (अनुसरण) करता है। एक अच्छा लाभ यह है कि यह आपको फली दिखाता है जो लॉग को भी उत्पन्न करता है।
app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2
लिनक्स के लिए गो-बाइनरी को पकड़ो या 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 "परिनियोजन-नाम"।
स्क्रिप्ट तब सभी पॉड्स का लॉग दिखाएगा जो उस "तैनाती-नाम" से शुरू होता है।
एक विकल्प यह है कि फ्लोरेंट / ElasticSearch के माध्यम से क्लस्टर लॉगिंग को https://kubernetes.io/docs/user-guide/logging/elasticsearch/ पर वर्णित किया जाए । एक बार लॉग ईएस में होने के बाद, कुछ कंटेनरों से लॉग देखने के लिए किबाना में फ़िल्टर लागू करना आसान है।
आप 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
उपयोग नहीं किया जाएगा।
इस उदाहरण में, आप पॉड में परिभाषित कई कंटेनर होने पर लॉग को प्राप्त करने के लिए <namespace>
और बदल सकते <app-name>
हैं।
kubectl -n <namespace> logs -f deployment/<app-name>
--all-containers=true --since=10m
यदि पॉड्स का नाम सार्थक रूप से रखा जाता है, तो कोई साधारण सादा पुराना बैश इस्तेमाल कर सकता है:
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 की आवश्यकता होती है।
मैं इस कमांड का उपयोग करता हूं।
kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m
यकीन नहीं होता कि यह एक नई बात है, लेकिन तैनाती के साथ ऐसा करना संभव है:
kubectl logs deployment/app1