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

- الآن لديك api http: // localhost: 8001 / للعمل مع kubernetis
- التواصل معه يحدث من خلال 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 kubectl cluster-info
أن الكتلة تعمل> kubectl cluster-info
تركيب واجهة المستخدم
- يتم نشر الواجهة في نفس الكتلة
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
- احصل على رمز مميز للوصول إلى الواجهة
kubectl describe secret
ونسخة

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

تشغيل التطبيق الخاص بك في كتلة
- لقد تقدمت بطلب mc netcoreapp2.1 قياسي من خلال الاستوديو https://github.com/SanSYS/kuberfirst
- 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"]
- جمعت هذا الشيء مع علامة metricsdemo3
docker build -t metricsdemo3 .
- لكن! يقوم Coober افتراضيًا بسحب الصور من المحور ، لذلك أرفع السجل المحلي
- ملاحظة - لم يحاول تشغيل في kubernetis
docker create -p 5000:5000 --restart always --name registry registry:2
- وأنا أصف ذلك بأنه غير آمن:

{ "registry-mirrors": [], "insecure-registries": [ "localhost:5000" ], "debug": true, "experimental": false }
- قبل الدخول في السجل ، لفتات أكثر
docker start registry docker tag metricsdemo3 localhost:5000/sansys/metricsdemo3 docker push localhost:5000/sansys/metricsdemo3
- سيبدو شيء مثل هذا:

إذا بدأ ، فكل شيء على ما يرام ويمكنك البدء في العمل
إنشاء ملف نشر
1-نشر التطبيق. yaml kind: Deployment apiVersion: apps/v1 metadata: name: metricsdemo labels: app: web spec: replicas: 2
وصف صغير
- النوع - يشير إلى نوع الكيان الموضح من خلال ملف 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",
والمقاييس التي تم جمعها متوفرة في
http: // localhost: 9376 / metrics
* يمكن تسجيل IMetricRoot أو تجريده بسهولة في الخدمات واستخدامه في التطبيق (
services.AddMetrics (Program.Metrics) ؛ )
جمع القياسات من خلال بروميثيوس
أبسط بروميثيوس الإعداد: إضافة وظيفة جديدة إلى التكوين الخاص به (prometheus.yml) وإطعامها هدف جديد:
global: scrape_interval: 15s evaluation_interval: 15s rule_files:
ولكن لدى بروميثيوس دعم محلي لجمع المقاييس من kubernetis
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_configأرغب في مراقبة كل خدمة على حدة من خلال التطبيق: علامة تجارية
بعد التعرف على الرصيف ، تكون المهمة كما يلي:
- job_name: business-metrics
في kubernetis هناك مكان خاص لتخزين ملفات التكوين -
ConfigMapأنا احفظ هذا التكوين هناك:
2-بروميثيوس-configmap.yaml apiVersion: v1 kind: ConfigMap
رحيل إلى 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
انتبه - لم يتم تحديد ملف 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 افتراضيًا عند بدء التشغيل
سحب ما يصل إلى مصدر بيانات
التكوينات ولوحات المعلومات
/etc/grafana/provisioning/datasources/
- التكوينات المصدر (إعدادات للوصول إلى prometeus ، postgres ، zabbiks ، مرنة ، وما إلى ذلك)/etc/grafana/provisioning/dashboards/
- إعدادات وصول إلى /etc/grafana/provisioning/dashboards/
/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
نشر نفسها ، لا شيء جديد 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
توسيع
kubectl create -f .\4-grafana-configmap.yaml kubectl create -f .\5-deployment-grafana.yaml
تذكر أن العنب لا يرتفع على الفور ، بل هو مبلل قليلا من الهجرات sqlite ، والتي يمكنك أن
ترى في سجلاتاذهب الآن إلى
http: // localhost: 3000 /وانقر على لوحة القيادة


إذا كنت ترغب في إضافة طريقة عرض جديدة أو تغيير طريقة عرض حالية - قم بتغييرها مباشرة في الواجهة ، ثم انقر فوق حفظ ، ستحصل على نافذة مشروطة مع json ، والتي تحتاج إلى وضعها في خريطة التكوين
يتم نشر كل شيء ويعمل بشكل رائع المهام المجدولة
لأداء المهام على التاج في cuber ، هناك مفهوم CronJob
مع CronJob ، يمكنك تعيين جدول زمني لأي مهمة ، أبسط مثال:
قسم الجدول الزمني يحدد القاعدة الكلاسيكية للتاج
يبدأ المشغل قرنة الحاوية (busybox) التي أسحب فيها طريقة api لخدمة metricsdemo
يمكنك استخدام الأمر لتتبع المهمة.
kubectl.exe get cronjob runapijob --watch

