
تطبيق لأداة Chaos Monkey من Netflix لمجموعات Kubernetes
kube-monkey هو تطبيق لـ Netflix's Chaos Monkey لمجموعات Kubernetes. يقوم بحذف Pods الخاصة بـ Kubernetes (k8s) بشكل عشوائي في المجموعة، مما يشجع ويختبر تطوير خدمات مقاومة للفشل.
انضم إلينا على #kube-monkey في Kubernetes Slack.
يعمل kube-monkey في ساعة محددة مسبقًا (run_hour، الافتراضي هو 8 صباحًا) في أيام الأسبوع، ويبني جدولًا لعمليات النشر التي ستواجه موت Pod عشوائي في وقت ما خلال نفس اليوم. النطاق الزمني خلال اليوم الذي قد يحدث فيه موت Pod العشوائي قابل للتهيئة والافتراضي هو من 10 صباحًا إلى 4 مساءً.
يمكن ضبط kube-monkey مع قائمة من مساحات الأسماء
لتعطيل القائمة السوداء، قم بتوفير [""] في config.param blacklisted_namespaces.
يعمل kube-monkey بنموذج اشتراك اختياري (opt-in) ولن يقوم بجدولة عمليات إنهاء إلا لتطبيقات Kubernetes (k8s) التي وافقت صراحةً على إنهاء Pods الخاصة بها بواسطة kube-monkey.
يتم الاشتراك الاختياري عن طريق تعيين التسميات التالية على تطبيق k8s:
kube-monkey/enabled: اضبطه على "enabled" للاشتراك الاختياري في kube-monkey
kube-monkey/mtbf: متوسط الوقت بين الأعطال، كرقم صحيح ووحدة: d للأيام، h للساعات أو m للدقائق. على سبيل المثال، إذا تم ضبطه على "3d"، يمكن لتطبيق k8s أن يتوقع قتل Pod كل ثالث يوم عمل تقريبًا، وإذا تم ضبطه على "2h"، فيمكنه توقع خسارة Pod كل ساعتين. القيمة بدون وحدة تُقرأ كأيام، لذا "3" و**"3d"** تعنيان الشيء نفسه. أقصر متوسط وقت بين الأعطال هو دقيقة واحدة. لاحظ أن جميع عمليات الإنهاء تحدث داخل نافذة التشغيل اليومية (انظر start_hour و end_hour)، لذا فإن mtbf أقصر من يوم يضع عمليات إنهاء ذلك اليوم في تلك النافذة.
kube-monkey/identifier: معرّف فريد لتطبيقات k8s. يُستخدم لتحديد الـ Pods التي تنتمي إلى تطبيق k8s لأن الـ Pods ترث التسميات من تطبيق k8s الخاص بها. لذلك، إذا اكتشف kube-monkey أن التطبيق قد سجّل ليكون ضحية، فسيبحث kube-monkey عن جميع الـ Pods التي تحمل التسمية لتحديد أي الـ Pods مرشحة للقتل. التوصية هي ضبط هذه القيمة لتكون نفس اسم التطبيق.
: السلوك الافتراضي هو أن يقتل kube-monkey Pod واحدًا فقط من تطبيقك. يمكنك تجاوز هذا السلوك بتعيين القيمة إلى:
kill-all إذا كنت تريد أن يقتل kube-monkey جميع الـ Pods الخاصة بك بغض النظر عن حالتها (بما في ذلك الـ Pods غير الجاهزة وغير العاملة). لا يتطلب kill-value. استخدم هذه التسمية بحذر.fixed إذا كنت تريد قتل عدد محدد من الـ Pods العاملة باستخدام kill-value. إذا حددت رقمًا أكبر من الموجود، فسيقتل جميع الـ Pods العاملة ويصدر تحذيرًا.random-max-percent لتحديد أقصى % باستخدام kill-value يمكن قتلها. في الوقت المجدول، سيتم إنهاء % عشوائية محددة بشكل موحد من الـ Pods العاملة.fixed-percent لتحديد نسبة % ثابتة باستخدام kill-value يمكن قتلها. في الوقت المجدول، سيتم إنهاء % ثابتة محددة من الـ Pods العاملة.kube-monkey/kill-value: حدد قيمة لـ kill-mode
fixed، قم بتوفير عدد صحيح للـ Pods التي سيتم قتلهاrandom-max-percent، قم بتوفير رقم من 0 إلى 100 لتحديد الحد الأقصى % من الـ Pods التي يمكن لـ kube-monkey قتلهاfixed-percent، قم بتوفير رقم من 0 إلى 100 لتحديد % الـ Pods المطلوب قتلها---
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 ليوم أو أكثر يمنح إنهاءً واحدًا على الأكثر، وmtbf أقصر يمنح عدة إنهاءاتهذا هو الوقت العشوائي المولّد خلال اليوم الذي سيكون لتطبيق k8s ضحية فيه Pod مقتول. في وقت الإنهاء، سيقوم kube-monkey بـ:
يمكن العثور على صور Docker الخاصة بـ kube-monkey على DockerHub
استنسخ المستودع وقم ببناء الحاوية.
go get github.com/asobti/kube-monkey
cd $GOPATH/src/github.com/asobti/kube-monkey
make build
make container
يتم إعداد kube-monkey عبر متغيرات البيئة أو ملف toml موضوع في /etc/kube-monkey/config.toml، ويتوقع أن يكون configmap موجودًا قبل نشر kube-monkey.
يمكن العثور على مفاتيح الإعداد وأوصافها في 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
ملاحظة: سيستمر هذا في مهاجمة الـ Pods كل 60 ثانية بغض النظر عن ما قمت بإعداده لـ startHour و endHour.
[debug]
enabled= true
schedule_immediate_kill= true
يدعم Kube-monkey الإشعارات ويمكنه إخطار نقطة نهاية من اختيارك بعد وقوع هجوم. يمكن أن تكون خطاف ويب Slack أو API مخصصًا.
[notifications]
enabled = true
reportSchedule = true
[notifications.attacks]
endpoint = "http://url1"
message = "message1"
headers = ["header1Key:header1Value","header2Key:header2/Value"]
تدعم الرسالة العناصر النائبة التالية:
{$name}: اسم الضحية{$kind}: نوع الضحية{$namespace}: مساحة اسم الضحية{$timestamp}: وقت الهجوم منذ عصر Unix بالمللي ثانية{$time}: وقت الهجوم{$date}: تاريخ الهجوم{$error}: خطأ النتيجة، إن وجد{$kubemonkeyid}: معرّف kube-monkey (يُعيّن باستخدام متغير البيئة KUBE_MONKEY_ID وإلا يكون فارغًا) message: '{
"what": "Kube-monkey(${kubemonkeyid}) attack of {$name} in {$namespace}",
"who": "{$name}",
"when": {$timestamp}
}'
يدعم الترويسة عنصرًا نائبًا خاصًا لاسترداد قيمة متغير بيئة. وهذا مفيد عند استدعاء API له نقطة نهاية محمية. السيناريو النموذجي هو تمرير رمز API إلى حاوية Kube-monkey، حيث يتم تخزين هذا الرمز في Kubernetes Secret وتريد تمريره عبر متغير بيئة.
headers = ["api-key:{$env:API_TOKEN}", "Content-Type:application/json"]
سيتم استبدال {$env:API_TOKEN} بقيمة متغير البيئة API_TOKEN.
لاحظ أنه إذا لم يكن متغير البيئة موجودًا، فلن يتم إلغاء استدعاء الإشعار. ستُحل القيمة إلى سلسلة فارغة، وسيظهر تحذير في السجلات.
يدويًا
kube-monkey-config-map في مساحة الاسم التي تنوي تشغيل kube-monkey فيها (على سبيل المثال، مساحة الاسم kube-system). تأكد من تعريف اسم المفتاح كـ config.tomlعلى سبيل المثال
kubectl create configmap km-config --from-file=config.toml=km-config.tomlأوkubectl apply -f km-config.yaml
kube-system).انظر إلى دليل examples/ للحصول على أمثلة على ملفات Kubernetes yaml.
kubectl logs -f deployment.apps/kube-monkey --namespace=kube-system. هنا deployment.apps/kube-monkey هو نشر k8s الخاص بـ kube-monkey.Helm Chart
انظر كيفية تثبيت kube-monkey مع Helm.
يستخدم kube-monkey glog ويدعم جميع ميزات سطر الأوامر الخاصة بـ glog. لتحديد مستوى v مخصص أو دليل سجلات مخصص على الـ Pod، راجع args: ["-v=5", "-log_dir=/path/to/custom/log"] في ملف النشر المثال
مستويات glog المعيارية
grep -r V\([0-9]\) *L0: لا شيء
L1: أعلى مستوى لمعلومات الحالة الحالية والأخطاء المتعلقة بعمليات الإنهاء
L2: عمليات الإنهاء الناجحة
L3: معلومات حالة الجدولة الأكثر تفصيلاً
L4: تصحيح معلومات الجدولة والإعداد المفصّلة
L5: المشكلات غير المهمة التي تم حلها تلقائيًا
مزيد من الموارد: راجع صفحة تسجيل k8s التي تقترح أعراف المجتمع لشدة التسجيل
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 للحصول على التفاصيل.
fookube-monkey/identifier: fookube-monkey/kill-mode