Penskalaan otomatis horizontal Kubernet dan Prometheus untuk ketersediaan tinggi dan ketersediaan infrastruktur

Salut, orang Khabrovit! Terjemahan artikel berikut disiapkan khusus untuk siswa kursus Platform Infrastruktur berbasis Kubernetes , yang akan memulai kelas besok. Mari kita mulai.



Melakukan autoscaling di Kubernetes


Penskalaan otomatis memungkinkan Anda untuk secara otomatis menambah dan mengurangi beban kerja tergantung pada penggunaan sumber daya.

Kubernet autoscaling memiliki dua dimensi:

  • Cluster Autoscaler, yang bertanggung jawab untuk penskalaan node;
  • Horizontal Pod Autoscaler (HPA), yang secara otomatis menskalakan jumlah perapian dalam set penyebaran atau replika.

Auto-scaling Cluster dapat digunakan bersama dengan auto-scaling hearth horizontal untuk secara dinamis mengontrol sumber daya komputasi dan tingkat konkurensi sistem yang diperlukan untuk mematuhi perjanjian tingkat layanan (SLA).

Cluster autoscaling sangat tergantung pada kemampuan penyedia infrastruktur cloud yang menjadi tuan rumah cluster, dan HPA dapat beroperasi secara independen dari penyedia IaaS / PaaS.

Pengembangan HPA


Penskalaan otomatis perapian horisontal telah mengalami perubahan besar sejak diperkenalkannya Kubernetes v1.1. Versi pertama HPA skala perapian didasarkan pada konsumsi CPU yang diukur, dan kemudian berdasarkan penggunaan memori. Kubernetes 1.6 memperkenalkan API baru yang disebut Metrik Kustom, yang menyediakan akses HPA ke metrik khusus. Kubernetes 1.7 menambahkan level agregasi yang memungkinkan aplikasi pihak ketiga untuk memperluas Kubernetes API dengan mendaftar sebagai add-on API.

Berkat API Metrik Kustom dan tingkat agregasi, sistem pemantauan seperti Prometheus dapat memberikan metrik khusus aplikasi ke pengontrol HPA.

Penskalaan otomatis perapian horisontal diimplementasikan sebagai loop kontrol yang secara berkala menanyakan API Metrik Sumber Daya (API metrik sumber daya) untuk metrik kunci, seperti penggunaan CPU dan memori, dan API Metrik Kustom (API metrik khusus) untuk metrik aplikasi tertentu.



Di bawah ini adalah panduan langkah demi langkah untuk mengkonfigurasi HPA v2 untuk Kubernetes 1.9 dan yang lebih baru.

  1. Instal Add-in Server Metrik, yang menyediakan metrik kunci.
  2. Luncurkan aplikasi demo untuk melihat bagaimana skala otomatis perapian bekerja berdasarkan penggunaan CPU dan memori.
  3. Menyebarkan Prometheus dan server API khusus. Daftarkan server API khusus di tingkat agregasi.
  4. Konfigurasikan HPA menggunakan metrik khusus yang disediakan oleh aplikasi demo.

Sebelum Anda mulai, Anda harus menginstal Go versi 1.8 (atau lebih baru) dan mengkloning repositori k8s-prom-hpa di GOPATH :

 cd $GOPATH git clone https://github.com/stefanprodan/k8s-prom-hpa 

1. Menyiapkan server metrik


Server Metrik Kubernetes adalah agregator data pemanfaatan sumber daya intra-cluster yang menggantikan Heapster . Server metrik mengumpulkan informasi penggunaan CPU dan memori untuk node dan perapian dari kubernetes.summary_api . API Ringkasan adalah API yang efisien-memori untuk mentransmisikan metrik data Kubelet / cAdvisor ke server.



Dalam versi pertama HPA, agregator Heapster diperlukan untuk mendapatkan CPU dan memori. Di HPA v2 dan Kubernetes 1.8, hanya server metrik yang diperlukan jika horizontal-pod-autoscaler-use-rest-clients enabled diaktifkan. Opsi ini diaktifkan secara default di Kubernetes 1.9. GKE 1.9 dilengkapi dengan server metrik yang telah diinstal sebelumnya.