يتم إطلاق الخدمة الرئيسية التي تنطلق من الوظيفة في العديد من الحالات ، لأن الاتصال بالخدمة يذهب إلى أحد الموقد مع انتشار منتظم تقريبًا
من أجل تصحيح المهمة ، يمكنك التشغيل يدويًا عرض توضيحي صغير على سبيل المثال لحساب عدد π ، حول الفرق في عمليات الإطلاق من وحدة التحكم
خطأ التسامح
إذا تم إنهاء التطبيق بشكل غير متوقع ، تتم إعادة تشغيل نظام المجموعة
على سبيل المثال ، لقد تقدمت بطريقة تسقط api
[HttpGet("kill/me")] public async void Kill() { throw new Exception("Selfkill"); }
* الاستثناء الذي حدث في api في طريقة الفراغ غير المتزامن يعتبر استثناء غير معالَج ، والذي يعطل التطبيق بالكاملأناشد نداء إلى
http: // localhost: 9376 / api / job / kill / meتظهر قائمة الموقد أنه قد تمت إعادة تشغيل أحد مآخذ الخدمة

يعرض أمر السجلات المخرجات الحالية ، وباستخدام الخيار -p سيعرض سجلات المثيل السابق. بهذه الطريقة يمكنك معرفة سبب إعادة التشغيل.
أعتقد بسقوط بسيط ، كل شيء واضح: سقط - وردة
لكن يمكن أن يكون التطبيق مباشرًا على نحو مشروط ، أي لا تسقط ، ولكن لا تفعل أي شيء ، أو القيام بعمله ، ولكن ببطء
وفقًا
للوثائق ، هناك نوعان على الأقل من اختبارات "البقاء على قيد الحياة" للتطبيقات الموجودة في السنفات
- الاستعداد - يستخدم هذا النوع من التحقق لفهم ما إذا كان من الممكن بدء حركة المرور على هذا الملف. إذا لم يكن الأمر كذلك ، يتم تحرير الجراب حتى يعود إلى طبيعته.
- حيوية - التحقق من التطبيق "من أجل البقاء". على وجه الخصوص ، إذا لم يكن هناك وصول إلى مورد حيوي أو إذا لم يستجب التطبيق على الإطلاق (على سبيل المثال ، حالة توقف تام وبالتالي مهلة) ، فسيتم إعادة تشغيل الحاوية. جميع رموز المتشعب بين 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:
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
الاستنتاجات
- من ناحية ، تبين أن حد الدخول أقل بكثير مما كنت أعتقد ، من ناحية أخرى ، فهو ليس كتلة kubernetes حقيقية على الإطلاق ، ولكن فقط كمبيوتر مطور. ولم يتم النظر في القيود المفروضة على الموارد ، والتطبيقات الحكومية ، واختبار a / b ، وما إلى ذلك.
- جربت بروميتوس ذلك للمرة الأولى ، لكن قراءة مختلف الوثائق والأمثلة خلال مراجعة cuber أوضحت أنه من الجيد جدًا جمع المقاييس من المجموعة والتطبيقات
- إنه جيد جدًا لدرجة أنه يسمح للمطور بتنفيذ ميزة على جهاز الكمبيوتر الخاص به وإرفاقها ، بالإضافة إلى المعلومات المتعلقة بالنشر ، ونشر الجدول الزمني في graphan. ونتيجة لذلك ، فإن المقاييس الجديدة تلقائيًا دون إضافية. ستبدأ الجهود ليتم عرضها على خشبة المسرح وهمز. مريحة
ملاحظات
- يمكن للتطبيقات الاتصال ببعضها البعض من خلال
:
، وهو ما تم مع grafana → prometeus. بالنسبة لأولئك المطلعين على عامل الميناء ، لا يوجد شيء جديد kubectl create -f file.yml
- إنشاء كيانkubectl delete -f file.yml
- حذف كيانkubectl get pod
- الحصول على قائمة بجميع الموقد (الخدمة ، نقاط النهاية ...)- - مساحة الاسم
--namespace=kube-system
- التصفية حسب مساحة الاسم -n kube-system
- بالمثل
kubectl -it exec grafana-d8d4d9f5c-cvnkh -- /bin/bash
- مرفق في القاعkubectl delete service grafana
- حذف الخدمة ، جراب. نشر (- جميع - حذف الكل)kubectl describe
- وصف الكيان (يمكنك القيام به في وقت واحد)kubectl edit service metricsdemo
- تحرير جميع yamls على الطاير من خلال إطلاق المفكرةkubectl --help
- kubectl --help
- kubectl --help
كبيرة)- المشكلة النموذجية هي وجود جراب (ضع في اعتبارك الصورة قيد التشغيل) ، حدث خطأ ما ولا توجد خيارات ، باستثناء أنه لا توجد طريقة لتصحيح الأخطاء في الداخل (عبر tcpdump / nc وما إلى ذلك). - Yuzai kubectl-debug habr.com/ar/company/flant/blog/436112
المراجع
- ما هي مقاييس التطبيق؟
- Kubernetes
- بروميثيوس
- التكوين مسبقا grafana
- لمعرفة كيف يفعل الناس (ولكن هناك بالفعل بعض الأشياء التي عفا عليها الزمن) - هناك ، من حيث المبدأ ، هناك أيضا حول التسجيل ، والتنبيهات ، الخ
- Helm - مدير الحزم في Kubernetes - من خلاله ، كان من السهل تنظيم prometeus + grafana ، لكن يدويًا - يظهر المزيد من التفاهم
- مكعبات بروميثيوس من كوبر
- قصص فشل Kubernetes
- Kubernetes-HA. نشر نظام تجاوز الفشل Kubernetes مع 5 المعالجات
شفرة المصدر والمربيات المتاحة على جيثب