Η επεκτασιμότητα είναι βασική απαίτηση για εφαρμογές cloud. Με το Kubernetes, η κλιμάκωση μιας εφαρμογής είναι τόσο απλή όσο η αύξηση του αριθμού των αντιγράφων για την κατάλληλη ανάπτυξη ή ReplicaSet — αλλά είναι μια χειροκίνητη διαδικασία.
Το Kubernetes επιτρέπει στις εφαρμογές να κλιμακώνονται αυτόματα (δηλ. Pods σε μια ανάπτυξη ή ReplicaSet) με δηλωτικό τρόπο χρησιμοποιώντας την προδιαγραφή Horizontal Pod Autoscaler. Το προεπιλεγμένο κριτήριο για την αυτόματη κλιμάκωση είναι οι μετρήσεις χρήσης της CPU (μετρήσεις πόρων), αλλά μπορείτε να ενσωματώσετε προσαρμοσμένες και εξωτερικά παρεχόμενες μετρήσεις.
Ομάδα Kubernetes aaS από το Mail.ru μετέφρασε ένα άρθρο σχετικά με τον τρόπο χρήσης εξωτερικών μετρήσεων για την αυτόματη κλιμάκωση μιας εφαρμογής Kubernetes. Για να δείξει πώς λειτουργούν όλα, ο συγγραφέας χρησιμοποιεί μετρήσεις αιτημάτων πρόσβασης HTTP, οι οποίες συλλέγονται χρησιμοποιώντας το Prometheus.
Αντί της οριζόντιας αυτόματης κλιμάκωσης των pod, χρησιμοποιείται Kubernetes Event Driven Autoscaling (KEDA), ένας τελεστής Kubernetes ανοιχτού κώδικα. Ενσωματώνεται εγγενώς με το Horizontal Pod Autoscaler για να παρέχει απρόσκοπτη αυτόματη κλιμάκωση (συμπεριλαμβανομένων προς/από το μηδέν) για φόρτους εργασίας βάσει συμβάντων. Κωδικός διαθέσιμος στο GitHub.
Σύντομη επισκόπηση του συστήματος
Το διάγραμμα δείχνει μια σύντομη περιγραφή του πώς όλα λειτουργούν:
Η εφαρμογή παρέχει μετρήσεις αριθμού επισκέψεων HTTP σε μορφή Prometheus.
Ο Προμηθέας έχει διαμορφωθεί για να συλλέγει αυτές τις μετρήσεις.
Ο scaler Prometheus στο KEDA έχει ρυθμιστεί ώστε να κλιμακώνει αυτόματα την εφαρμογή με βάση τον αριθμό των επισκέψεων HTTP.
Τώρα θα σας πω αναλυτικά για κάθε στοιχείο.
ΚΕΔΑ και Προμηθέας
Το Prometheus είναι ένα τμήμα εργαλείων παρακολούθησης και ειδοποίησης συστήματος ανοιχτού κώδικα Ίδρυμα Cloud Native Computing. Συλλέγει μετρήσεις από διάφορες πηγές και τις αποθηκεύει ως δεδομένα χρονοσειρών. Για να οπτικοποιήσετε δεδομένα μπορείτε να χρησιμοποιήσετε Γκράφανα ή άλλα εργαλεία οπτικοποίησης που λειτουργούν με το Kubernetes API.
Το KEDA υποστηρίζει την έννοια του scaler - λειτουργεί ως γέφυρα μεταξύ του KEDA και του εξωτερικού συστήματος. Η υλοποίηση του scaler είναι συγκεκριμένη για κάθε σύστημα στόχου και εξάγει δεδομένα από αυτό. Το KEDA στη συνέχεια τα χρησιμοποιεί για τον έλεγχο της αυτόματης κλιμάκωσης.
Οι Scalers υποστηρίζουν πολλαπλές πηγές δεδομένων, για παράδειγμα, Kafka, Redis, Prometheus. Δηλαδή, το KEDA μπορεί να χρησιμοποιηθεί για την αυτόματη κλιμάκωση των αναπτύξεων Kubernetes χρησιμοποιώντας τις μετρήσεις Prometheus ως κριτήρια.
Δοκιμαστική εφαρμογή
Η εφαρμογή δοκιμής Golang παρέχει πρόσβαση μέσω HTTP και εκτελεί δύο σημαντικές λειτουργίες:
Χρησιμοποιεί τη βιβλιοθήκη πελατών Prometheus Go για να οργανώσει την εφαρμογή και να παρέχει τη μέτρηση http_requests, η οποία περιέχει έναν αριθμό επισκέψεων. Το τελικό σημείο όπου είναι διαθέσιμες οι μετρήσεις Prometheus βρίσκεται στο URI /metrics.
var httpRequestsCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "http_requests",
Help: "number of http requests",
})
Σε απάντηση αιτήματος GET η εφαρμογή αυξάνει την τιμή του κλειδιού (access_count) στο Ρέντις. Αυτός είναι ένας εύκολος τρόπος για να κάνετε τη δουλειά ως μέρος ενός προγράμματος χειρισμού HTTP και επίσης να ελέγξετε τις μετρήσεις του Prometheus. Η μετρική τιμή πρέπει να είναι ίδια με την τιμή access_count στο Ρέντις.
Η εφαρμογή αναπτύσσεται στο Kubernetes μέσω Deployment. Δημιουργείται επίσης μια υπηρεσία ClusterIP, επιτρέπει στον διακομιστή Prometheus να αποκτήσει μετρήσεις εφαρμογών.
Ο κλιμακωτής λειτουργεί ως γέφυρα μεταξύ της ΚΕΔΑ και του εξωτερικού συστήματος από το οποίο πρέπει να λαμβάνονται μετρήσεις. ScaledObject είναι ένας προσαρμοσμένος πόρος που πρέπει να αναπτυχθεί για να συγχρονιστεί η ανάπτυξη με την πηγή συμβάντος, σε αυτήν την περίπτωση τον Prometheus.
ScaledObject περιέχει πληροφορίες κλιμάκωσης ανάπτυξης, μεταδεδομένα πηγής συμβάντων (όπως μυστικά σύνδεσης, όνομα ουράς), διάστημα ψηφοφορίας, περίοδο ανάκτησης και άλλα δεδομένα. Έχει ως αποτέλεσμα τον αντίστοιχο πόρο αυτόματης κλιμάκωσης (ορισμός HPA) για την κλίμακα της ανάπτυξης.
Όταν ένα αντικείμενο ScaledObject διαγράφεται, ο αντίστοιχος ορισμός HPA διαγράφεται.
Εδώ είναι ο ορισμός ScaledObject για το παράδειγμά μας, χρησιμοποιεί ένα scaler Prometheus:
Τύπος σκανδάλης - Prometheus. Η διεύθυνση διακομιστή Prometheus αναφέρεται μαζί με το μετρικό όνομα, το όριο και Ερώτημα PromQL, το οποίο θα χρησιμοποιηθεί. Ερώτημα PromQL - sum(rate(http_requests[2m])).
Σύμφωνα με pollingInterval,Η ΚΕΔΑ ζητά έναν στόχο από τον Προμηθέα κάθε δεκαπέντε δευτερόλεπτα. Τουλάχιστον ένα κάτω από (minReplicaCount), και ο μέγιστος αριθμός λοβών δεν υπερβαίνει maxReplicaCount (σε αυτό το παράδειγμα - δέκα).
Μπορεί να εγκατασταθεί minReplicaCount ίσο με μηδέν. Σε αυτήν την περίπτωση, το KEDA ενεργοποιεί την ανάπτυξη μηδέν προς ένα και στη συνέχεια εκθέτει το HPA για περαιτέρω αυτόματη κλιμάκωση. Είναι δυνατή και η αντίστροφη σειρά, δηλαδή η κλίμακα από το ένα στο μηδέν. Στο παράδειγμα, δεν επιλέξαμε το μηδέν επειδή πρόκειται για υπηρεσία HTTP και όχι για σύστημα κατ' απαίτηση.
Η μαγεία μέσα στην αυτόματη κλιμάκωση
Το κατώφλι χρησιμοποιείται ως έναυσμα για την κλιμάκωση της ανάπτυξης. Στο παράδειγμά μας, το ερώτημα PromQL sum(rate (http_requests [2m])) επιστρέφει το συγκεντρωτικό ρυθμό αιτημάτων HTTP (αιτήματα ανά δευτερόλεπτο), που μετρήθηκε τα τελευταία δύο λεπτά.
Δεδομένου ότι η τιμή κατωφλίου είναι τρία, σημαίνει ότι θα υπάρχει ένα κάτω ενώ η τιμή sum(rate (http_requests [2m])) λιγότερο από τρεις. Εάν η τιμή αυξάνεται, κάθε φορά προστίθεται ένα επιπλέον δευτερεύον sum(rate (http_requests [2m])) αυξάνεται κατά τρεις. Για παράδειγμα, εάν η τιμή είναι από 12 έως 14, τότε ο αριθμός των λοβών είναι τέσσερις.
Τώρα ας προσπαθήσουμε να το ρυθμίσουμε!
Προρύθμιση
Το μόνο που χρειάζεστε είναι ένα σύμπλεγμα Kubernetes και ένα διαμορφωμένο βοηθητικό πρόγραμμα kubectl. Αυτό το παράδειγμα χρησιμοποιεί ένα σύμπλεγμα minikube, αλλά μπορείτε να πάρετε οποιοδήποτε άλλο. Για να εγκαταστήσετε ένα σύμπλεγμα υπάρχει οδηγός.
helm init αρχικοποιεί τη διεπαφή τοπικής γραμμής εντολών και επίσης εγκαθιστά Tiller στο σύμπλεγμα Kubernetes.
kubectl get pods -n kube-system | grep tiller
Περιμένετε μέχρι το Tiller pod να εισέλθει σε κατάσταση λειτουργίας.
Σημείωμα μεταφραστή: Ο συγγραφέας χρησιμοποιεί το Helm@2, το οποίο απαιτεί την εγκατάσταση του στοιχείου διακομιστή Tiller. Τώρα το Helm@3 είναι σχετικό, δεν απαιτεί τμήμα διακομιστή.
Μετά την εγκατάσταση του Helm, αρκεί μία εντολή για να ξεκινήσει το 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
Ελέγξτε ότι όλα έχουν ξεκινήσει:
kubectl get pods -l=app=prometheus-server
Περιμένετε να πάει ο Προμηθέας σε κατάσταση Running.
χρήση kubectl port-forward για πρόσβαση στη διεπαφή χρήστη Prometheus (ή διακομιστή API) στη διεύθυνση http://localhost:9090.
KEDA_POD_NAME=$(kubectl get pods -n keda
-o=jsonpath='{.items[0].metadata.name}')
kubectl logs $KEDA_POD_NAME -n keda
Το αποτέλεσμα μοιάζει κάπως έτσι:
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"
Ελέγξτε κάτω από τις εφαρμογές. Μια παρουσία πρέπει να εκτελείται επειδή minReplicaCount ισούται με 1:
kubectl get pods -l=app=go-prom-app
Βεβαιωθείτε ότι ο πόρος HPA δημιουργήθηκε με επιτυχία:
kubectl get hpa
Θα πρέπει να δείτε κάτι σαν:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
keda-hpa-go-prom-app Deployment/go-prom-app 0/3 (avg) 1 10 1 45s
Έλεγχος υγείας: πρόσβαση στην εφαρμογή
Για πρόσβαση στο τελικό σημείο REST της εφαρμογής μας, εκτελέστε:
Μπορείτε πλέον να αποκτήσετε πρόσβαση στην εφαρμογή Go χρησιμοποιώντας τη διεύθυνση http://localhost:8080. Για να το κάνετε αυτό, εκτελέστε την εντολή:
curl http://localhost:8080/test
Το αποτέλεσμα μοιάζει κάπως έτσι:
Accessed on 2019-10-21 11:29:10.560385986 +0000 UTC
m=+406004.817901246
Access count 1
Σε αυτό το σημείο ελέγξτε επίσης το Redis. Θα δείτε ότι το κλειδί access_count αυξήθηκε σε 1:
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
"1"
Βεβαιωθείτε ότι η μετρική τιμή είναι http_requests το ίδιο:
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 1
Φόρτωση Δημιουργίας
Θα το χρησιμοποιησουμε hey — βοηθητικό πρόγραμμα για τη δημιουργία φορτίου:
Μπορείτε επίσης να κάνετε λήψη του βοηθητικού προγράμματος για Linux ή Windows.
Τρέξε το:
./hey http://localhost:8080/test
Από προεπιλογή, το βοηθητικό πρόγραμμα στέλνει 200 αιτήματα. Μπορείτε να το επαληθεύσετε χρησιμοποιώντας τις μετρήσεις Prometheus καθώς και το Redis.
curl http://localhost:8080/metrics | grep http_requests
//output
# HELP http_requests number of http requests
# TYPE http_requests counter
http_requests 201
kubectl exec -it redis-server-master-0 -- redis-cli get access_count
//output
201
Επικυρώστε την τιμή της πραγματικής μέτρησης (που επιστράφηκε από το ερώτημα PromQL):
Σε αυτή την περίπτωση το πραγματικό αποτέλεσμα είναι 1,686057971014493 και εμφανίζεται στο πεδίο value. Αυτό δεν αρκεί για κλιμάκωση, αφού το όριο που ορίσαμε είναι 3.
Περισσότερο φορτίο!
Στο νέο τερματικό, παρακολουθήστε τον αριθμό των ομάδων εφαρμογών:
kubectl get pods -l=app=go-prom-app -w
Ας αυξήσουμε το φορτίο χρησιμοποιώντας την εντολή:
./hey -n 2000 http://localhost:8080/test
Μετά από λίγο, θα δείτε το HPA να κλιμακώνει την ανάπτυξη και να εκκινεί νέα pods. Ελέγξτε το HPA σας για να βεβαιωθείτε:
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
Εάν το φορτίο είναι ασυνεπές, η ανάπτυξη θα μειωθεί στο σημείο όπου λειτουργεί μόνο ένα pod. Εάν θέλετε να ελέγξετε την πραγματική μέτρηση (που επιστράφηκε από το ερώτημα PromQL), χρησιμοποιήστε την εντολή:
//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
Συμπέρασμα
Το KEDA σάς επιτρέπει να κλιμακώνετε αυτόματα τις αναπτύξεις του Kubernetes (σε/από μηδέν) με βάση δεδομένα από εξωτερικές μετρήσεις. Για παράδειγμα, με βάση τις μετρήσεις του Προμηθέα, το μήκος ουράς στο Redis, τον λανθάνοντα χρόνο καταναλωτή στο θέμα Kafka.
Το KEDA ενσωματώνεται με μια εξωτερική πηγή και παρέχει επίσης τις μετρήσεις του μέσω του Metrics Server στο Horizontal Pod Autoscaler.