
تُنهي بشكل دوري Pods عشوائية في Kubernetes لاختبار كيفية تصرّف الأنظمة عند تعرّضها لفشل عشوائي في Pods، مع دعم مرشحات namespace وlabel وannotation والجدولة الزمنية لإجراء تجارب فوضى خاضعة للتحكم.
chaoskube تقوم بشكل دوري بقتل pods عشوائية في عنقود Kubernetes الخاص بك.

اختبر كيف يتصرف نظامك تحت حالات فشل pods عشوائية.
عند تشغيله، سيقتل pod في أي namespace كل 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 تسمح بتصفية pods المستهدفة حسب namespaces وlabels وannotations والعمر وكذلك استبعاد أيام معينة من الأسبوع، وأوقات معينة من اليوم، وأيام معينة من السنة من الفوضى (chaos).
يمكنك تثبيت chaoskube باستخدام Helm. اتبع دليل Helm للبدء السريع ثم ثبّت مخطط (chart) chaoskube.
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
راجع chaoskube على kubeapps.com لتعلّم كيفية إعداده وللعثور على مخططات Helm مفيدة أخرى.
راجع المانيفست المثال. تأكد من منح chaoskube الصلاحيات المناسبة باستخدام ClusterRole الموفّر.
افتراضيًا، يكون chaoskube ودودًا ولا يقتل أي شيء. عندما تتحقق من عنقودك المستهدف، يمكنك تعطيل وضع dry-run بتمرير العلامة --no-dry-run. يمكنك أيضًا تحديد فترة زمنية أكثر تكرارًا وعلامات أخرى مدعومة لنشرك.
إذا كنت تعمل داخل عنقود Kubernetes وتريد استهداف العنقود نفسه، فهذا كل ما تحتاج إليه.
إذا كنت تريد استهداف عنقود مختلف أو تشغيله محليًا، فحدد عنقودك عبر علامة --master أو وفّر kubeconfig صالحًا عبر علامة --kubeconfig. افتراضيًا، يستخدم مسار kubeconfig القياسي في مجلدك الرئيسي. وهذا يعني أنه سيتم استهداف أي سياق (context) حالي موجود فيه.
إذا أردت زيادة أو تقليل مقدار الفوضى، غيّر الفترة الزمنية بين عمليات القتل بعلامة --interval. بدلًا من ذلك، يمكنك زيادة عدد نسخ (replicas) نشر chaoskube.
تذكّر أن chaoskube يقتل افتراضيًا أي pod في جميع namespaces الخاصة بك، بما في ذلك pods النظام ونفسه.
chaoskube يوفّر نقطة نهاية HTTP بسيطة يمكن استخدامها للتحقق من أنه يعمل. يمكن استخدامها لـ فحوصات liveness و readiness الخاصة بـ Kubernetes. افتراضيًا، يستمع على المنفذ 8080. لتعطيل ذلك، مرّر --metrics-address="" إلى chaoskube.
ومع ذلك، يمكنك تقييد نطاق بحث chaoskube عبر توفير محددات label وannotation وnamespace، وأنماط تضمين/استبعاد لأسماء pods، بالإضافة إلى إعداد حد أدنى للعمر.
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
يحدد هذا جميع pods التي تحتوي على label app بقيمة mate، وlabel chaos بأي قيمة، وlabel stage غير مضبوطة على production أو غير مضبوطة.
يمكنك أيضًا تصفية pods المستهدفة بمحدد namespace.
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
سيؤدي هذا إلى تصفية pods في namespaces الثلاثة default وstaging وtesting.
يمكن تصفية namespaces أيضًا بمحدد label خاص بالـ namespaces.
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
سيؤدي هذا إلى استبعاد جميع pods من namespaces التي تحمل label integration.
يمكنك تصفية pods المستهدفة بمحدد kind الخاص بـ OwnerReference.
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
سيؤدي هذا إلى استبعاد أي pods من نوع DaemonSet وStatefulSet.
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
سيؤدي هذا إلى تضمين أي pods من نوع DaemonSet فقط.
يرجى ملاحظة: أي عامل تصفية include سيستبعد تلقائيًا جميع pods التي لا تحتوي على OwnerReference محدد.
يمكنك تصفية pods بالاسم:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
سيؤدي هذا إلى استهداف فقط pods التي يحتوي اسمها على 'foo' أو 'bar' ولا يحتوي لا على 'prod'.
يمكنك أيضًا استبعاد namespaces والجمع بين محددات label وannotation.
$ 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"
يحدّ هذا أيضًا من نطاق بحث محدد label أعلاه عبر استبعاد أي pods في namespaces kube-system وproduction وتجاهل جميع pods الموسومة بأنها حرجة (critical).
يمكن أيضًا استخدام محدد annotation لتشغيل chaoskube كإضافة (addon) للعنقود والسماح للـ pods بالاشتراك في أن يتم إنهاؤها كما تراه مناسبًا. على سبيل المثال، يمكنك تشغيل 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
ما لم تكن تستخدم هذا الـ annotation في مكان آخر، فسيتجاهل هذا جميع pods في البداية (يمكنك رؤية عدد المرشحين في وضع التصحيح). يمكنك بعد ذلك اختياريا إشراك نشرات (deployments) فردية في وضع الفوضى عبر إضافة تعليق توضيحي (annotation) إلى pods الخاصة بها بالقيمة 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:
...
يمكنك استبعاد pods التي بدأت مؤخرًا باستخدام علامة --minimum-age.
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
يمكنك تحديد الوقت الذي تُدخَل فيه الفوضى حسب أيام الأسبوع، أو فترات زمنية من اليوم، أو أيام من السنة، أو كل ذلك معًا.