أحاول. NET Core + Kubernetes + appmetrics + prometheus + grafana + jobs + check checks

معرفة موجزة مع kubernetes للمطورين بمثال نشر موقع قالب بسيط ، وإعداده للمراقبة ، وتنفيذ المهام المجدولة والفحوصات الصحية (يتم إرفاق جميع أكواد المصدر)

- تثبيت Kubernetes
- تثبيت واجهة المستخدم
- قم بتشغيل التطبيق الخاص بك في الكتلة
- إضافة مقاييس مخصصة إلى التطبيق
- جمع القياسات من خلال بروميثيوس
- عرض المقاييس في غرافانا
- المهام المجدولة
- التسامح مع الخطأ
- الاستنتاجات
- ملاحظات
- المراجع

تثبيت Kubernetes


ليست مناسبة لمستخدمي لينكس ، يجب عليك استخدام minikube
  1. هل لديك سطح مكتب عامل ميناء
  2. في ذلك تحتاج إلى البحث عن وتمكين كتلة Kubernetes عقدة واحدة
  3. الآن لديك api http: // localhost: 8001 / للعمل مع kubernetis
  4. التواصل معه يحدث من خلال kubectl فائدة مريحة
    تحقق من إصداره باستخدام الأمر> kubectl version
    آخر ما هو مكتوب هنا هو https://storage.googleapis.com/kubernetes-release/release/stable.txt
    يمكنك تنزيله على الرابط المناسب https://storage.googleapis.com/kubernetes-release/release/v1.13.2/bin/windows/amd64/kubectl.exe
  5. kubectl cluster-info أن الكتلة تعمل> kubectl cluster-info

تركيب واجهة المستخدم


  1. يتم نشر الواجهة في نفس الكتلة
     kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml 
  2. احصل على رمز مميز للوصول إلى الواجهة
     kubectl describe secret 

    ونسخة
  3. الآن ابدأ الوكيل
     kubectl proxy 
  4. ويمكنك استخدام http: // localhost: 8001 / api / v1 / مساحات الأسماء / kube-system / services / https: kubernetes-dashboard: / proxy /


تشغيل التطبيق الخاص بك في كتلة


  1. لقد تقدمت بطلب mc netcoreapp2.1 قياسي من خلال الاستوديو https://github.com/SanSYS/kuberfirst
  2. Dockerfile:
     FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY ./MetricsDemo.csproj . RUN ls RUN dotnet restore "MetricsDemo.csproj" COPY . . RUN dotnet build "MetricsDemo.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "MetricsDemo.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "MetricsDemo.dll"] 
  3. جمعت هذا الشيء مع علامة metricsdemo3
     docker build -t metricsdemo3 . 
  4. لكن! يقوم Coober افتراضيًا بسحب الصور من المحور ، لذلك أرفع السجل المحلي
  5. ملاحظة - لم يحاول تشغيل في kubernetis
     docker create -p 5000:5000 --restart always --name registry registry:2 
  6. وأنا أصف ذلك بأنه غير آمن:
     { "registry-mirrors": [], "insecure-registries": [ "localhost:5000" ], "debug": true, "experimental": false } 
  7. قبل الدخول في السجل ، لفتات أكثر
     docker start registry docker tag metricsdemo3 localhost:5000/sansys/metricsdemo3 docker push localhost:5000/sansys/metricsdemo3 
  8. سيبدو شيء مثل هذا:
  9. إطلاق عبر واجهة المستخدم



إذا بدأ ، فكل شيء على ما يرام ويمكنك البدء في العمل


إنشاء ملف نشر
1-نشر التطبيق. yaml
 kind: Deployment apiVersion: apps/v1 metadata: name: metricsdemo labels: app: web spec: replicas: 2 #    (  ) #  ,      selector: matchLabels: app: metricsdemo template: metadata: labels: app: metricsdemo #     selector  kind: Service spec: containers: - name: metricsdemo #   image: localhost:5000/sansys/metricsdemo3 #    ports: - containerPort: 80 #       # :    ,       --- kind: Service apiVersion: v1 metadata: name: metricsdemo #    __meta_kubernetes_service_name="metricsdemo",  https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config labels: apptype: business #    __meta_kubernetes_service_label_apptype="business" -  instancetype: web #    __meta_kubernetes_service_label_instancetype="web" spec: selector: app: metricsdemo #    labels:app type: LoadBalancer #      ports: - protocol: TCP #    _meta_kubernetes_service_port_protocol="TCP" port: 9376 targetPort: 80 name: portapi #    __meta_kubernetes_service_port_name="portapi" 