Perluas server metrik di namespace kube-system kubus:

 kubectl create -f ./metrics-server 

Setelah 1 menit, metric-server akan mulai mengirimkan data tentang penggunaan CPU dan memori melalui node dan pod.

Lihat metrik simpul:

 kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq . 

Lihat indikator detak jantung:

 kubectl get --raw "/apis/metrics.k8s.io/v1beta1/pods" | jq . 

2. Penskalaan otomatis berdasarkan penggunaan CPU dan memori


Untuk menguji hearth horizontal auto-scaling (HPA), Anda dapat menggunakan aplikasi web berbasis Golang kecil.

Perluas podinfo di namespace default :

 kubectl create -f ./podinfo/podinfo-svc.yaml,./podinfo/podinfo-dep.yaml 

Hubungi podinfo menggunakan layanan NodePort di http://<K8S_PUBLIC_IP>:31198 .

Tentukan HPA yang akan melayani setidaknya dua replika dan skala hingga sepuluh replika jika pemanfaatan CPU rata-rata melebihi 80% atau jika konsumsi memori di atas 200 MiB:

 apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: podinfo spec: scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment name: podinfo minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu targetAverageUtilization: 80 - type: Resource resource: name: memory targetAverageValue: 200Mi 

Buat HPA:

 kubectl create -f ./podinfo/podinfo-hpa.yaml 

Setelah beberapa detik, pengontrol HPA akan menghubungi server metrik dan menerima informasi tentang penggunaan CPU dan memori:

 kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE podinfo Deployment/podinfo 2826240 / 200Mi, 15% / 80% 2 10 2 5m 

Untuk meningkatkan penggunaan CPU, lakukan uji beban dengan rakyll / hey:

 #install hey go get -u github.com/rakyll/hey #do 10K requests hey -n 10000 -q 10 -c 5 http://<K8S_PUBLIC_IP>:31198/ 

Anda dapat memantau acara HPA sebagai berikut:

 $ kubectl describe hpa Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 7m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization (percentage of request) above target Normal SuccessfulRescale 3m horizontal-pod-autoscaler New size: 8; reason: cpu resource utilization (percentage of request) above target 

Hapus podinfo sementara (Anda harus memindahkannya di salah satu langkah selanjutnya dari panduan ini).

 kubectl delete -f ./podinfo/podinfo-hpa.yaml,./podinfo/podinfo-dep.yaml,./podinfo/podinfo-svc.yaml 

3. Pengaturan Server Metrik Khusus


Untuk penskalaan berdasarkan metrik khusus, diperlukan dua komponen. Yang pertama - basis data time series Prometheus - mengumpulkan metrik aplikasi dan menyimpannya. Komponen kedua, adaptor k8s-prometheus , melengkapi Kubernetes Metrik API Kustom dengan metrik yang disediakan oleh pembangun.



Ruang nama khusus digunakan untuk menggunakan Prometheus dan adaptor.

Buat ruang nama monitoring :

 kubectl create -f ./namespaces.yaml 

Perluas Prometheus v2 di ruang nama monitoring :

 kubectl create -f ./prometheus 

Hasilkan sertifikat TLS yang diperlukan untuk adaptor Prometheus:

 make certs 

Menyebarkan adaptor Prometheus untuk API Metrik Khusus:

 kubectl create -f ./custom-metrics-api 

Dapatkan daftar metrik khusus yang disediakan oleh Prometheus:

 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1" | jq . 

