Saya mencoba .NET Core + Kubernetes + appmetrics + prometheus + grafana + pekerjaan + pemeriksaan kesehatan

Kenalan singkat dengan kubernet untuk pengembang dengan contoh penempatan situs templat sederhana, pengaturannya untuk pemantauan, melakukan pekerjaan terjadwal, dan pemeriksaan kesehatan (semua kode sumber terlampir)

- Instal Kubernetes
- Instal UI
- Luncurkan aplikasi Anda di cluster
- Menambahkan metrik khusus ke aplikasi
- Pengumpulan metrik melalui Prometheus
- Menampilkan metrik di Grafana
- Tugas yang dijadwalkan
- Toleransi kesalahan
- Kesimpulan
- Catatan
- Referensi

Instal Kubernetes


tidak cocok untuk pengguna linux, Anda harus menggunakan minikube
  1. Apakah Anda memiliki desktop buruh pelabuhan
  2. Di dalamnya Anda perlu menemukan dan mengaktifkan kluster single-node Kubernetes
  3. Sekarang Anda memiliki api http: // localhost: 8001 / untuk bekerja dengan kubernetis
  4. Komunikasi dengannya terjadi melalui utilitas kubectl yang nyaman
    Periksa versinya dengan perintah> kubectl version
    Yang relevan terbaru ditulis di sini https://storage.googleapis.com/kubernetes-release/release/stable.txt
    Anda dapat mengunduhnya di tautan yang sesuai https://storage.googleapis.com/kubernetes-release/release/v1.13.2/bin/windows/amd64/kubectl.exe
  5. kubectl cluster-info bahwa cluster berfungsi> kubectl cluster-info

Instalasi UI


  1. Antarmuka dikerahkan di cluster yang sama
     kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml 
  2. Dapatkan token untuk mengakses antarmuka
     kubectl describe secret 

    Dan salin
  3. Sekarang mulai proxy
     kubectl proxy 
  4. Dan Anda dapat menggunakan http: // localhost: 8001 / api / v1 / namespaces / kube-system / services / https: kubernetes-dashboard: / proxy /


Menjalankan aplikasi Anda dalam sebuah cluster


  1. Saya membuat aplikasi standar mvc netcoreapp2.1 melalui studio 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. Mengumpulkan hal ini dengan tag metricsdemo3
     docker build -t metricsdemo3 . 
  4. Tapi! Coober secara default menarik gambar dari hub, jadi saya menaikkan register lokal
  5. perhatikan - tidak mencoba untuk berjalan di kubernetis
     docker create -p 5000:5000 --restart always --name registry registry:2 
  6. Dan saya meresepkannya sebagai tidak aman yang diizinkan:
     { "registry-mirrors": [], "insecure-registries": [ "localhost:5000" ], "debug": true, "experimental": false } 
  7. Sebelum memasukkan register, isyarat lebih banyak
     docker start registry docker tag metricsdemo3 localhost:5000/sansys/metricsdemo3 docker push localhost:5000/sansys/metricsdemo3 
  8. Akan terlihat seperti ini:
  9. Luncurkan melalui UI



Jika dimulai, maka semuanya baik-baik saja dan Anda dapat mulai beroperasi


Buat file penyebaran
1-deployment-app.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" 

Deskripsi kecil
  • Jenis - menunjukkan jenis entitas apa yang dijelaskan melalui file yaml
  • apiVersion - api ke mana objek tersebut ditransfer
  • label - pada dasarnya hanya label (tombol di sebelah kiri dan nilai-nilai dapat dipikirkan sendiri)
  • selector - memungkinkan Anda untuk mengaitkan layanan dengan penyebaran, misalnya, melalui label

Selanjutnya:
 kubectl create -f .\1-deployment-app.yaml 

Dan Anda akan melihat penyebaran Anda di antarmuka http: // localhost: 8001 / api / v1 / namespaces / kube-system / services / https: kubernetes-dashboard: / proxy / #! / Deployment? Namespace = default
Layar

Di dalamnya terdapat Kumpulan Replika, yang menunjukkan bahwa aplikasi berjalan dalam dua kejadian (Pods) dan ada satu layanan terkait dengan alamat dari luar untuk membuka aplikasi yang di-dubbing di browser.
Tangkapan layar



Menambahkan metrik khusus ke aplikasi


Menambahkan paket https://www.app-metrics.io/ ke aplikasi
Saya tidak akan menjelaskan secara detail bagaimana saya akan menambahkannya, untuk saat ini secara singkat - Saya mendaftarkan middleware karena menambah penghitung panggilan ke metode api
Ini middleware
 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()) }); } 

Dan metrik yang dikumpulkan tersedia di http: // localhost: 9376 / metrik



* IMetricRoot atau abstraksi dapat dengan mudah didaftarkan dalam layanan dan digunakan dalam aplikasi ( layanan . Tambah Metrik (Program. Metrik); )

Pengumpulan metrik melalui Prometheus


