
عند تشخيص المشكلات في كتلة Kubernetes ، نلاحظ غالبًا أن إحدى العقد العنقودية تتلاشى * وبطبيعة الحال ، هذا أمر نادر الحدوث. لذلك توصلنا إلى الحاجة إلى أداة من شأنها إجراء
اختبار ping من كل عقدة إلى كل عقدة وتقديم نتائج عملها في شكل
مقاييس Prometheus . سيتعين علينا فقط رسم الرسوم البيانية في Grafana وتوطين العقدة الفاشلة بسرعة (وإذا لزم الأمر ، قم بإزالة جميع القرون منه ، ثم القيام بالعمل المقابل **) ...
* بواسطة "رذاذ" أفهم أن العقدة يمكن أن تذهب إلى حالة NotReady
والعودة فجأة إلى العمل. أو ، على سبيل المثال ، قد لا يصل جزء من حركة المرور في pods إلى pods على العقد المجاورة.** لماذا تنشأ مثل هذه الحالات؟ قد يكون أحد مشكلات الشبكة على التبديل في مركز البيانات أحد الأسباب الشائعة. على سبيل المثال ، بمجرد تكوين Hetzner ، قمنا بتكوين vswitch ، ولكن في لحظة رائعة توقفت عن الوصول إلى إحدى العقد على هذا المنفذ vswitch: ولهذا السبب ، تبين أن العقدة كانت غير قابلة للوصول تمامًا على الشبكة المحلية.بالإضافة إلى ذلك ، نود أن
نطلق هذه الخدمة مباشرة في Kubernetes ، بحيث يحدث النشر الكامل باستخدام تثبيت مخطط Helm. (توقع الأسئلة - في حالة استخدام Ansible نفسه ، سيتعين علينا كتابة الأدوار في بيئات مختلفة: AWS و GCE والمعادن العارية ...) وبعد قليل من البحث في الإنترنت عن أدوات جاهزة للمهمة ، لم نجد أي شيء مناسب. لذلك ، جعلوا خاصة بهم.
النصي والتكوينات
لذلك ، فإن المكون الرئيسي
.status.addresses
هو
البرنامج النصي الذي يراقب التغيير في أي عقد في حقل
.status.addresses
، وإذا كانت العقدة قد غيرت هذا الحقل (على سبيل المثال ، تمت إضافة عقدة جديدة) ، فإنها ترسل قيم Helm إلى المخطط باستخدام هذه قائمة العقد في شكل ConfigMap:
--- apiVersion: v1 kind: ConfigMap metadata: name: node-ping-config namespace: kube-prometheus data: nodes.json: > {{ .Values.nodePing.nodes | toJson }}
يتم تشغيله على كل عقدة ويرسل حزم ICMP إلى جميع مثيلات نظام Kubernetes الأخرى مرتين في الثانية ، ويتم كتابة النتائج في الملفات النصية.
يتم تضمين البرنامج النصي في
صورة Docker :
FROM python:3.6-alpine3.8 COPY rootfs / WORKDIR /app RUN pip3 install --upgrade pip && pip3 install -r requirements.txt && apk add --no-cache fping ENTRYPOINT ["python3", "/app/node-ping.py"]
بالإضافة إلى ذلك ، تم إنشاء
ServiceAccount ودوره ، مما يسمح فقط باستلام قائمة العقد (لمعرفة عناوينهم):
--- apiVersion: v1 kind: ServiceAccount metadata: name: node-ping namespace: kube-prometheus --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kube-prometheus:node-ping rules: - apiGroups: [""] resources: ["nodes"] verbs: ["list"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kube-prometheus:kube-node-ping subjects: - kind: ServiceAccount name: node-ping namespace: kube-prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kube-prometheus:node-ping
أخيرًا ، تحتاج إلى
DaemonSet ، والذي يعمل على كل مثيلات الكتلة:
--- apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: node-ping namespace: kube-prometheus labels: tier: monitoring app: node-ping version: v1 spec: updateStrategy: type: RollingUpdate template: metadata: labels: name: node-ping spec: terminationGracePeriodSeconds: 0 tolerations: - operator: "Exists" serviceAccountName: node-ping priorityClassName: cluster-low containers: - resources: requests: cpu: 0.10 image: private-registry.flant.com/node-ping/node-ping-exporter:v1 imagePullPolicy: Always name: node-ping env: - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: PROMETHEUS_TEXTFILE_DIR value: /node-exporter-textfile/ - name: PROMETHEUS_TEXTFILE_PREFIX value: node-ping_ volumeMounts: - name: textfile mountPath: /node-exporter-textfile - name: config mountPath: /config volumes: - name: textfile hostPath: path: /var/run/node-exporter-textfile - name: config configMap: name: node-ping-config imagePullSecrets: - name: antiopa-registry
السكتات الدماغية ملخص في الكلمات:
- نتائج سيناريو Python - أي الملفات النصية الموضوعة على الجهاز المضيف في الدليل
/var/run/node-exporter-textfile
source-textfile ، تحصل على DaemonSet-source source. تشير الوسائط لتشغيله إلى --collector.textfile.directory /host/textfile
، حيث يكون /host/textfile
هو hostPath على /var/run/node-exporter-textfile
source /var/run/node-exporter-textfile
. (يمكنك أن تقرأ عن جامع textfile في مصدر العقدة هنا .) - نتيجةً لذلك ، يقوم مصدر - العقدة بقراءة هذه الملفات ، ويقوم بروميثيوس بجمع كل البيانات من مصدر العقدة.
ماذا حدث؟
الآن - إلى النتيجة التي طال انتظارها. عندما يتم إنشاء هذه المقاييس ، يمكننا أن ننظر إليها ، وبطبيعة الحال ، رسم الرسوم البيانية البصرية. هذا هو كيف يبدو.
أولاً ، هناك كتلة عامة لها القدرة (باستخدام المحدد) لتحديد قائمة العقد التي يتم تنفيذ اختبار ping منها. هذا هو
جدول الملخص لل ping بين العقد المحددة للفترة المحددة في لوحة القيادة Grafana:

وهنا الرسوم البيانية مع معلومات عامة
عن العقد المحددة :

لدينا أيضًا قائمة بالأسطر ، كل منها عبارة عن رسم بياني
لعقدة واحدة منفصلة عن محدد
عقدة المصدر :

إذا قمت بتوسيع مثل هذا الخط ، فيمكنك الاطلاع على معلومات عن الأصوات
من عقدة محددة إلى جميع العناصر الأخرى التي تم تحديدها في محدد
العقد الوجهة :

هذه المعلومات في الرسوم البيانية:

أخيرًا ، كيف ستبدو الرسوم البيانية العزيزة عند استخدام ping الفقراء بين العقد؟


إذا لاحظت ذلك في بيئة حقيقية - فقد حان الوقت لمعرفة الأسباب.
PS
اقرأ أيضًا في مدونتنا: