Use APISIX, Prometheus, and KEDA to Scale Applications Elastically in Kubernetes
February 17, 2023
Einführung
Die Menge des Datenverkehrs, der in eine Anwendung eingeht, variiert von Zeit zu Zeit. Beispielsweise ist eine Online-Shopping-Anwendung während der Ferienzeit viel stärker ausgelastet als an normalen Tagen. Die Möglichkeit, die Kapazität der Anwendung basierend auf dem Datenverkehr anzupassen, bietet ein viel besseres Benutzererlebnis und bessere Dienstleistungen.
Apache APISIX ist ein leistungsstarker, cloud-nativer API-Gateway, der aussagekräftige Metriken liefern kann, um festzustellen, ob die Anwendungen skaliert werden müssen. Es ist ein Middleware, der den gesamten Datenverkehr verarbeitet, der an die Upstream-Anwendungen gesendet wird, und kann daher während des Prozesses Verkehrsdaten sammeln.
Um elastische Skalierung durchzuführen, wird KEDA als Controller verwendet, und Prometheus wird verwendet, um die von APISIX bereitgestellten Metriken abzurufen.
Verwendung des Prometheus-Scalers in KEDA
KEDA ist ein ereignisbasierter Autoscaler in Kubernetes, der verschiedene Scaler konfigurieren kann. In diesem Artikel wird der Prometheus-Scaler verwendet, um die von APISIX bereitgestellten Metriken zu erhalten.
Bereitstellung von KEDA
Die Bereitstellung von KEDA ist relativ einfach, fügen Sie einfach das entsprechende Helm-Repo hinzu und installieren Sie es.
(MoeLove) ➜ helm repo add kedacore https://kedacore.github.io/charts
"kedacore" wurde zu Ihren Repositories hinzugefügt
(MoeLove) ➜ helm repo update kedacore
Warten Sie, während wir die neuesten Updates aus Ihren Chart-Repositories abrufen...
...Erfolgreich ein Update aus dem "kedacore" Chart-Repository erhalten
Update abgeschlossen. ⎈Viel Spaß beim Helmen!⎈
(MoeLove) ➜ helm install keda kedacore/keda --namespace keda --create-namespace
NAME: keda
LAST DEPLOYED: Thu Jan 19 00:01:00 2023
NAMESPACE: keda
STATUS: deployed
REVISION: 1
TEST SUITE: None
Nach der Installation hat der Pod den Status Running, was darauf hinweist, dass er erfolgreich installiert wurde.
(MoeLove) ➜ kubectl -n keda get pods
NAME READY STATUS RESTARTS AGE
keda-operator-metrics-apiserver-6d4db7dcff-ck9qg 1/1 Running 0 36s
keda-operator-5dd4748dcd-k8jjz 1/1 Running 0 36s
Bereitstellung von Prometheus
Hier verwenden wir den Prometheus Operator, um Prometheus bereitzustellen. Der Prometheus Operator hilft uns, die Prometheus-Instanz schnell in Kubernetes bereitzustellen und die Überwachungsregeln durch deklarative Konfiguration hinzuzufügen.
Führen Sie die Installation des Prometheus Operators durch die folgenden Schritte durch.
(MoeLove) ➜ https://github.com/prometheus-operator/prometheus-operator/releases/download/v0.62.0/bundle.yaml
(MoeLove) ➜ kubectl apply --server-side -f bundle.yaml
customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com serverside-applied
clusterrolebinding.rbac.authorization.k8s.io/prometheus-operator serverside-applied
clusterrole.rbac.authorization.k8s.io/prometheus-operator serverside-applied
deployment.apps/prometheus-operator serverside-applied
serviceaccount/prometheus-operator serverside-applied
service/prometheus-operator serverside-applied
Verwenden Sie dann die folgende Konfiguration für Prometheus und wenden Sie sie auf den Kubernetes-Cluster an.
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/metrics
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources:
- configmaps
verbs: ["get"]
- apiGroups:
- networking.k8s.io
resources:
- ingresses
verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: default
---
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
serviceAccountName: prometheus
serviceMonitorSelector:
matchLabels:
app: apisix
serviceMonitorNamespaceSelector:
matchLabels:
team: apisix
resources:
requests:
memory: 400Mi
enableAdminAPI: false
---
apiVersion: v1
kind: Service
metadata:
name: prometheus
spec:
type: LoadBalancer
ports:
- name: web
port: 9090
protocol: TCP
targetPort: web
selector:
prometheus: prometheus
Nach der Anwendung auf den Kubernetes-Cluster können Sie sehen, dass eine Prometheus-Instanz im default
-Namespace erstellt wurde. Da wir Prometheus mit dem TYPE LoadBalancer
konfiguriert haben, können Benutzer direkt über die öffentliche IP des LoadBalancers auf Prometheus zugreifen.
(MoeLove) ➜ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 96m
prometheus-operator ClusterIP None <none> 8080/TCP 92m
prometheus-operated ClusterIP None <none> 9090/TCP 41m
prometheus LoadBalancer 10.43.125.194 216.6.66.66 9090:30099/TCP 41m
Bereitstellung des API-Gateways und Aktivierung der Überwachung
Als Nächstes wird der APISIX Ingress Controller bereitgestellt und Prometheus für die Metrikensammlung verwendet.
Die Methode ist ähnlich für Benutzer, die nur APISIX und nicht den APISIX Ingress Controller verwenden. Wir werden dies hier nicht gesondert erklären.
Hier wird Helm für die Bereitstellung verwendet, und der APISIX Ingress Controller sowie APISIX können gleichzeitig im Cluster bereitgestellt werden.
(MoeLove) ➜ helm repo add apisix https://charts.apiseven.com
"apisix" existiert bereits mit der gleichen Konfiguration, wird übersprungen
(MoeLove) ➜ helm repo update apisix
Warten Sie, während wir die neuesten Updates aus Ihren Chart-Repositories abrufen...
...Erfolgreich ein Update aus dem "apisix" Chart-Repository erhalten
Update abgeschlossen. ⎈Viel Spaß beim Helmen!⎈
(MoeLove) ➜ helm upgrade --install apisix apisix/apisix --create-namespace --namespace apisix --set gateway.type=LoadBalancer --set ingress-controller.enabled=true --set ingress-controller.config.apisix.serviceNamespace=apisix
Release "apisix" wurde aktualisiert. Viel Spaß beim Helmen!
NAME: apisix
LAST DEPLOYED: Thu Jan 19 02:11:23 2023
NAMESPACE: apisix
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Holen Sie sich die Anwendungs-URL, indem Sie diese Befehle ausführen:
HINWEIS: Es kann einige Minuten dauern, bis die LoadBalancer-IP verfügbar ist.
Sie können den Status verfolgen, indem Sie 'kubectl get --namespace apisix svc -w apisix-gateway' ausführen
export SERVICE_IP=$(kubectl get svc --namespace apisix apisix-gateway --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo http://$SERVICE_IP:80
Aktivieren Sie als Nächstes das Prometheus-Plugin von APISIX. Bitte lesen Sie die folgenden beiden Dokumente für spezifische Konfigurationsmethoden und verwandte Parameter.
- prometheus plugins | Apache APISIX®
- How to access Apache APISIX Prometheus metrics on Kubernetes | Apache APISIX®
Sobald aktiviert, kann Prometheus die von APISIX bereitgestellten Metriken erfassen, indem eine ServiceMonitor-Ressource erstellt wird.
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
labels:
app: apisix
spec:
selector:
matchLabels:
app: apisix
endpoints:
- port: web
Überprüfung der elastischen Skalierungsfähigkeit der Anwendung
Erstellen Sie zuerst eine Anwendung.
(MoeLove) ➜ kubectl create deploy httpbin --image=kennethreitz/httpbin --port=80
deployment.apps/httpbin created
(MoeLove) ➜ kubectl expose deploy httpbin --port 80
Erstellen Sie die folgenden Routing-Regeln und wenden Sie sie auf den Kubernetes-Cluster an, um Anfragen über APISIX zu leiten.
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: httpserver-route
spec:
http:
- name: rule1
match:
hosts:
- local.httpbin.org
paths:
- /*
backends:
- serviceName: httpbin
servicePort: 80
Erstellen Sie als Nächstes ein KEDA ScaledObject und konfigurieren Sie die Prometheus-bezogenen Einstellungen.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: prometheus-scaledobject
namespace: default
spec:
scaleTargetRef:
name: httpbin
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.default.svc:9090
metricName: apisix_http_status
threshold: '10'
query: sum(rate(apisix_http_status{route="httpserver-route"}[1m]))
Die obige Konfiguration bedeutet, dass sum(rate(apisix_http_status{route="httpserver-route"}[1m]))
als Abfrageausdruck verwendet wird, und wenn das Ergebnis 10 erreicht, beginnt die Skalierung. (Die Konfiguration hier dient nur Demonstrationszwecken, bitte passen Sie sie an Ihre eigenen Bedürfnisse an). Dann senden wir kontinuierlich Anfragen an den httpbin-Dienst über curl.
Später, wenn wir die Anwendungs-Pods überprüfen, können Sie sehen, dass sie von KEDA auf zwei skaliert wurden.
(MoeLove) ➜ kubectl get pods
NAME READY STATUS RESTARTS AGE
httpbin-d46d778d7-chtdw 1/1 Running 0 12m
httpbin-d46d778d7-xanbj 1/1 Running 0 10s
Wenn die Anwendung nach einiger Zeit im Leerlauf ist, werden wir feststellen, dass die Anzahl der Pods automatisch auf eine Instanz reduziert wurde.
(MoeLove) ➜ kubectl get pods
NAME READY STATUS RESTARTS AGE
httpbin-d46d778d7-chtdw 1/1 Running 0 32m
Zusammenfassung
KEDA verwendet Prometheus als Scaler, um die von APISIX bereitgestellten Metriken zu sammeln. Da der gesamte Datenverkehr zuerst durch APISIX geleitet wird, ist die Erfassung von Statistiken auf der APISIX-Seite viel einfacher und bequemer.
Wenn das Volumen der Geschäftsanfragen steigt, wird die Anwendung automatisch skaliert, und wenn das Volumen der Geschäftsanfragen sinkt, wird die Anwendung automatisch verkleinert.
Diese Methode kann manuelle Skalierungs-/Reduzierungsoperationen in vielen Produktionsumgebungen erleichtern, um das beste Benutzererlebnis zu gewährleisten.