Pengaturan prometheus paling dasar: tambahkan pekerjaan baru ke konfigurasi (prometheus.yml) dan beri target baru:
 global: scrape_interval: 15s evaluation_interval: 15s rule_files: # - "first.rules" # - "second.rules" scrape_configs: - job_name: prometheus static_configs: - targets: ['localhost:9090', '__:'] 

Tetapi prometheus memiliki dukungan asli untuk mengumpulkan metrik dari kubernetis https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config
Saya ingin memantau setiap layanan yang difilter secara individual berdasarkan apptype: label bisnis
Setelah berkenalan dengan dok, pekerjaannya adalah sebagai berikut:
 - 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 

Di kubernetis ada tempat khusus untuk menyimpan file config - ConfigMap
Saya menyimpan konfigurasi ini di sana:
2-prometheus-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 

Berangkat ke kubernetis
 kubectl create -f .\2-prometheus-configmap.yaml 

Sekarang Anda perlu menggunakan prometheus dengan file konfigurasi ini
kubectl buat -f. \ 3-deployment-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 

Perhatikan - file prometheus.yml tidak ditentukan di mana pun
Semua file yang ditentukan dalam config-map menjadi file di bagian prometheus-config-volume, yang dipasang di direktori /etc/config/
Juga, wadah memiliki argumen startup dengan jalur ke konfigurasi
--web.enable-lifecycle - mengatakan bahwa Anda dapat menarik POST / - / reload, yang akan menerapkan konfigurasi baru (berguna jika konfigurasi berubah "dengan cepat" dan Anda tidak ingin memulai kembali wadah)

Sebenarnya menyebarkan
 kubectl create -f .\3-deployment-prometheus.yaml 

Ikuti langkah-langkah kecil dan pergi ke alamat http: // localhost: 9090 / target , Anda harus melihat titik akhir layanan Anda di sana



Dan di halaman utama Anda dapat menulis permintaan ke prometheus
 sum by (response, action, url, app) (delta(application_api[15s])) 

Asalkan seseorang mengunjungi situs tersebut, hasilnya akan seperti ini


Bahasa kueri - https://prometheus.io/docs/prometheus/latest/querying/basics/

Tampilkan metrik di Grafana


Kami beruntung - hingga versi 5, konfigurasi dasbor hanya bisa diselipkan melalui HTTP API, tetapi sekarang Anda dapat melakukan trik yang sama seperti dengan Prometeus
Grafana secara default saat startup dapat menarik konfigurasi sumber data dan dasbor
  1. /etc/grafana/provisioning/datasources/ - konfigurasi sumber (pengaturan untuk akses ke prometeus, postgres, zabbiks, elastis, dll.)
  2. /etc/grafana/provisioning/dashboards/ - pengaturan akses /etc/grafana/provisioning/dashboards/
  3. /var/lib/grafana/dashboards/ - di sini saya akan menyimpan sendiri dashboard dalam bentuk file json

Ternyata begini
 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 } 

Penempatan itu sendiri, bukan hal baru
 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 

Perluas
 kubectl create -f .\4-grafana-configmap.yaml kubectl create -f .\5-deployment-grafana.yaml 

Ingat bahwa graphan tidak segera naik, ini sedikit dibasahi oleh migrasi sqlite, yang dapat Anda lihat di log
Sekarang buka http: // localhost: 3000 /
Dan klik pada dashboard




Jika Anda ingin menambahkan tampilan baru atau mengubah yang sudah ada - ubah secara langsung di antarmuka, dan kemudian klik Simpan, Anda akan mendapatkan jendela modal dengan json, yang perlu dimasukkan ke dalam peta konfigurasi
Semuanya dikerahkan dan berfungsi dengan baik

Tugas yang dijadwalkan


Untuk melakukan tugas pada mahkota di cuber ada konsep CronJob
Dengan CronJob, Anda dapat mengatur jadwal untuk tugas apa pun, contoh paling sederhana:
 # 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 

Bagian jadwal menetapkan aturan klasik untuk mahkota
Pemicu memulai pod wadah (busybox) di mana saya menarik metode api layanan metricsdemo
Anda dapat menggunakan perintah untuk melacak pekerjaan.
 kubectl.exe get cronjob runapijob --watch 



Layanan utama yang tersentak dari pekerjaan diluncurkan dalam beberapa kasus, karena panggilan ke layanan tersebut pergi ke salah satu perapian dengan penyebaran yang hampir seragam
Seperti apa di Prometheus

Untuk men-debug pekerjaan, Anda dapat memicu secara manual

Demo kecil tentang contoh menghitung jumlah ฯ€, tentang perbedaan peluncuran dari konsol
 #   ,       -      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)' 


Toleransi kesalahan


Jika aplikasi berhenti secara tak terduga, gugus memulai ulang pod
Sebagai contoh, saya membuat metode yang menjatuhkan api
 [HttpGet("kill/me")] public async void Kill() { throw new Exception("Selfkill"); } 

* Pengecualian yang terjadi pada api dalam metode async void dianggap sebagai pengecualian yang tidak ditangani, yang benar-benar membuat crash aplikasi

