
समय-समय पर यादृच्छिक Kubernetes pods को समाप्त करता है ताकि यह परीक्षण किया जा सके कि सिस्टम अनियमित pod विफलताओं के तहत कैसे व्यवहार करते हैं, तथा नियंत्रित chaos प्रयोगों के लिए namespace, label, annotation और schedule फ़िल्टर का समर्थन करता है।
chaoskube समय-समय पर आपके Kubernetes क्लस्टर में यादृच्छिक पॉड्स को समाप्त करता है।

जांचें कि आपका सिस्टम किसी भी पॉड विफलता के तहत कैसा व्यवहार करता है।
डिफ़ॉल्ट रूप से, इसे चलाने पर हर 10 मिनट में किसी भी नेमस्पेस में एक पॉड समाप्त हो जाएगा।
$ chaoskube
INFO[0000] starting up dryRun=true interval=10m0s version=v0.21.0
INFO[0000] connecting to cluster master="https://kube.you.me" serverVersion=v1.10.5+coreos.0
INFO[0000] setting pod filter annotations= labels= minimumAge=0s namespaces=
INFO[0000] setting quiet times daysOfYear="[]" timesOfDay="[]" weekdays="[]"
INFO[0000] setting timezone location=UTC name=UTC offset=0
INFO[0001] terminating pod name=kube-dns-v20-6ikos namespace=kube-system
INFO[0601] terminating pod name=nginx-701339712-u4fr3 namespace=chaoskube
INFO[1201] terminating pod name=kube-proxy-gke-earthcoin-pool-3-5ee87f80-n72s namespace=kube-system
INFO[1802] terminating pod name=nginx-701339712-bfh2y namespace=chaoskube
INFO[2402] terminating pod name=heapster-v1.2.0-1107848163-bhtcw namespace=kube-system
INFO[3003] terminating pod name=l7-default-backend-v1.0-o2hc9 namespace=kube-system
INFO[3603] terminating pod name=heapster-v1.2.0-1107848163-jlfcd namespace=kube-system
INFO[4203] terminating pod name=nginx-701339712-bfh2y namespace=chaoskube
INFO[4804] terminating pod name=nginx-701339712-51nt8 namespace=chaoskube
...
chaoskube लक्षित पॉड्स को नेमस्पेस, लेबल, एनोटेशन और आयु द्वारा फ़िल्टर करने की अनुमति देता है, साथ ही अराजकता से कुछ सप्ताह के दिन, दिन के समय और वर्ष के दिनों को बाहर करने की भी अनुमति देता है।
आप chaoskube को Helm के साथ इंस्टॉल कर सकते हैं। Helm की क्विकस्टार्ट गाइड का पालन करें और फिर chaoskube चार्ट इंस्टॉल करें।
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
इसे कॉन्फ़िगर करने का तरीका जानने और अन्य उपयोगी Helm चार्ट खोजने के लिए kubeapps.com पर chaoskube देखें।
उदाहरण मैनिफेस्ट देखें। सुनिश्चित करें कि आप दिए गए ClusterRole का उपयोग करके chaoskube को उचित अनुमतियाँ देते हैं।
डिफ़ॉल्ट रूप से chaoskube अनुकूल होगा और कुछ भी नहीं मारेगा। जब आप अपने लक्षित क्लस्टर को सत्यापित कर लें, तो आप --no-dry-run फ़्लैग पास करके ड्राई-रन मोड को अक्षम कर सकते हैं। आप अपनी तैनाती के लिए अधिक आक्रामक अंतराल और अन्य समर्थित फ़्लैग भी निर्दिष्ट कर सकते हैं।
यदि आप किसी Kubernetes क्लस्टर में चल रहे हैं और उसी क्लस्टर को लक्षित करना चाहते हैं, तो आपको बस इतना ही करना है।
यदि आप किसी भिन्न क्लस्टर को लक्षित करना चाहते हैं या इसे स्थानीय रूप से चलाना चाहते हैं, तो अपने क्लस्टर को --master फ़्लैग के माध्यम से निर्दिष्ट करें या --kubeconfig फ़्लैग के माध्यम से एक मान्य kubeconfig प्रदान करें। डिफ़ॉल्ट रूप से, यह आपके घर में आपके मानक kubeconfig पथ का उपयोग करता है। इसका मतलब है, वहाँ जो भी वर्तमान कॉन्टेक्स्ट होगा, वह लक्षित किया जाएगा।
यदि आप अराजकता की मात्रा बढ़ाना या घटाना चाहते हैं, तो --interval फ़्लैग के साथ हत्याओं के बीच के अंतराल को बदलें। वैकल्पिक रूप से, आप अपने chaoskube तैनाती की रेप्लिकास की संख्या बढ़ा सकते हैं।
याद रखें कि chaoskube डिफ़ॉल्ट रूप से आपके सभी नेमस्पेस में किसी भी पॉड को मारता है, जिसमें सिस्टम पॉड्स और स्वयं भी शामिल हैं।
chaoskube एक सरल HTTP एंडपॉइंट प्रदान करता है जिसका उपयोग यह जाँचने के लिए किया जा सकता है कि यह चल रहा है। इसका उपयोग Kubernetes लाइवनेस और रेडीनेस प्रोब्स के लिए किया जा सकता है। डिफ़ॉल्ट रूप से, यह पोर्ट 8080 पर सुनता है। अक्षम करने के लिए, chaoskube को --metrics-address="" पास करें।
हालाँकि, आप लेबल, एनोटेशन और नेमस्पेस सेलेक्टर, पॉड नाम शामिल/बहिष्कृत पैटर्न, साथ ही न्यूनतम आयु सेटिंग प्रदान करके chaoskube के खोज स्थान को सीमित कर सकते हैं।
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
यह उन सभी पॉड्स का चयन करता है जिनका लेबल app mate पर सेट है, लेबल chaos किसी भी चीज़ पर सेट है, और लेबल stage production पर सेट नहीं है या अनसेट है।
आप लक्षित पॉड्स को नेमस्पेस सेलेक्टर द्वारा भी फ़िल्टर कर सकते हैं।
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
यह तीन नेमस्पेस default, staging और testing में पॉड्स के लिए फ़िल्टर करेगा।
नेमस्पेस को अतिरिक्त रूप से एक नेमस्पेस लेबल सेलेक्टर द्वारा फ़िल्टर किया जा सकता है।
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
यह integration लेबल वाले नेमस्पेस के सभी पॉड्स को बाहर कर देगा।
आप लक्षित पॉड्स को OwnerReference के काइंड सेलेक्टर द्वारा फ़िल्टर कर सकते हैं।
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
यह किसी भी DaemonSet और StatefulSet पॉड्स को बाहर कर देगा।
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
यह केवल किसी भी DaemonSet पॉड्स को शामिल करेगा।
कृपया ध्यान दें: कोई भी include फ़िल्टर स्वचालित रूप से उन सभी पॉड्स को बाहर कर देगा जिनमें कोई OwnerReference परिभाषित नहीं है।
आप पॉड्स को नाम से फ़िल्टर कर सकते हैं:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
इससे केवल उन पॉड्स को लक्षित किया जाएगा जिनके नाम में 'foo' या 'bar' है और जिनमें 'prod' नहीं है।
आप नेमस्पेस को भी बाहर कर सकते हैं और लेबल और एनोटेशन सेलेक्टर्स के साथ मिला-जुलाकर उपयोग कर सकते हैं।
$ chaoskube \
--labels 'app=mate,chaos,stage!=production' \
--annotations '!scheduler.alpha.kubernetes.io/critical-pod' \
--namespaces '!kube-system,!production'
...
INFO[0000] setting pod filter annotations="!scheduler.alpha.kubernetes.io/critical-pod" labels="app=mate,chaos,stage!=production" namespaces="!kube-system,!production"
यह उपरोक्त लेबल सेलेक्टर के खोज स्थान को और सीमित करता है, साथ ही kube-system और production नेमस्पेस के किसी भी पॉड्स को बाहर करता है और उन सभी पॉड्स को अनदेखा करता है जिन्हें महत्वपूर्ण के रूप में चिह्नित किया गया है।
एनोटेशन सेलेक्टर का उपयोग chaoskube को क्लस्टर ऐडऑन के रूप में चलाने और पॉड्स को आपके अनुसार समाप्त होने के लिए ऑप्ट-इन करने की अनुमति देने के लिए भी किया जा सकता है। उदाहरण के लिए, आप chaoskube को इस प्रकार चला सकते हैं:
$ chaoskube --annotations 'chaos.alpha.kubernetes.io/enabled=true' --debug
...
INFO[0000] setting pod filter annotations="chaos.alpha.kubernetes.io/enabled=true"
DEBU[0000] found candidates count=0
DEBU[0000] no victim found
जब तक आप पहले से कहीं उस एनोटेशन का उपयोग नहीं कर रहे हैं, यह शुरू में आपके सभी पॉड्स को अनदेखा करेगा (आप डिबग मोड में उम्मीदवारों की संख्या देख सकते हैं)। फिर आप अपने पॉड्स पर chaos.alpha.kubernetes.io/enabled=true एनोटेशन लगाकर व्यक्तिगत डिप्लॉयमेंट्स को चुनिंदा रूप से अराजकता मोड में ऑप्ट-इन कर सकते हैं।
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
template:
metadata:
annotations:
chaos.alpha.kubernetes.io/enabled: "true"
spec:
...
आप --minimum-age फ़्लैग का उपयोग करके हाल ही में शुरू हुए पॉड्स को बाहर कर सकते हैं।
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
आप उस समय को सीमित कर सकते हैं जब अराजकता शुरू की जाती है, सप्ताह के दिनों, दिन के समय अवधियों, वर्ष के दिनों या उन सभी को एक साथ करके।
--excluded-weekdays विकल्पों के माध्यम से अल्पविराम-पृथक संक्षिप्त सप्ताह के दिनों की सूची जोड़ें, --excluded-times-of-day विकल्प के माध्यम से समय अवधियों की अल्पविराम-पृथक सूची, और/या --excluded-days-of-year विकल्प के माध्यम से वर्ष के दिनों की अल्पविराम-पृथक सूची जोड़ें और एक --timezone निर्दिष्ट करें जिसके द्वारा उनकी व्याख्या की जाए।
$ chaoskube \
--excluded-weekdays=Sat,Sun \
--excluded-times-of-day=22:00-08:00,11:00-13:00 \
--excluded-days-of-year=Apr1,Dec24 \
--timezone=Europe/Berlin
...
INFO[0000] setting quiet times daysOfYear="[Apr 1 Dec24]" timesOfDay="[22:00-08:00 11:00-13:00]" weekdays="[Saturday Sunday]"
INFO[0000] setting timezone location=Europe/Berlin name=CET offset=1
UTC, Local का उपयोग करें या (IANA) tz डेटाबेस से एक टाइमज़ोन नाम चुनें। यदि आप अपनी स्थानीय मशीन से chaoskube का परीक्षण कर रहे हैं, तो Local सबसे उपयुक्त है। एक बार जब आप chaoskube को अपने क्लस्टर में तैनात कर देते हैं, तो आपको इसे एक विशिष्ट टाइमज़ोन के साथ तैनात करना चाहिए, उदाहरण के लिए जहाँ आपकी अधिकांश टीम के सदस्य रहते हैं, ताकि आपकी टीम और chaoskube दोनों को एक सामान्य समझ हो कि एक विशेष सप्ताह का दिन कब शुरू और समाप्त होता है। यदि आपकी टीम कई समय क्षेत्रों में फैली हुई है, तो संभवतः UTC चुनना सबसे अच्छा है, जो डिफ़ॉल्ट भी है। गलत टाइमज़ोन चुनने से आपके और सर्वर के बीच किसी विशेष सप्ताह के दिन का अर्थ कुछ घंटों के लिए बदल जाता है।
ऐसे कई अन्य प्रोजेक्ट हैं जो आपको अपने Kubernetes क्लस्टर में कुछ अराजकता पैदा करने की अनुमति देते हैं।
chaoskube में नहीं है। यह एक एप्लिकेशन बनाने वाले पॉड्स के समूहों से भी अवगत कराया जा सकता है ताकि यह उनके साथ विशेष रूप से व्यवहार कर सके, उदाहरण के लिए एक एप्लिकेशन के सभी पॉड्स को एक साथ मार सके। kube-mokey कॉन्फ़िगरेशन विकल्पों के माध्यम से लक्ष्यों को वैश्विक रूप से फ़िल्टर करने की अनुमति देता है, साथ ही पॉड्स को एनोटेशन के माध्यम से अराजकता में ऑप्ट-इन करने की अनुमति देता है; यह व्यक्तिगत ऐप्स को अपने अनूठे तरीके से ऑप्ट-इन करने की अनुमति देता है, उदाहरण के रूप में, app-a प्रत्येक सप्ताह के दिन एक पॉड को मारने का अनुरोध कर सकता है, जबकि app-b जो अधिक साहसी है, 50% पॉड्स को मारने का अनुरोध कर सकता है। यह Netflix के ChaosMonkey द्वारा उपयोग की जाने वाली समान कॉन्फ़िगरेशन फ़ाइल को समझता है।यह प्रोजेक्ट कई शानदार योगदानकर्ताओं के विचारों और मदद के बिना वहाँ नहीं होता जहाँ यह आज है:
बेझिझक इश्यू बनाएं या पुल रिक्वेस्ट सबमिट करें।
| विकल्प | पर्यावरण | विवरण | डिफ़ॉल्ट |
|---|
--interval | CHAOSKUBE_INTERVAL | पॉड समाप्ति के बीच अंतराल | 10m |
--labels | CHAOSKUBE_LABELS | पॉड्स को फ़िल्टर करने के लिए लेबल सेलेक्टर | (सब कुछ मेल खाता है) |
--annotations | CHAOSKUBE_ANNOTATIONS | पॉड्स को फ़िल्टर करने के लिए एनोटेशन सेलेक्टर | (सब कुछ मेल खाता है) |
--kinds | CHAOSKUBE_KINDS | पॉड्स को फ़िल्टर करने के लिए स्वामी का काइंड सेलेक्टर | (सभी काइंड) |
--namespaces | CHAOSKUBE_NAMESPACES | पॉड्स को फ़िल्टर करने के लिए नेमस्पेस सेलेक्टर | (सभी नेमस्पेस) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | नेमस्पेस और उसके पॉड्स को फ़िल्टर करने के लिए लेबल सेलेक्टर | (सभी नेमस्पेस) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | शामिल करने के लिए पॉड नामों के लिए रेगुलर एक्सप्रेशन पैटर्न | (सभी शामिल) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | बाहर करने के लिए पॉड नामों के लिए रेगुलर एक्सप्रेशन पैटर्न | (कोई बाहर नहीं) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | जिन सप्ताह के दिनों में अराजकता को निलंबित किया जाना है, जैसे "Sat,Sun" | (कोई सप्ताह का दिन बाहर नहीं) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | दिन के वे समय जब अराजकता को निलंबित किया जाना है, जैसे "22:00-08:00" | (कोई दिन का समय बाहर नहीं) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | वर्ष के वे दिन जब अराजकता को निलंबित किया जाना है, जैसे "Apr1,Dec24" | (कोई वर्ष का दिन बाहर नहीं) |
--timezone | CHAOSKUBE_TIMEZONE | tz डेटाबेस से टाइमज़ोन, जैसे "America/New_York", "UTC" या "Local" | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | chaoskube के बाहर निकलने से पहले अधिकतम रनटाइम | -1s (अनंत समय) |
--max-kill | CHAOSKUBE_MAX_KILL | प्रति अंतराल समाप्त किए जाने वाले पॉड्स की अधिकतम संख्या निर्दिष्ट करता है | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | पॉड्स को फ़िल्टर करने के लिए न्यूनतम आयु | 0s (हर पॉड से मेल खाता है) |
--dry-run | CHAOSKUBE_DRY_RUN | पॉड्स को न मारें, केवल लॉग करें कि क्या किया गया होता | true |
--log-format | CHAOSKUBE_LOG_FORMAT | लॉग संदेशों का प्रारूप निर्दिष्ट करें। विकल्प text और json हैं | text |
--log-caller | CHAOSKUBE_LOG_CALLER | लॉग संदेशों में कॉलिंग फ़ंक्शन का नाम और स्थान शामिल करें | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | सूचनाओं के लिए स्लैक वेबहुक का पता | अक्षम |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | Kubernetes API कॉल्स को दिए गए नेमस्पेस तक सीमित करें | (सभी नेमस्पेस) |
kubectl का उपयोग करने वाला एक बहुत ही सरल रैंडम पॉड किलर, जो bash की कुछ पंक्तियों में लिखा गया है। एक नेमस्पेस और एक अंतराल दिए जाने पर, यह प्रत्येक अंतराल पर उस नेमस्पेस में एक यादृच्छिक पॉड को मारता है। लगभग वैसा ही जैसा chaoskube शुरुआत में काम करता था।