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-
ReferensiInstal Kubernetes
tidak cocok untuk pengguna linux, Anda harus menggunakan minikube- Apakah Anda memiliki desktop buruh pelabuhan
- Di dalamnya Anda perlu menemukan dan mengaktifkan kluster single-node Kubernetes

- Sekarang Anda memiliki api http: // localhost: 8001 / untuk bekerja dengan kubernetis
- 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 kubectl cluster-info
bahwa cluster berfungsi> kubectl cluster-info
Instalasi UI
- Antarmuka dikerahkan di cluster yang sama
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
- Dapatkan token untuk mengakses antarmuka
kubectl describe secret
Dan salin

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

Menjalankan aplikasi Anda dalam sebuah cluster
- Saya membuat aplikasi standar mvc netcoreapp2.1 melalui studio 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"]
- Mengumpulkan hal ini dengan tag metricsdemo3
docker build -t metricsdemo3 .
- Tapi! Coober secara default menarik gambar dari hub, jadi saya menaikkan register lokal
- perhatikan - tidak mencoba untuk berjalan di kubernetis
docker create -p 5000:5000 --restart always --name registry registry:2
- Dan saya meresepkannya sebagai tidak aman yang diizinkan:

{ "registry-mirrors": [], "insecure-registries": [ "localhost:5000" ], "debug": true, "experimental": false }
- Sebelum memasukkan register, isyarat lebih banyak
docker start registry docker tag metricsdemo3 localhost:5000/sansys/metricsdemo3 docker push localhost:5000/sansys/metricsdemo3
- Akan terlihat seperti ini:

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
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 = defaultDi 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.
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",
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:
Tetapi prometheus memiliki dukungan asli untuk mengumpulkan metrik dari kubernetis
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_configSaya ingin memantau setiap layanan yang difilter secara individual berdasarkan apptype: label bisnis
Setelah berkenalan dengan dok, pekerjaannya adalah sebagai berikut:
- job_name: business-metrics
Di kubernetis ada tempat khusus untuk menyimpan file config -
ConfigMapSaya menyimpan konfigurasi ini di sana:
2-prometheus-configmap.yaml apiVersion: v1 kind: ConfigMap
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
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
/etc/grafana/provisioning/datasources/
- konfigurasi sumber (pengaturan untuk akses ke prometeus, postgres, zabbiks, elastis, dll.)/etc/grafana/provisioning/dashboards/
- pengaturan akses /etc/grafana/provisioning/dashboards/
/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
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
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 logSekarang 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:
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
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 aplikasiSaya mengajukan banding ke
http: // localhost: 9376 / api / job / kill / meDaftar 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
- kesiapan - jenis pemeriksaan ini digunakan untuk memahami apakah mungkin untuk memulai lalu lintas di pod ini. Jika tidak, pod akan dideregulasi hingga kembali normal.
- 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:
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
- 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.
- 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
- 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
- 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 kubectl create -f file.yml
- buat entitaskubectl delete -f file.yml
- hapus suatu entitaskubectl get pod
- dapatkan daftar semua perapian (layanan, titik akhir ...)--namespace=kube-system
- penyaringan berdasarkan namespace-n kube-system
- sama halnya
kubectl -it exec grafana-d8d4d9f5c-cvnkh -- /bin/bash
- lampiran ke bawahkubectl delete service grafana
- hapus layanan, pod. deployment (--all - delete all)kubectl describe
- menggambarkan entitas (Anda dapat melakukan semuanya sekaligus)kubectl edit service metricsdemo
- edit semua ubi dengan cepat melalui peluncuran notepadkubectl --help
- great help)- 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
- Apa itu Metrik Aplikasi?
- Kubernetes
- Prometheus
- Konfigurasi grafana yang disiapkan sebelumnya
- Untuk melihat bagaimana orang melakukannya (tetapi sudah ada beberapa hal yang sudah ketinggalan zaman) - di sana, pada prinsipnya, ada juga tentang penebangan, peringatan, dll.
- Helm - Manajer paket untuk Kubernetes - melaluinya lebih mudah untuk mengatur prometeus + grafana, tetapi secara manual - lebih banyak pemahaman muncul
- Kubus untuk Prometheus dari Coober
- Cerita Kegagalan Kubernetes
- Kubernetes-HA. Menyebarkan kluster failover Kubernetes dengan 5 penyihir
Kode sumber dan kemacetan tersedia di github