Saya mengajukan banding ke http: // localhost: 9376 / api / job / kill / me
Daftar perapian menunjukkan bahwa salah satu perapian layanan telah dimulai kembali



Perintah log menampilkan output saat ini, dan dengan opsi -p akan menampilkan log dari instance sebelumnya. Dengan cara ini Anda dapat mengetahui alasan untuk memulai kembali.

Saya pikir dengan jatuh sederhana, semuanya jelas: jatuh - naik

Tetapi aplikasi dapat ditayangkan secara kondisional, mis. tidak jatuh, tetapi tidak melakukan apa-apa, atau melakukan pekerjaannya, tetapi perlahan-lahan

Menurut dokumentasi, setidaknya ada dua jenis pemeriksaan โ€œsurvivabilityโ€ aplikasi di pod
  1. kesiapan - jenis pemeriksaan ini digunakan untuk memahami apakah mungkin untuk memulai lalu lintas di pod ini. Jika tidak, pod akan dideregulasi hingga kembali normal.
  2. liveness - periksa aplikasi "untuk bertahan". Secara khusus, jika tidak ada akses ke sumber daya vital atau aplikasi tidak merespons sama sekali (misalnya, jalan buntu dan karena itu batas waktu), maka wadah akan dimulai kembali. Semua kode http antara 200 dan 400 dianggap berhasil, sisanya gagal

Saya akan memeriksa restart dengan batas waktu, untuk ini saya akan menambahkan metode api baru, yang menurut perintah tertentu akan mulai memperlambat metode verifikasi survivability selama 123 detik

 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"; } 


Saya menambahkan beberapa bagian ke file 1-deployment-app.yaml dalam wadah:
 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, saya yakin aplikasi telah memulai dan berlangganan acara
 kubectl get events --watch 

Saya menekan menu Deadlock me ( http: // localhost: 9376 / api / job / hidup / deadlock )



Dan dalam lima detik saya mulai mengamati masalah dan solusinya

 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 


Kesimpulan


  1. Di satu sisi, ambang entri ternyata jauh lebih rendah dari yang saya kira, di sisi lain, itu sama sekali bukan cluster kubernet, tetapi hanya komputer pengembang. Dan batas pada sumber daya, aplikasi stateful, pengujian a / b, dll tidak dipertimbangkan.
  2. Prometeus mencobanya untuk pertama kali, tetapi membaca berbagai dokumen dan contoh selama peninjauan cuber memperjelas bahwa sangat baik untuk mengumpulkan metrik dari cluster dan aplikasi
  3. Sangat bagus sehingga memungkinkan pengembang untuk mengimplementasikan fitur di komputernya dan melampirkan, selain informasi untuk penyebaran, jadwal penyebaran ke graphan. Akibatnya, metrik baru secara otomatis tanpa tambahan. upaya akan mulai ditampilkan di panggung dan prod. Nyaman


Catatan


  1. Aplikasi dapat menghubungi satu sama lain dengan : , yang merupakan apa yang dilakukan dengan grafana โ†’ prometeus. Bagi yang terbiasa dengan komposisi buruh pelabuhan, tidak ada yang baru
  2. kubectl create -f file.yml - buat entitas
  3. kubectl delete -f file.yml - hapus suatu entitas
  4. kubectl get pod - dapatkan daftar semua perapian (layanan, titik akhir ...)
    • --namespace=kube-system - penyaringan berdasarkan namespace
    • -n kube-system - sama halnya
  5. kubectl -it exec grafana-d8d4d9f5c-cvnkh -- /bin/bash - lampiran ke bawah
  6. kubectl delete service grafana - hapus layanan, pod. deployment (--all - delete all)
  7. kubectl describe - menggambarkan entitas (Anda dapat melakukan semuanya sekaligus)
  8. kubectl edit service metricsdemo - edit semua ubi dengan cepat melalui peluncuran notepad
    Demo
  9. kubectl --help - great help)
  10. Masalah umum adalah ada pod (pertimbangkan gambar yang sedang berjalan), ada yang salah dan tidak ada pilihan, kecuali tidak ada cara untuk men-debug di dalam (melalui tcpdump / nc dll). - Yuzai kubectl-debug habr.com/en/company/flant/blog/436112


Referensi


  1. Apa itu Metrik Aplikasi?
  2. Kubernetes
  3. Prometheus
  4. Konfigurasi grafana yang disiapkan sebelumnya
  5. Untuk melihat bagaimana orang melakukannya (tetapi sudah ada beberapa hal yang sudah ketinggalan zaman) - di sana, pada prinsipnya, ada juga tentang penebangan, peringatan, dll.
  6. Helm - Manajer paket untuk Kubernetes - melaluinya lebih mudah untuk mengatur prometeus + grafana, tetapi secara manual - lebih banyak pemahaman muncul
  7. Kubus untuk Prometheus dari Coober
  8. Cerita Kegagalan Kubernetes
  9. Kubernetes-HA. Menyebarkan kluster failover Kubernetes dengan 5 penyihir

Kode sumber dan kemacetan tersedia di github

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


All Articles