Kemudian ekstrak data penggunaan sistem file untuk semua pod di namespace monitoring :

 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/monitoring/pods/*/fs_usage_bytes" | jq . 

4. Penskalaan otomatis berdasarkan metrik khusus


Buat layanan NodePort podinfo dan gunakan ke namespace default :

 kubectl create -f ./podinfo/podinfo-svc.yaml,./podinfo/podinfo-dep.yaml 

Aplikasi podinfo akan melewati http_requests_total metrik khusus. Adaptor Prometheus akan menghapus akhiran _total dan menandai metrik ini sebagai penghitung.

Dapatkan jumlah total kueri per detik dari API Metrik Khusus:

 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/http_requests" | jq . { "kind": "MetricValueList", "apiVersion": "custom.metrics.k8s.io/v1beta1", "metadata": { "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/http_requests" }, "items": [ { "describedObject": { "kind": "Pod", "namespace": "default", "name": "podinfo-6b86c8ccc9-kv5g9", "apiVersion": "/__internal" }, "metricName": "http_requests", "timestamp": "2018-01-10T16:49:07Z", "value": "901m" }, { "describedObject": { "kind": "Pod", "namespace": "default", "name": "podinfo-6b86c8ccc9-nm7bl", "apiVersion": "/__internal" }, "metricName": "http_requests", "timestamp": "2018-01-10T16:49:07Z", "value": "898m" } ] } 

Huruf m berarti milli-units , jadi, misalnya, 901m adalah 901 milidetik.

Buat HPA yang akan memperluas penyebaran podinfo jika jumlah permintaan melebihi 10 permintaan per detik:

 apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: podinfo spec: scaleTargetRef: apiVersion: extensions/v1beta1 kind: Deployment name: podinfo minReplicas: 2 maxReplicas: 10 metrics: - type: Pods pods: metricName: http_requests targetAverageValue: 10 

Perluas HPA podinfo di namespace default :

 kubectl create -f ./podinfo/podinfo-hpa-custom.yaml 

Setelah beberapa detik, HPA akan mendapatkan nilai http_requests dari API metrik:

 kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE podinfo Deployment/podinfo 899m / 10 2 10 2 1m 

Terapkan beban untuk layanan podinfo dengan 25 permintaan per detik:

 #install hey go get -u github.com/rakyll/hey #do 10K requests rate limited at 25 QPS hey -n 10000 -q 5 -c 5 http://<K8S-IP>:31198/healthz 

Setelah beberapa menit, HPA akan mulai mengukur penyebaran:

 kubectl describe hpa Name: podinfo Namespace: default Reference: Deployment/podinfo Metrics: ( current / target ) "http_requests" on pods: 9059m / 10< Min replicas: 2 Max replicas: 10 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 2m horizontal-pod-autoscaler New size: 3; reason: pods metric http_requests above target 

Dengan jumlah permintaan saat ini per detik, penyebaran tidak akan pernah mencapai maksimum 10 pod. Tiga replika cukup untuk memastikan bahwa jumlah permintaan per detik untuk setiap pod kurang dari 10.

Setelah menyelesaikan tes beban, HPA akan mengurangi skala penyebaran ke jumlah awal replika:

 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 5m horizontal-pod-autoscaler New size: 3; reason: pods metric http_requests above target Normal SuccessfulRescale 21s horizontal-pod-autoscaler New size: 2; reason: All metrics below target 

Anda mungkin telah memperhatikan bahwa scaler otomatis tidak segera menanggapi perubahan dalam metrik. Secara default, mereka disinkronkan setiap 30 detik. Selain itu, penskalaan terjadi hanya jika belum ada peningkatan atau penurunan beban kerja selama 3-5 menit terakhir. Ini membantu mencegah keputusan yang bertentangan dan menyisakan waktu untuk menghubungkan scaler otomatis kluster.

Kesimpulan


Tidak semua sistem dapat menegakkan kepatuhan SLA hanya berdasarkan penggunaan CPU atau memori (atau keduanya). Sebagian besar server web dan server seluler untuk menangani lonjakan lalu lintas memerlukan penskalaan otomatis berdasarkan jumlah permintaan per detik.

Untuk aplikasi ETL (dari Eng. Extract Transform Load - "ekstraksi, transformasi, memuat"), penskalaan otomatis dapat dipicu, misalnya, ketika panjang ambang batas yang ditentukan dari antrian pekerjaan terlampaui.

Dalam semua kasus, menginstruksikan aplikasi menggunakan Prometheus dan menyoroti indikator yang diperlukan untuk autoscaling memungkinkan Anda menyempurnakan aplikasi untuk meningkatkan pemrosesan lonjakan lalu lintas dan memastikan ketersediaan infrastruktur yang tinggi.

Gagasan, pertanyaan, komentar? Bergabunglah dengan diskusi di Slack !

Berikut adalah materi semacam itu. Kami menunggu komentar Anda dan sampai jumpa di kursus !

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


All Articles