APISIX, Prometheus, और KEDA का उपयोग करके Kubernetes में एप्लिकेशन को लोचदार तरीके से स्केल करें
February 17, 2023
परिचय
एक एप्लिकेशन में प्रवेश करने वाले ट्रैफ़िक की मात्रा समय-समय पर बदलती रहती है। उदाहरण के लिए, एक ऑनलाइन शॉपिंग एप्लिकेशन छुट्टियों के मौसम में सामान्य दिनों की तुलना में बहुत अधिक व्यस्त होता है। ट्रैफ़िक के आधार पर एप्लिकेशन की क्षमता को समायोजित करने में सक्षम होने से उपयोगकर्ता अनुभव और सेवाएं बहुत बेहतर होंगी।
Apache APISIX एक उच्च-प्रदर्शन वाला क्लाउड-नेटिव API गेटवे है जो यह निर्धारित करने के लिए सार्थक मेट्रिक्स प्रदान कर सकता है कि एप्लिकेशन को स्केल करने की आवश्यकता है या नहीं। यह एक मिडलवेयर है जो अपस्ट्रीम एप्लिकेशन को भेजे गए सभी ट्रैफ़िक को प्रोसेस करता है और इसलिए प्रक्रिया के दौरान ट्रैफ़िक डेटा एकत्र कर सकता है।
लोचदार स्केलिंग करने के लिए, KEDA को कंट्रोलर के रूप में उपयोग किया जाएगा, और Prometheus का उपयोग APISIX द्वारा प्रदान किए गए मेट्रिक्स को प्राप्त करने के लिए किया जाएगा।

KEDA में Prometheus Scaler का उपयोग कैसे करें
KEDA Kubernetes में एक इवेंट-आधारित ऑटोस्केलर है, जो विभिन्न स्केलर कॉन्फ़िगर कर सकता है। इस लेख में, APISIX द्वारा एक्सपोज़ किए गए मेट्रिक्स प्राप्त करने के लिए Prometheus स्केलर का उपयोग किया जाएगा।
KEDA को डिप्लॉय करें
KEDA को डिप्लॉय करना अपेक्षाकृत सरल है, बस संबंधित Helm रेपो जोड़ें और इसे इंस्टॉल करें।
(MoeLove) ➜ helm repo add kedacore https://kedacore.github.io/charts "kedacore" आपके रेपोजिटरी में जोड़ दिया गया है (MoeLove) ➜ helm repo update kedacore कृपया प्रतीक्षा करें जब तक हम आपके चार्ट रेपोजिटरी से नवीनतम जानकारी प्राप्त करते हैं... ..."kedacore" चार्ट रेपोजिटरी से सफलतापूर्वक अपडेट प्राप्त कर लिया गया है अपडेट पूर्ण। ⎈Happy Helming!⎈ (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
इंस्टॉलेशन के बाद, 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 हमें Kubernetes में Prometheus इंस्टेंस को तेजी से डिप्लॉय करने और मॉनिटरिंग नियमों को डिक्लेरेटिव कॉन्फ़िगरेशन के माध्यम से जोड़ने में मदद कर सकता है।
निम्नलिखित चरणों के माध्यम से 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 क्लस्टर पर लागू करने के बाद, आप देख सकते हैं कि default नेमस्पेस के तहत एक Prometheus इंस्टेंस बनाया गया है। चूंकि हमने Prometheus को TYPE LoadBalancer के साथ कॉन्फ़िगर किया है, उपयोगकर्ता सीधे LoadBalancer के पब्लिक IP के माध्यम से Prometheus तक पहुंच सकते हैं।
(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" चार्ट रेपोजिटरी से सफलतापूर्वक अपडेट प्राप्त कर लिया गया है अपडेट पूर्ण। ⎈Happy Helming!⎈ (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" अपग्रेड कर दिया गया है। Happy Helming! NAME: apisix LAST DEPLOYED: Thu Jan 19 02:11:23 2023 NAMESPACE: apisix STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: 1. एप्लिकेशन URL प्राप्त करने के लिए इन कमांड्स को चलाएं: NOTE: LoadBalancer IP उपलब्ध होने में कुछ मिनट लग सकते हैं। आप '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
अगला, APISIX के Prometheus प्लगइन को सक्षम करें। विशिष्ट कॉन्फ़िगरेशन विधियों और संबंधित पैरामीटर्स के लिए कृपया निम्नलिखित दो दस्तावेज़ों का संदर्भ लें।
- prometheus plugins | Apache APISIX®
- How to access Apache APISIX Prometheus metrics on Kubernetes | Apache APISIX®
एक बार सक्षम होने के बाद, Prometheus एक ServiceMonitor संसाधन बनाकर APISIX द्वारा एक्सपोज़ किए गए मेट्रिक्स को कैप्चर कर सकता है।
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
अगला, एक KEDA ScaledObject बनाएं और 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 तक पहुंच सकता है, तो विस्तार शुरू हो जाएगा। (यहां कॉन्फ़िगरेशन केवल प्रदर्शन के उद्देश्य से है, कृपया इसे अपनी स्थिति के अनुसार संशोधित करें)। फिर, हम curl के माध्यम से httpbin सेवा को लगातार अनुरोध भेजते हैं।
बाद में, यदि हम एप्लिकेशन पॉड्स की जांच करते हैं, तो आप देख सकते हैं कि यह 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
जब एप्लिकेशन कुछ समय बाद निष्क्रिय हो जाता है, तो हम पाएंगे कि पॉड्स की संख्या स्वचालित रूप से एक इंस्टेंस तक सिकुड़ गई है।
(MoeLove) ➜ kubectl get pods NAME READY STATUS RESTARTS AGE httpbin-d46d778d7-chtdw 1/1 Running 0 32m
सारांश
KEDA APISIX द्वारा एक्सपोज़ किए गए मेट्रिक्स को एकत्र करने के लिए Prometheus को स्केलर के रूप में उपयोग करता है। चूंकि सभी ट्रैफ़िक पहले APISIX से गुजरता है, APISIX साइड पर सांख्यिकी प्राप्त करना बहुत सरल और सुविधाजनक होगा।
जब व्यावसायिक अनुरोधों की मात्रा बढ़ती है, तो एप्लिकेशन स्वचालित रूप से विस्तारित हो जाएगा, और जब व्यावसायिक अनुरोधों की मात्रा कम होती है, तो एप्लिकेशन स्वचालित रूप से सिकुड़ जाएगा।
यह विधि कई उत्पादन वातावरण में मैन्युअल विस्तार/सिकुड़न संचालन को कम कर सकती है ताकि सर्वोत्तम उपयोगकर्ता अनुभव सुनिश्चित किया जा सके।