Kebolehskalaan adalah keperluan utama untuk aplikasi awan. Dengan Kubernetes, penskalaan aplikasi adalah semudah menambah bilangan replika untuk penggunaan yang sesuai atau ReplicaSet — tetapi ia adalah proses manual.
Kubernetes membenarkan aplikasi diskalakan secara automatik (iaitu Pod dalam penempatan atau ReplicaSet) secara deklaratif menggunakan spesifikasi Autoscaler Pod Horizontal. Kriteria lalai untuk penskalaan automatik ialah metrik penggunaan CPU (metrik sumber), tetapi anda boleh menyepadukan metrik tersuai dan yang disediakan secara luaran.
Pasukan Kubernetes aaS daripada Mail.ru menterjemah artikel tentang cara menggunakan metrik luaran untuk menskalakan aplikasi Kubernetes secara automatik. Untuk menunjukkan cara semuanya berfungsi, pengarang menggunakan metrik permintaan akses HTTP, yang dikumpulkan menggunakan Prometheus.
Daripada penskalaan auto mendatar pod, Penskalaan Auto Didorong Peristiwa Kubernetes (KEDA) digunakan, pengendali Kubernetes sumber terbuka. Ia disepadukan secara asli dengan Horizontal Pod Autoscaler untuk menyediakan penskalaan automatik yang lancar (termasuk ke/daripada sifar) untuk beban kerja yang didorong oleh peristiwa. Kod boleh didapati di GitHub.
Gambaran keseluruhan ringkas sistem
Rajah menunjukkan penerangan ringkas tentang cara semuanya berfungsi:
Aplikasi ini menyediakan metrik kiraan hit HTTP dalam format Prometheus.
Prometheus dikonfigurasikan untuk mengumpul metrik ini.
Penskala Prometheus dalam KEDA dikonfigurasikan untuk menskalakan aplikasi secara automatik berdasarkan bilangan klik HTTP.
Sekarang saya akan memberitahu anda secara terperinci tentang setiap elemen.
KEDA dan Prometheus
Prometheus ialah kit alat pemantauan dan amaran sistem sumber terbuka, sebahagian Yayasan Pengkomputeran Asli Cloud. Mengumpul metrik daripada pelbagai sumber dan menyimpannya sebagai data siri masa. Untuk menggambarkan data yang anda boleh gunakan grafana atau alat visualisasi lain yang berfungsi dengan API Kubernetes.
KEDA menyokong konsep skalar - ia bertindak sebagai jambatan antara KEDA dan sistem luaran. Pelaksanaan penskala adalah khusus untuk setiap sistem sasaran dan mengekstrak data daripadanya. KEDA kemudian menggunakannya untuk mengawal penskalaan automatik.
Scaler menyokong berbilang sumber data, contohnya, Kafka, Redis, Prometheus. Iaitu, KEDA boleh digunakan untuk menskalakan penggunaan Kubernetes secara automatik menggunakan metrik Prometheus sebagai kriteria.
Permohonan ujian
Aplikasi ujian Golang menyediakan akses melalui HTTP dan melaksanakan dua fungsi penting:
Menggunakan pustaka klien Prometheus Go untuk memperalatkan aplikasi dan menyediakan metrik http_requests, yang mengandungi kiraan hit. Titik akhir di mana metrik Prometheus tersedia terletak di URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Sebagai tindak balas kepada permintaan GET aplikasi menambah nilai kunci (access_count) dalam Redis. Ini ialah cara mudah untuk melakukan kerja sebagai sebahagian daripada pengendali HTTP dan juga menyemak metrik Prometheus. Nilai metrik mestilah sama dengan nilai access_count di Redis.
Aplikasi ini digunakan untuk Kubernetes melalui Deployment. Perkhidmatan juga dibuat ClusterIP, ia membolehkan pelayan Prometheus mendapatkan metrik aplikasi.
Skala bertindak sebagai jambatan antara KEDA dan sistem luaran yang metrik perlu diperolehi. ScaledObject ialah sumber tersuai yang perlu digunakan untuk menyegerakkan penggunaan dengan sumber acara, dalam kes ini Prometheus.
ScaledObject mengandungi maklumat penskalaan penempatan, metadata sumber acara (seperti rahsia sambungan, nama baris gilir), selang pengundian, tempoh pemulihan dan data lain. Ia menghasilkan sumber autoscaling yang sepadan (definisi HPA) untuk menskalakan penggunaan.
Apabila objek ScaledObject dipadamkan, definisi HPA yang sepadan dikosongkan.
Inilah definisinya ScaledObject untuk contoh kami, ia menggunakan penimbang Prometheus:
Dia menunjuk ke Deployment Dengan nama go-prom-app.
Jenis pencetus - Prometheus. Alamat pelayan Prometheus disebut bersama dengan nama metrik, ambang dan Pertanyaan PromQL, yang akan digunakan. Pertanyaan PromQL - sum(rate(http_requests[2m])).
Menurut pollingInterval,KEDA meminta sasaran daripada Prometheus setiap lima belas saat. Sekurang-kurangnya satu di bawah (minReplicaCount), dan bilangan maksimum pod tidak melebihi maxReplicaCount (dalam contoh ini - sepuluh).
Boleh dipasang minReplicaCount sama dengan sifar. Dalam kes ini, KEDA mengaktifkan penggunaan sifar-ke-satu dan kemudian mendedahkan HPA untuk penskalaan automatik selanjutnya. Urutan terbalik juga mungkin, iaitu, skala dari satu kepada sifar. Dalam contoh, kami tidak memilih sifar kerana ini adalah perkhidmatan HTTP dan bukan sistem atas permintaan.
Keajaiban dalam autoscaling
Ambang digunakan sebagai pencetus untuk menskalakan penggunaan. Dalam contoh kami, pertanyaan PromQL sum(rate (http_requests [2m])) mengembalikan kadar permintaan HTTP terkumpul (permintaan sesaat), yang diukur selama dua minit terakhir.
Oleh kerana nilai ambang adalah tiga, ini bermakna akan ada satu di bawah manakala nilainya sum(rate (http_requests [2m])) kurang daripada tiga. Jika nilai meningkat, sub tambahan ditambahkan setiap kali sum(rate (http_requests [2m])) meningkat sebanyak tiga. Sebagai contoh, jika nilainya adalah dari 12 hingga 14, maka bilangan pod ialah empat.
Sekarang mari cuba sediakannya!
Pra-tetapan
Apa yang anda perlukan ialah gugusan Kubernetes dan utiliti yang dikonfigurasikan kubectl. Contoh ini menggunakan kluster minikube, tetapi anda boleh mengambil mana-mana yang lain. Untuk memasang kluster ada panduan.
helm init memulakan antara muka baris arahan tempatan dan juga memasang Tiller kepada gugusan Kubernetes.
kubectl get pods -n kube-system | grep tiller
Tunggu pod Tiller memasuki keadaan Running.
Nota penterjemah: Pengarang menggunakan Helm@2, yang memerlukan komponen pelayan Tiller dipasang. Sekarang Helm@3 adalah relevan, ia tidak memerlukan bahagian pelayan.
Selepas memasang Helm, satu arahan sudah cukup untuk memulakan Redis:
kubectl apply -f prometheus.yaml
//output
clusterrole.rbac.authorization.k8s.io/prometheus created
serviceaccount/default configured
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
configmap/prom-conf created
deployment.extensions/prometheus-deployment created
service/prometheus-service created
Semak bahawa semuanya telah bermula:
kubectl get pods -l=app=prometheus-server
Tunggu Prometheus pergi ke negeri Running.
Gunakan kubectl port-forward untuk mengakses antara muka pengguna Prometheus (atau pelayan API) di http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Hasilnya kelihatan seperti ini:
time="2019-10-15T09:38:28Z" level=info msg="Watching ScaledObject:
default/prometheus-scaledobject"
time="2019-10-15T09:38:28Z" level=info msg="Created HPA with
namespace default and name keda-hpa-go-prom-app"
Semak di bawah aplikasi. Satu contoh mesti berjalan kerana minReplicaCount sama dengan 1:
kubectl get pods -l=app=go-prom-app
Sahkan bahawa sumber HPA berjaya dibuat:
kubectl get hpa
Anda sepatutnya melihat sesuatu seperti:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Pemeriksaan kesihatan: akses aplikasi
Untuk mengakses titik akhir REST aplikasi kami, jalankan:
Anda kini boleh mengakses apl Go anda menggunakan alamat tersebut http://localhost:8080. Untuk melakukan ini, jalankan arahan:
curl http://localhost:8080/test
Hasilnya kelihatan seperti ini:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Pada ketika ini juga semak Redis. Anda akan melihat bahawa kunci access_count meningkat kepada 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Pastikan nilai metrik adalah http_requests sama:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Penciptaan Muatan
Kami akan menggunakan hey — utiliti untuk menjana beban:
Dalam kes ini keputusan sebenar adalah 1,686057971014493 dan dipaparkan di lapangan value. Ini tidak mencukupi untuk penskalaan, kerana ambang yang kami tetapkan ialah 3.
Lebih banyak beban!
Dalam terminal baharu, pantau bilangan pod aplikasi:
kubectl get pods -l=app=go-prom-app -w
Mari tambahkan beban menggunakan arahan:
./hey -n 2000 http://localhost:8080/test
Selepas beberapa ketika, anda akan melihat HPA menskalakan penggunaan dan melancarkan pod baharu. Semak HPA anda untuk memastikan:
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 1830m/3 (avg) 1 10 6 4m22s
Jika beban tidak konsisten, penggunaan akan dikurangkan ke tahap di mana hanya satu pod sedang berjalan. Jika anda ingin menyemak metrik sebenar (dikembalikan oleh pertanyaan PromQL), kemudian gunakan arahan:
//Delete KEDA
kubectl delete namespace keda
//Delete the app, Prometheus server and KEDA scaled object
kubectl delete -f .
//Delete Redis
helm del --purge redis-server
Kesimpulan
KEDA membolehkan anda menskalakan penggunaan Kubernetes anda secara automatik (kepada/daripada sifar) berdasarkan data daripada metrik luaran. Contohnya, berdasarkan metrik Prometheus, panjang gilir dalam Redis, kependaman pengguna dalam topik Kafka.
KEDA berintegrasi dengan sumber luaran dan juga menyediakan metriknya melalui Pelayan Metrik kepada Autoscaler Pod Horizontal.