
Kubernetes क्लस्टर्स के लिए Netflix के Chaos Monkey का एक कार्यान्वयन
kube-monkey, Kubernetes क्लस्टरों के लिए Netflix's Chaos Monkey का एक कार्यान्वयन है। यह क्लस्टर में Kubernetes (k8s) पॉड्स को बेतरतीब ढंग से हटाता है, जिससे विफलता-सहिष्णु सेवाओं के विकास को प्रोत्साहन और मान्यता मिलती है।
हमसे Kubernetes Slack पर #kube-monkey से जुड़ें।
kube-monkey कार्यदिवसों पर एक पूर्व-कॉन्फ़िगर घंटे (run_hour, डिफ़ॉल्ट सुबह 8 बजे) पर चलता है, और उन डिप्लॉयमेंट्स की एक अनुसूची बनाता है जिन्हें उसी दिन किसी समय एक यादृच्छिक पॉड मृत्यु का सामना करना पड़ेगा। दिन के दौरान वह समय-सीमा जब यादृच्छिक पॉड मृत्यु हो सकती है, कॉन्फ़िगर करने योग्य है और डिफ़ॉल्ट रूप से सुबह 10 बजे से शाम 4 बजे तक है।
kube-monkey को नेमस्पेस की सूची के साथ कॉन्फ़िगर किया जा सकता है
ब्लैकलिस्ट अक्षम करने के लिए blacklisted_namespaces config.param में [""] प्रदान करें।
kube-monkey ऑप्ट-इन मॉडल पर काम करता है और केवल उन Kubernetes (k8s) ऐप्स के लिए समापन निर्धारित करेगा जिन्होंने स्पष्ट रूप से अपने पॉड्स को kube-monkey द्वारा समाप्त किए जाने पर सहमति दी है।
ऑप्ट-इन k8s ऐप पर निम्नलिखित लेबल सेट करके किया जाता है:
kube-monkey/enabled: "enabled" पर सेट करें ताकि kube-monkey में ऑप्ट-इन किया जा सके
kube-monkey/mtbf: विफलता के बीच औसत समय, एक पूर्ण संख्या और एक इकाई के रूप में: d दिनों के लिए, h घंटों के लिए या m मिनटों के लिए। उदाहरण के लिए,
यदि "3d" पर सेट है, तो k8s ऐप लगभग हर तीसरे कार्यदिवस में एक पॉड मारे जाने की उम्मीद कर सकता है, और यदि "2h" पर सेट है, तो वह हर दो घंटे में
एक पॉड खोने की उम्मीद कर सकता है। बिना इकाई वाला मान दिनों के रूप में पढ़ा जाता है, इसलिए "3" और "3d" एक ही अर्थ रखते हैं। विफलता के बीच का सबसे कम
औसत समय एक मिनट है। ध्यान दें कि सभी समापन दैनिक रन विंडो के भीतर होते हैं (start_hour और end_hour देखें), इसलिए एक दिन से कम का mtbf
उस दिन के समापन को उसी विंडो में समेट देता है।
kube-monkey/identifier: k8s ऐप्स के लिए एक अद्वितीय पहचानकर्ता। इसका उपयोग उन पॉड्स की पहचान करने के लिए किया जाता है
जो किसी k8s ऐप से संबंधित हैं, क्योंकि पॉड्स अपने k8s ऐप से लेबल प्राप्त करते हैं। इसलिए, यदि kube-monkey पता लगाता है कि ऐप foo ने शिकार बनने के लिए नामांकन किया है, तो kube-monkey उन सभी पॉड्स की तलाश करेगा जिन पर लेबल kube-monkey/identifier: foo है, यह निर्धारित करने के लिए कि कौन से पॉड्स मारे जाने के उम्मीदवार हैं। अनुशंसा यह है कि इस मान को ऐप के नाम के समान सेट किया जाए।
kube-monkey/kill-mode: डिफ़ॉल्ट व्यवहार यह है कि kube-monkey आपके ऐप का केवल एक पॉड मारता है। आप मान को निम्न में से एक पर सेट करके इस व्यवहार को ओवरराइड कर सकते हैं:
kill-all यदि आप चाहते हैं कि kube-monkey आपके सभी पॉड्स को स्थिति की परवाह किए बिना मार दे (उन पॉड्स सहित जो तैयार नहीं हैं और चालू नहीं हैं)। kill-value की आवश्यकता नहीं है। इस लेबल का सावधानी से उपयोग करें।fixed यदि आप kill-value के साथ चल रहे पॉड्स की एक विशिष्ट संख्या को मारना चाहते हैं। यदि आप अधिक निर्दिष्ट करते हैं, तो यह सभी चल रहे पॉड्स को मार देगा और एक चेतावनी जारी करेगा।random-max-percent ताकि kill-value के साथ एक अधिकतम % निर्दिष्ट किया जा सके जिसे मारा जा सकता है। निर्धारित समय पर, चल रहे पॉड्स का एक समान यादृच्छिक निर्दिष्ट % समाप्त किया जाएगा।fixed-percent ताकि kill-value के साथ एक निश्चित % निर्दिष्ट किया जा सके जिसे मारा जा सकता है। निर्धारित समय पर, चल रहे पॉड्स का एक निर्दिष्ट निश्चित % समाप्त किया जाएगा।kube-monkey/kill-value: kill-mode के लिए मान निर्दिष्ट करें
fixed है, तो मारने के लिए पॉड्स की एक पूर्णांक संख्या प्रदान करेंrandom-max-percent है, तो kube-monkey द्वारा मारे जा सकने वाले पॉड्स का अधिकतम % निर्दिष्ट करने के लिए 0-100 से एक संख्या प्रदान करेंfixed-percent है, तो मारे जाने वाले पॉड्स का % निर्दिष्ट करने के लिए 0-100 से एक संख्या प्रदान करें---
apiVersion: apps/v1
kind: Deployment
metadata:
name: monkey-victim
namespace: app-namespace
spec:
template:
metadata:
labels:
kube-monkey/enabled: enabled
kube-monkey/identifier: monkey-victim
kube-monkey/mtbf: '2'
kube-monkey/kill-mode: "fixed"
kube-monkey/kill-value: '1'
[... omitted ...]
Kubernetes के नए संस्करणों के लिए आपको लेबल्स को k8s ऐप मेटाडेटा में भी जोड़ने की आवश्यकता हो सकती है।
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: monkey-victim
namespace: app-namespace
labels:
kube-monkey/enabled: enabled
kube-monkey/identifier: monkey-victim
kube-monkey/mtbf: '2'
kube-monkey/kill-mode: "fixed"
kube-monkey/kill-value: '1'
spec:
template:
metadata:
labels:
kube-monkey/enabled: enabled
kube-monkey/identifier: monkey-victim
[... omitted ...]
// TODO: switch to using cluster DNS. नोट के साथ, आपको apiserver को ओवरराइड करने की आवश्यकता हो सकती है।[kubernetes]
host="https://your-apiserver-url.com:apiport"
अनुसूची कार्यदिवसों पर दिन में एक बार होती है - यह वह समय है जब वर्तमान दिन के लिए समापन की अनुसूची बनाई जाती है। अनुसूची के दौरान, kube-monkey:
kube-monkey/mtbf से आज मारे जाने वाले पॉड्स की संख्या निकालेगा। एक ऐप दिन में 24h/mtbf बार मारा जाता है, इसलिए एक दिन या उससे अधिक का mtbf
अधिकतम एक समापन देता है और छोटा कई समापन देता हैयह दिन के दौरान वह यादृच्छिक रूप से उत्पन्न समय है जब एक शिकार k8s ऐप का एक पॉड मारा जाएगा। समापन समय पर, kube-monkey:
kube-monkey के लिए Docker इमेजेस DockerHub पर पाई जा सकती हैं।
रिपॉजिटरी को क्लोन करें और कंटेनर बनाएँ।
go get github.com/asobti/kube-monkey
cd $GOPATH/src/github.com/asobti/kube-monkey
make build
make container
kube-monkey को पर्यावरण चर या /etc/kube-monkey/config.toml पर रखी गई toml फ़ाइल द्वारा कॉन्फ़िगर किया जाता है और kube-monkey डिप्लॉयमेंट से पहले configmap के मौजूद होने की अपेक्षा करता है।
कॉन्फ़िगरेशन कुंजियाँ और विवरण config/param/param.go में पाए जा सकते हैं।
[kubemonkey]
dry_run = true # Terminations are only logged
run_hour = 8 # Run scheduling at 8am on weekdays
start_hour = 10 # Don't schedule any pod deaths before 10am
end_hour = 16 # Don't schedule any pod deaths after 4pm
blacklisted_namespaces = ["kube-system"] # Critical apps live here
time_zone = "America/New_York" # Set tzdata timezone example. Note the field is time_zone not timezone
KUBEMONKEY_DRY_RUN=true
KUBEMONKEY_RUN_HOUR=8
KUBEMONKEY_START_HOUR=10
KUBEMONKEY_END_HOUR=16
KUBEMONKEY_BLACKLISTED_NAMESPACES=kube-system
KUBEMONKEY_TIME_ZONE=America/New_York
ध्यान दें: आपने startHour और endHour के लिए जो कुछ भी कॉन्फ़िगर किया है, उसके बावजूद यह हर 60 सेकंड में पॉड्स पर हमला करता रहेगा।
[debug]
enabled= true
schedule_immediate_kill= true
Kube-monkey सूचनाओं का समर्थन करता है और हमले के बाद आपकी पसंद के endpoint को सूचित कर सकता है। यह Slack webhook या एक कस्टम API हो सकता है।
[notifications]
enabled = true
reportSchedule = true
[notifications.attacks]
endpoint = "http://url1"
message = "message1"
headers = ["header1Key:header1Value","header2Key:header2/Value"]
संदेश निम्नलिखित प्लेसहोल्डर्स का समर्थन करता है:
{$name}: शिकार का नाम{$kind}: शिकार का प्रकार (kind){$namespace}: शिकार का नेमस्पेस{$timestamp}: Unix epoch से मिलीसेकंड में हमले का समय{$time}: हमले का समय{$date}: हमले की तारीख{$error}: परिणाम की त्रुटि, यदि कोई हो{$kubemonkeyid}: kube-monkey id (KUBE_MONKEY_ID env वेरिएबल का उपयोग करके सेट किया गया, अन्यथा खाली) message: '{
"what": "Kube-monkey(${kubemonkeyid}) attack of {$name} in {$namespace}",
"who": "{$name}",
"when": {$timestamp}
}'
हेडर एक विशेष प्लेसहोल्डर का समर्थन करता है जो पर्यावरण चर का मान प्राप्त करता है। यह किसी ऐसे API को कॉल करते समय उपयोगी है जिसका endpoint सुरक्षित है। एक सामान्य परिदृश्य Kube-monkey कंटेनर में API टोकन पास करना होगा, यह टोकन Kubernetes Secret में संग्रहीत होता है और आप इसे पर्यावरण चर के माध्यम से पास करना चाहते हैं।
headers = ["api-key:{$env:API_TOKEN}", "Content-Type:application/json"]
{$env:API_TOKEN} को पर्यावरण चर API_TOKEN के मान से बदल दिया जाएगा।
ध्यान दें यदि पर्यावरण चर मौजूद नहीं है, तो सूचना कॉल रद्द नहीं होगी। मान एक खाली स्ट्रिंग में हल हो जाएगा, और लॉग में एक चेतावनी दिखाई देगी।
मैन्युअल रूप से
kube-monkey-config-map configmap परिनियोजित करें (उदाहरण के लिए, kube-system नेमस्पेस)। सुनिश्चित करें कि keyname को config.toml के रूप में परिभाषित किया गया है।उदाहरण के लिए
kubectl create configmap km-config --from-file=config.toml=km-config.tomlयाkubectl apply -f km-config.yaml
kube-system)।उदाहरण Kubernetes yaml फ़ाइलों के लिए examples/ निर्देशिका देखें।
kubectl logs -f deployment.apps/kube-monkey --namespace=kube-system द्वारा डिबग लॉग देख सकते हैं, यहाँ deployment.apps/kube-monkey kube-monkey के लिए k8s डिप्लॉयमेंट है।Helm Chart
देखें Helm के साथ kube-monkey कैसे स्थापित करें।
kube-monkey glog का उपयोग करता है और glog की सभी कमांड-लाइन सुविधाओं का समर्थन करता है। पॉड पर कस्टम v स्तर या कस्टम लॉग निर्देशिका निर्दिष्ट करने के लिए, उदाहरण डिप्लॉयमेंट फ़ाइल में args: ["-v=5", "-log_dir=/path/to/custom/log"] देखें।
मानकीकृत glog स्तर
grep -r V\([0-9]\) *L0: कोई नहीं
L1: उच्चतम स्तर की वर्तमान स्थिति जानकारी और समापन के साथ त्रुटियाँ
L2: सफल समापन
L3: अधिक विस्तृत अनुसूची स्थिति जानकारी
L4: डिबगिंग वर्बोज़ अनुसूची और कॉन्फ़िग जानकारी
L5: स्वतः-हल किए गए महत्वहीन मुद्दे
अधिक संसाधन: k8s logging page देखें, जो लॉगिंग गंभीरता के लिए सामुदायिक परंपराएँ का सुझाव देता है।
git clone https://github.com/asobti/kube-monkey.git
cd examples
oc login http://someserver/ -u system:admin
oc project kube-system
oc create -f configmap.yaml
oc -n kube-system adm policy add-role-to-user -z deployer system:deployer
oc -n kube-system adm policy add-role-to-user -z builder system:image-builder
oc -n kube-system adm policy add-role-to-group system:image-puller system:serviceaccounts:kube-system
oc run kube-monkey --image=docker.io/ayushsobti/kube-monkey:v0.4.0 --command -- /kube-monkey -v=5 -log_dir=/var/log/kube-monkey
oc volume dc/kube-monkey --add --name=kubeconfigmap -m /etc/kube-monkey -t configmap --configmap-name=kube-monkey-config-map
git clone https://github.com/asobti/kube-monkey.git
cd examples
oc login http://someserver/ -u system:admin
oc project kube-system
oc create -f configmap.yaml
oc -n kube-system adm policy add-cluster-role-to-user edit -z default --rolebinding-name kube-monkey-edit
oc run kube-monkey --image=docker.io/ayushsobti/kube-monkey:v0.3.0 --command -- /kube-monkey -v=5 -log_dir=/var/log/kube-monkey
oc set volume dc/kube-monkey --add --name=kubeconfigmap -m /etc/kube-monkey -t configmap --configmap-name=kube-monkey-config-map
देखें योगदान कैसे करें
यह प्रोजेक्ट Apache License v2.0 के तहत लाइसेंस प्राप्त है - विवरण के लिए LICENSE फ़ाइल देखें।