وصف صغير
  • النوع - يشير إلى نوع الكيان الموضح من خلال ملف yaml
  • apiVersion - ما api يتم نقل الكائن إلى
  • التسميات - تسميات فقط فقط (يمكن أن تفكر مفاتيح على اليسار والقيم من قبل نفسك)
  • محدد - يسمح لك بربط الخدمات مع النشر ، على سبيل المثال ، من خلال التسميات

التالي:
 kubectl create -f .\1-deployment-app.yaml 

وسترى النشر في الواجهة http: // localhost: 8001 / api / v1 / مساحات الأسماء / kube-system / services / https: kubernetes-dashboard: / proxy / #! / Deployment؟ Namespace = default
الشاشة

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



إضافة مقاييس مخصصة إلى التطبيق


إضافة الحزمة https://www.app-metrics.io/ إلى التطبيق
لن أصف بالتفصيل كيف سأضيفهم ، لفترة وجيزة الآن - أسجل الوسيطة لزيادة عدادات المكالمات إلى أساليب api
هنا الوسيطة
 private static void AutoDiscoverRoutes(HttpContext context) { if (context.Request.Path.Value == "/favicon.ico") return; List<string> keys = new List<string>(); List<string> vals = new List<string>(); var routeData = context.GetRouteData(); if (routeData != null) { keys.AddRange(routeData.Values.Keys); vals.AddRange(routeData.Values.Values.Select(p => p.ToString())); } keys.Add("method"); vals.Add(context.Request.Method); keys.Add("response"); vals.Add(context.Response.StatusCode.ToString()); keys.Add("url"); vals.Add(context.Request.Path.Value); Program.Metrics.Measure.Counter.Increment(new CounterOptions { Name = "api", //ResetOnReporting = true, // ,     MeasurementUnit = Unit.Calls, Tags = new MetricTags(keys.ToArray(), vals.ToArray()) }); } 

والمقاييس التي تم جمعها متوفرة في http: // localhost: 9376 / metrics



* يمكن تسجيل IMetricRoot أو تجريده بسهولة في الخدمات واستخدامه في التطبيق ( services.AddMetrics (Program.Metrics) ؛ )

جمع القياسات من خلال بروميثيوس


أبسط بروميثيوس الإعداد: إضافة وظيفة جديدة إلى التكوين الخاص به (prometheus.yml) وإطعامها هدف جديد:
 global: scrape_interval: 15s evaluation_interval: 15s rule_files: # - "first.rules" # - "second.rules" scrape_configs: - job_name: prometheus static_configs: - targets: ['localhost:9090', '__:'] 

ولكن لدى بروميثيوس دعم محلي لجمع المقاييس من kubernetis https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config
أرغب في مراقبة كل خدمة على حدة من خلال التطبيق: علامة تجارية
بعد التعرف على الرصيف ، تكون المهمة كما يلي:
 - job_name: business-metrics #     metrics_path: /metrics kubernetes_sd_configs: - role: endpoints #   .   service,pod,ingress static_configs: - targets: - localhost:9090 relabel_configs: #       default   c  apptype = business - action: keep regex: default;business source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_service_label_apptype 

في kubernetis هناك مكان خاص لتخزين ملفات التكوين - ConfigMap
أنا احفظ هذا التكوين هناك:
2-بروميثيوس-configmap.yaml
 apiVersion: v1 kind: ConfigMap #  ,   metadata: name: prometheus-config #  - namespace: default labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: EnsureExists data: #     prometheus.yml: | global: scrape_interval: 5s # Default is every 1 minute. evaluation_interval: 5s # The default is every 1 minute. scrape_configs: - job_name: prometheus static_configs: - targets: - localhost:9090 - job_name: business-metrics #     metrics_path: /metrics kubernetes_sd_configs: - role: endpoints #   .   service,pod,ingress static_configs: - targets: - localhost:9090 relabel_configs: #       default   c  apptype = business - action: keep regex: default;business source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_service_label_apptype 

رحيل إلى kubernetis
 kubectl create -f .\2-prometheus-configmap.yaml 

أنت الآن بحاجة إلى نشر prometheus مع ملف التكوين هذا
kubectl إنشاء -f. \ 3-الانتشار-prometheus.yaml
 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: prometheus namespace: default spec: replicas: 1 template: metadata: labels: app: prometheus-server spec: containers: - name: prometheus image: prom/prometheus args: - "--config.file=/etc/config/prometheus.yml" - "--web.enable-lifecycle" ports: - containerPort: 9090 volumeMounts: - name: prometheus-config-volume #    mountPath: /etc/config/ #     volumes: - name: prometheus-config-volume #     configMap: defaultMode: 420 name: prometheus-config #  - --- kind: Service apiVersion: v1 metadata: name: prometheus spec: selector: app: prometheus-server #    labels:app type: LoadBalancer #      ports: - protocol: TCP port: 9090 targetPort: 9090 

انتبه - لم يتم تحديد ملف prometheus.yml في أي مكان
جميع الملفات التي تم تحديدها في الخريطة config تصبح ملفات في قسم prometheus-config-volume ، والتي يتم تحميلها في الدليل / etc / config /
أيضا ، الحاوية لديه وسيطات بدء التشغيل مع المسار إلى التكوين
--web.enable-lifecycle - يقول أنه يمكنك سحب POST / - / إعادة التحميل ، والتي ستطبق التكوينات الجديدة (مفيدة إذا تغير التكوين "على الطاير" ولا تريد إعادة تشغيل الحاوية)

نشر فعلا
 kubectl create -f .\3-deployment-prometheus.yaml 

اتبع الخطوات الصغيرة وانتقل إلى العنوان http: // localhost: 9090 / أهداف ، يجب أن تشاهد نقاط النهاية لخدمتك هناك



وفي الصفحة الرئيسية ، يمكنك كتابة الطلبات إلى بروميثيوس
 sum by (response, action, url, app) (delta(application_api[15s])) 

شريطة أن يقوم شخص ما بزيارة الموقع ، فسوف يتحول مثل هذا


لغة الاستعلام - https://prometheus.io/docs/prometheus/latest/querying/basics/

عرض المقاييس في غرافانا


كنا محظوظين - حتى الإصدار 5 ، يمكن فقط تهيئات لوحة المعلومات من خلال واجهة برمجة تطبيقات HTTP ، ولكن الآن يمكنك القيام بنفس الخدعة كما هو الحال مع Prometeus
يمكن لـ Grafana افتراضيًا عند بدء التشغيل سحب ما يصل إلى مصدر بيانات التكوينات ولوحات المعلومات
  1. /etc/grafana/provisioning/datasources/ - التكوينات المصدر (إعدادات للوصول إلى prometeus ، postgres ، zabbiks ، مرنة ، وما إلى ذلك)
  2. /etc/grafana/provisioning/dashboards/ - إعدادات وصول إلى /etc/grafana/provisioning/dashboards/
  3. /var/lib/grafana/dashboards/ - هنا سأقوم بتخزين لوحات المعلومات بأنفسهم في شكل ملفات json

اتضح مثل هذا
 apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: null name: grafana-provisioning-datasources namespace: default data: all.yml: | datasources: - name: 'Prometheus' type: 'prometheus' access: 'proxy' org_id: 1 url: 'http://prometheus:9090' is_default: true version: 1 editable: true --- apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: null name: grafana-provisioning-dashboards namespace: default data: all.yml: | apiVersion: 1 providers: - name: 'default' orgId: 1 folder: '' type: file disableDeletion: false updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards options: path: /var/lib/grafana/dashboards --- apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: null name: grafana-dashboards namespace: default data: service-http-requests.json: | { "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "type": "dashboard" } ] }, "editable": true, "gnetId": null, "graphTooltip": 0, "links": [], "panels": [ { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "fill": 1, "gridPos": { "h": 9, "w": 12, "x": 0, "y": 0 }, "id": 2, "legend": { "alignAsTable": false, "avg": false, "current": false, "max": false, "min": false, "rightSide": true, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "sum by (response, action, url, app) (delta(application_api[15s]))", "format": "time_series", "interval": "15s", "intervalFactor": 1, "legendFormat": "{{app}} {{response}} - {{url}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Http requests", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } } ], "refresh": "5s", "schemaVersion": 16, "style": "dark", "tags": [], "templating": { "list": [] }, "time": { "from": "now-30m", "to": "now" }, "timepicker": { "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ], "time_options": [ "5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d" ] }, "timezone": "", "title": "Business metrics", "uid": "Dm0tD0Qik", "version": 1 } 

نشر نفسها ، لا شيء جديد
 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: grafana namespace: default labels: app: grafana component: core spec: replicas: 1 template: metadata: labels: app: grafana component: core spec: containers: - image: grafana/grafana name: grafana imagePullPolicy: IfNotPresent resources: limits: cpu: 100m memory: 100Mi requests: cpu: 100m memory: 100Mi env: - name: GF_AUTH_BASIC_ENABLED value: "true" - name: GF_AUTH_ANONYMOUS_ENABLED value: "true" - name: GF_AUTH_ANONYMOUS_ORG_ROLE value: Admin readinessProbe: httpGet: path: /login port: 3000 # initialDelaySeconds: 30 # timeoutSeconds: 1 volumeMounts: - name: grafana-provisioning-datasources mountPath: /etc/grafana/provisioning/datasources/ - name: grafana-provisioning-dashboards mountPath: /etc/grafana/provisioning/dashboards/ - name: grafana-dashboards mountPath: /var/lib/grafana/dashboards/ volumes: - name: grafana-provisioning-datasources configMap: defaultMode: 420 name: grafana-provisioning-datasources - name: grafana-provisioning-dashboards configMap: defaultMode: 420 name: grafana-provisioning-dashboards - name: grafana-dashboards configMap: defaultMode: 420 name: grafana-dashboards nodeSelector: beta.kubernetes.io/os: linux --- apiVersion: v1 kind: Service metadata: name: grafana namespace: default labels: app: grafana component: core spec: type: LoadBalancer ports: - protocol: TCP port: 3000 targetPort: 3000 selector: app: grafana component: core 

توسيع
 kubectl create -f .\4-grafana-configmap.yaml kubectl create -f .\5-deployment-grafana.yaml 

تذكر أن العنب لا يرتفع على الفور ، بل هو مبلل قليلا من الهجرات sqlite ، والتي يمكنك أن ترى في سجلات
اذهب الآن إلى http: // localhost: 3000 /
وانقر على لوحة القيادة




إذا كنت ترغب في إضافة طريقة عرض جديدة أو تغيير طريقة عرض حالية - قم بتغييرها مباشرة في الواجهة ، ثم انقر فوق حفظ ، ستحصل على نافذة مشروطة مع json ، والتي تحتاج إلى وضعها في خريطة التكوين
يتم نشر كل شيء ويعمل بشكل رائع

المهام المجدولة


لأداء المهام على التاج في cuber ، هناك مفهوم CronJob
مع CronJob ، يمكنك تعيين جدول زمني لأي مهمة ، أبسط مثال:
 # https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/ apiVersion: batch/v1beta1 kind: CronJob metadata: name: runapijob spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: runapijob image: busybox args: - /bin/sh - -c - date; wget -O - http://metricsdemo:9376/api/job/run/wakeUp > /dev/null restartPolicy: OnFailure 

قسم الجدول الزمني يحدد القاعدة الكلاسيكية للتاج
يبدأ المشغل قرنة الحاوية (busybox) التي أسحب فيها طريقة api لخدمة metricsdemo
يمكنك استخدام الأمر لتتبع المهمة.
 kubectl.exe get cronjob runapijob --watch 



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

من أجل تصحيح المهمة ، يمكنك التشغيل يدويًا

عرض توضيحي صغير على سبيل المثال لحساب عدد π ، حول الفرق في عمليات الإطلاق من وحدة التحكم
 #   ,       -      kubectl run pi --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)' #   . , ,  .   -   kubectl run pi --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)' #    5  kubectl run pi --image=perl --restart=OnFailure --schedule="0/5 * * * ?" -- perl -Mbignum=bpi -wle 'print bpi(2000)' 


خطأ التسامح


إذا تم إنهاء التطبيق بشكل غير متوقع ، تتم إعادة تشغيل نظام المجموعة
على سبيل المثال ، لقد تقدمت بطريقة تسقط api
 [HttpGet("kill/me")] public async void Kill() { throw new Exception("Selfkill"); } 

* الاستثناء الذي حدث في api في طريقة الفراغ غير المتزامن يعتبر استثناء غير معالَج ، والذي يعطل التطبيق بالكامل

أناشد نداء إلى http: // localhost: 9376 / api / job / kill / me
تظهر قائمة الموقد أنه قد تمت إعادة تشغيل أحد مآخذ الخدمة



يعرض أمر السجلات المخرجات الحالية ، وباستخدام الخيار -p سيعرض سجلات المثيل السابق. بهذه الطريقة يمكنك معرفة سبب إعادة التشغيل.

أعتقد بسقوط بسيط ، كل شيء واضح: سقط - وردة

لكن يمكن أن يكون التطبيق مباشرًا على نحو مشروط ، أي لا تسقط ، ولكن لا تفعل أي شيء ، أو القيام بعمله ، ولكن ببطء

وفقًا للوثائق ، هناك نوعان على الأقل من اختبارات "البقاء على قيد الحياة" للتطبيقات الموجودة في السنفات
  1. الاستعداد - يستخدم هذا النوع من التحقق لفهم ما إذا كان من الممكن بدء حركة المرور على هذا الملف. إذا لم يكن الأمر كذلك ، يتم تحرير الجراب حتى يعود إلى طبيعته.
  2. حيوية - التحقق من التطبيق "من أجل البقاء". على وجه الخصوص ، إذا لم يكن هناك وصول إلى مورد حيوي أو إذا لم يستجب التطبيق على الإطلاق (على سبيل المثال ، حالة توقف تام وبالتالي مهلة) ، فسيتم إعادة تشغيل الحاوية. جميع رموز المتشعب بين 200 و 400 تعتبر ناجحة ، والباقي تفشل

سوف أتحقق من إعادة التشغيل بحلول المهلة المحددة ، لذلك سأضيف طريقة api جديدة ، والتي وفقًا لأمر معين ستبدأ في إبطاء طريقة التحقق من البقاء لمدة 123 ثانية

 static bool deadlock; [HttpGet("alive/{cmd}")] public string Kill(string cmd) { if (cmd == "deadlock") { deadlock = true; return "Deadlocked"; } if (deadlock) Thread.Sleep(123 * 1000); return deadlock ? "Deadlocked!!!" : "Alive"; } 


أقوم بإضافة قسمين إلى ملف 1-الانتشار-app.yaml في الحاوية:
 containers: - name: metricsdemo image: localhost:5000/sansys/metricsdemo3:6 ports: - containerPort: 80 readinessProbe: #       httpGet: path: /health port: 80 initialDelaySeconds: 5 periodSeconds: 5 livenessProbe: #      httpGet: path: /api/job/alive/check port: 80 initialDelaySeconds: 5 periodSeconds: 5 

Redeply ، أنا متأكد من أن التطبيق قد بدأ والاشتراك في الأحداث
 kubectl get events --watch 

أضغط على القائمة Deadlock me ( http: // localhost: 9376 / api / job / alive / deadlock )



وخلال خمس ثوان أبدأ في ملاحظة المشكلة وحلها

 1s Warning Unhealthy Pod Liveness probe failed: Get http://10.1.0.137:80/api/job/alive/check: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 1s Warning Unhealthy Pod Liveness probe failed: Get http://10.1.0.137:80/api/job/alive/check: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 0s Warning Unhealthy Pod Liveness probe failed: Get http://10.1.0.137:80/api/job/alive/check: net/http: request canceled (Client.Timeout exceeded while awaiting headers) 0s Warning Unhealthy Pod Readiness probe failed: Get http://10.1.0.137:80/health: dial tcp 10.1.0.137:80: connect: connection refused 0s Normal Killing Pod Killing container with id docker://metricsdemo:Container failed liveness probe.. Container will be killed and recreated. 0s Normal Pulled Pod Container image "localhost:5000/sansys/metricsdemo3:6" already present on machine 0s Normal Created Pod Created container 0s Normal Started Pod Started container 


الاستنتاجات


  1. من ناحية ، تبين أن حد الدخول أقل بكثير مما كنت أعتقد ، من ناحية أخرى ، فهو ليس كتلة kubernetes حقيقية على الإطلاق ، ولكن فقط كمبيوتر مطور. ولم يتم النظر في القيود المفروضة على الموارد ، والتطبيقات الحكومية ، واختبار a / b ، وما إلى ذلك.
  2. جربت بروميتوس ذلك للمرة الأولى ، لكن قراءة مختلف الوثائق والأمثلة خلال مراجعة cuber أوضحت أنه من الجيد جدًا جمع المقاييس من المجموعة والتطبيقات
  3. إنه جيد جدًا لدرجة أنه يسمح للمطور بتنفيذ ميزة على جهاز الكمبيوتر الخاص به وإرفاقها ، بالإضافة إلى المعلومات المتعلقة بالنشر ، ونشر الجدول الزمني في graphan. ونتيجة لذلك ، فإن المقاييس الجديدة تلقائيًا دون إضافية. ستبدأ الجهود ليتم عرضها على خشبة المسرح وهمز. مريحة


ملاحظات


  1. يمكن للتطبيقات الاتصال ببعضها البعض من خلال : ، وهو ما تم مع grafana → prometeus. بالنسبة لأولئك المطلعين على عامل الميناء ، لا يوجد شيء جديد
  2. kubectl create -f file.yml - إنشاء كيان
  3. kubectl delete -f file.yml - حذف كيان
  4. kubectl get pod - الحصول على قائمة بجميع الموقد (الخدمة ، نقاط النهاية ...)
    • - مساحة الاسم --namespace=kube-system - التصفية حسب مساحة الاسم
    • -n kube-system - بالمثل
  5. kubectl -it exec grafana-d8d4d9f5c-cvnkh -- /bin/bash - مرفق في القاع
  6. kubectl delete service grafana - حذف الخدمة ، جراب. نشر (- جميع - حذف الكل)
  7. kubectl describe - وصف الكيان (يمكنك القيام به في وقت واحد)
  8. kubectl edit service metricsdemo - تحرير جميع yamls على الطاير من خلال إطلاق المفكرة
    عرض
  9. kubectl --help - kubectl --help - kubectl --help كبيرة)
  10. المشكلة النموذجية هي وجود جراب (ضع في اعتبارك الصورة قيد التشغيل) ، حدث خطأ ما ولا توجد خيارات ، باستثناء أنه لا توجد طريقة لتصحيح الأخطاء في الداخل (عبر tcpdump / nc وما إلى ذلك). - Yuzai kubectl-debug habr.com/ar/company/flant/blog/436112


المراجع


  1. ما هي مقاييس التطبيق؟
  2. Kubernetes
  3. بروميثيوس
  4. التكوين مسبقا grafana
  5. لمعرفة كيف يفعل الناس (ولكن هناك بالفعل بعض الأشياء التي عفا عليها الزمن) - هناك ، من حيث المبدأ ، هناك أيضا حول التسجيل ، والتنبيهات ، الخ
  6. Helm - مدير الحزم في Kubernetes - من خلاله ، كان من السهل تنظيم prometeus + grafana ، لكن يدويًا - يظهر المزيد من التفاهم
  7. مكعبات بروميثيوس من كوبر
  8. قصص فشل Kubernetes
  9. Kubernetes-HA. نشر نظام تجاوز الفشل Kubernetes مع 5 المعالجات

شفرة المصدر والمربيات المتاحة على جيثب

Source: https://habr.com/ru/post/ar437286/


All Articles