استخدم APISIX و Prometheus و KEDA لتوسيع تطبيقاتك بشكل مرن في Kubernetes
February 17, 2023
مقدمة
تختلف كمية الحركة المرورية التي تدخل إلى التطبيق من وقت لآخر. على سبيل المثال، يكون تطبيق التسوق عبر الإنترنت أكثر انشغالًا خلال مواسم العطلات مقارنة بالأيام العادية. القدرة على ضبط سعة التطبيق بناءً على الحركة المرورية ستوفر تجارب وخدمات أفضل للمستخدمين.
Apache APISIX هو بوابة API عالية الأداء مصممة للعمل في البيئات السحابية، ويمكنها توفير مقاييس ذات معنى لتحديد ما إذا كان التطبيق بحاجة إلى التوسع. إنه برنامج وسيط يعالج كل الحركة المرورية المرسلة إلى التطبيقات العلوية، وبالتالي يمكنه جمع بيانات الحركة المرورية خلال هذه العملية.
لتنفيذ التوسع المرن، سيتم استخدام KEDA كوحدة تحكم، وPrometheus سيتم استخدامه لجلب المقاييس التي يوفرها APISIX.
كيفية استخدام مقياس Prometheus في KEDA
KEDA هو مقياس توسع يعتمد على الأحداث في Kubernetes، ويمكنه تكوين مقاييس مختلفة. في هذه المقالة، سيتم استخدام مقياس Prometheus للحصول على المقاييس التي يعرضها APISIX.
نشر KEDA
نشر KEDA بسيط نسبيًا، فقط قم بإضافة مستودع Helm المقابل وقم بتثبيته.
(MoeLove) ➜ helm repo add kedacore https://kedacore.github.io/charts
تمت إضافة "kedacore" إلى مستودعاتك
(MoeLove) ➜ helm repo update kedacore
انتظر بينما نحصل على آخر التحديثات من مستودعاتك...
...تم الحصول على تحديث بنجاح من مستودع "kedacore"
التحديث مكتمل. ⎈تمنياتنا بالنجاح في استخدام Helm!⎈
(MoeLove) ➜ helm install keda kedacore/keda --namespace keda --create-namespace
الاسم: keda
تم النشر الأخير: الخميس 19 يناير 00:01:00 2023
مساحة الاسم: keda
الحالة: تم النشر
الإصدار: 1
مجموعة الاختبار: لا شيء
بعد التثبيت، يكون للـ Pod حالة status Running
، مما يشير إلى أنه تم تثبيته.
(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
نشر Prometheus
هنا نستخدم Prometheus Operator لنشر Prometheus. يمكن لـ Prometheus Operator مساعدتنا في نشر نسخة Prometheus بسرعة في Kubernetes وإضافة قواعد المراقبة من خلال التكوين التصريحي.
أكمل تثبيت Prometheus Operator من خلال الخطوات التالية.
(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
ثم استخدم التكوين التالي لـ Prometheus وقم بتطبيقه على مجموعة Kubernetes.
---
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
بعد التطبيق على مجموعة Kubernetes، يمكنك رؤية أن نسخة Prometheus تم إنشاؤها تحت مساحة الاسم default
. نظرًا لأننا قمنا بتكوين Prometheus مع TYPE LoadBalancer
، يمكن للمستخدمين الوصول مباشرة إلى Prometheus من خلال عنوان IP العام لـ LoadBalancer.
(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
كيفية نشر بوابة API وتمكين المراقبة
بعد ذلك، قم بنشر وحدة تحكم APISIX Ingress واستخدم Prometheus لجمع المقاييس.
الطريقة مشابهة للمستخدمين الذين يستخدمون APISIX فقط بدلاً من وحدة تحكم APISIX Ingress. لن نشرحها بشكل منفصل هنا.
هنا، يتم استخدام Helm للنشر، ويمكن نشر وحدة تحكم APISIX Ingress وAPISIX في نفس الوقت إلى المجموعة.
(MoeLove) ➜ helm repo add apisix https://charts.apiseven.com
"apisix" موجود بالفعل بنفس التكوين، يتم التخطي
(MoeLove) ➜ helm repo update apisix
انتظر بينما نحصل على آخر التحديثات من مستودعاتك...
...تم الحصول على تحديث بنجاح من مستودع "apisix"
التحديث مكتمل. ⎈تمنياتنا بالنجاح في استخدام Helm!⎈
(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
تم ترقية الإصدار "apisix". تمنياتنا بالنجاح في استخدام Helm!
الاسم: apisix
تم النشر الأخير: الخميس 19 يناير 02:11:23 2023
مساحة الاسم: apisix
الحالة: تم النشر
الإصدار: 1
مجموعة الاختبار: لا شيء
ملاحظات:
1. احصل على عنوان URL للتطبيق عن طريق تشغيل هذه الأوامر:
ملاحظة: قد يستغرق الحصول على عنوان IP لـ LoadBalancer بضع دقائق.
يمكنك مشاهدة الحالة عن طريق تشغيل 'kubectl get --namespace apisix svc -w apisix-gateway'
export SERVICE_IP=$(kubectl get svc --namespace apisix apisix-gateway --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo http://$SERVICE_IP:80
بعد ذلك، قم بتمكين مكون Prometheus الخاص بـ APISIX. يرجى الرجوع إلى الوثائق التالية لطرق التكوين المحددة والمعلمات ذات الصلة.
- prometheus plugins | Apache APISIX®
- How to access Apache APISIX Prometheus metrics on Kubernetes | Apache APISIX®
بمجرد التمكين، يمكن لـ Prometheus التقاط المقاييس التي يعرضها APISIX عن طريق إنشاء مورد ServiceMonitor.
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
labels:
app: apisix
spec:
selector:
matchLabels:
app: apisix
endpoints:
- port: web
التحقق من قدرة التطبيق على التوسع المرن
قم بإنشاء تطبيق أولاً.
(MoeLove) ➜ kubectl create deploy httpbin --image=kennethreitz/httpbin --port=80
تم إنشاء deployment.apps/httpbin
(MoeLove) ➜ kubectl expose deploy httpbin --port 80
قم بإنشاء قواعد التوجيه التالية وقم بتطبيقها على مجموعة Kubernetes لتوجيه الطلبات عبر APISIX.
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
بعد ذلك، قم بإنشاء ScaledObject لـ KEDA وقم بتكوين إعدادات Prometheus ذات الصلة.
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]))
التكوين أعلاه يعني أن sum(rate(apisix_http_status{route="httpserver-route"}[1m]))
سيتم استخدامه كتعبير استعلام، وإذا كانت النتيجة تصل إلى 10، سيبدأ التوسع. (التكوين هنا هو لأغراض العرض فقط، يرجى تعديله وفقًا لاحتياجاتك الخاصة). ثم نقوم بإجراء طلبات مستمرة إلى خدمة httpbin عبر curl.
لاحقًا، إذا قمنا بفحص تطبيق pods، يمكنك رؤية أنه تم توسيعه تلقائيًا إلى اثنين بواسطة KEDA.
(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
عندما يكون التطبيق في حالة خمول بعد بعض الوقت، سنجد أن عدد pods قد تقلص تلقائيًا إلى نسخة واحدة.
(MoeLove) ➜ kubectl get pods
NAME READY STATUS RESTARTS AGE
httpbin-d46d778d7-chtdw 1/1 Running 0 32m
الخلاصة
يستخدم KEDA Prometheus كمقياس لجمع المقاييس التي يعرضها APISIX. نظرًا لأن كل الحركة المرورية تمر عبر APISIX أولاً، فإن الحصول على إحصائيات من جانب APISIX سيكون أسهل وأكثر ملاءمة.
عندما تزداد كمية طلبات الأعمال، سيتم توسيع التطبيق تلقائيًا، وعندما تنخفض كمية طلبات الأعمال، سيتم تقليص التطبيق تلقائيًا.
هذه الطريقة يمكن أن تخفف من عمليات التوسع/التقليص اليدوية في العديد من بيئات الإنتاج لضمان أفضل تجربة للمستخدمين.