Apache APISIX Ingress Controller में External Services को Proxy कैसे करें
Yeqi Peng
January 13, 2023
इस ट्यूटोरियल में, हम ApisixUpstream संसाधनों में बाहरी सेवाओं को कॉन्फ़िगर करने का तरीका बताएंगे।
यह तब उपयोगी होता है जब आपकी सेवा किसी तीसरे पक्ष की सेवा या किसी अन्य K8s क्लस्टर की सेवा पर निर्भर करती है। यह आपके ApisixRoute को साझा ExternalName सेवाओं के साथ प्रबंधित करने का एक तरीका भी प्रदान करता है, जब संदर्भित सेवा नाम अपडेट होता है तो बड़ी संख्या में ApisixRoutes को संशोधित करने की आवश्यकता नहीं होती है।
पूर्वापेक्षाएँ
- एक उपलब्ध Kubernetes क्लस्टर
- एक उपलब्ध APISIX और APISIX Ingress Controller स्थापना
हम मानते हैं कि आपका APISIX apisix नेमस्पेस में स्थापित है।
परिचय
APISIX Ingress बाहरी सेवाओं को बैकएंड के रूप में कॉन्फ़िगर करने का समर्थन करता है, चाहे वह K8s ExternalName सेवाएं हों या सीधे डोमेन।
इस मामले में, हम ApisixRoute संसाधन में backends फ़ील्ड को कॉन्फ़िगर नहीं करते हैं। इसके बजाय, हम upstreams फ़ील्ड का उपयोग करेंगे ताकि एक ApisixUpstream संसाधन को संदर्भित किया जा सके जिसमें externalNodes फ़ील्ड कॉन्फ़िगर हो।
उदाहरण के लिए:
# httpbin-route.yaml apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: name: httpbin-route spec: http: - name: rule1 match: hosts: - local.httpbin.org paths: - /* # backends: # हम `backends` फ़ील्ड का उपयोग नहीं करेंगे # - serviceName: httpbin # servicePort: 80 upstreams: - name: httpbin-upstream
यह कॉन्फ़िगरेशन इंग्रेस कंट्रोलर को बताता है कि K8s सेवाओं के माध्यम से अपस्ट्रीम होस्ट को हल न करें, बल्कि संदर्भित ApisixUpstream में परिभाषित कॉन्फ़िगरेशन का उपयोग करें।
संदर्भित ApisixUpstream में externalNodes फ़ील्ड कॉन्फ़िगर होना अनिवार्य है। उदाहरण के लिए:
# httpbin-upstream.yaml apiVersion: apisix.apache.org/v2 kind: ApisixUpstream metadata: name: httpbin-upstream spec: externalNodes: - type: Domain name: httpbin.org
इस yaml उदाहरण में, हमने httpbin.org को बैकएंड के रूप में कॉन्फ़िगर किया है। Domain प्रकार इंगित करता है कि यह एक तीसरे पक्ष की सेवा है, और यहां कोई भी डोमेन नाम समर्थित है।
यदि आप K8s क्लस्टर में एक बाहरी नाम सेवा का उपयोग करना चाहते हैं, तो प्रकार Service होना चाहिए और नाम सेवा का नाम होना चाहिए। Service प्रकार के साथ ApisixUpstream को कॉन्फ़िगर करके, इंग्रेस कंट्रोलर स्वचालित रूप से ExternalName सेवा की सामग्री और उसके परिवर्तनों को ट्रैक करेगा।
बाहरी डोमेन अपस्ट्रीम
apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: name: httpbin-route spec: http: - name: rule1 match: hosts: - local.httpbin.org paths: - /* upstreams: - name: httpbin-upstream --- apiVersion: apisix.apache.org/v2 kind: ApisixUpstream metadata: name: httpbin-upstream spec: externalNodes: - type: Domain name: httpbin.org
उपरोक्त कॉन्फ़िगरेशन लागू करने के बाद, हम APISIX के माध्यम से सीधे httpbin.org तक पहुंचने का प्रयास कर सकते हैं।
kubectl exec -it -n apisix APISIX_POD_NAME -- curl -i -H "Host: local.httpbin.org" http://127.0.0.1:9080/get
यदि सब कुछ ठीक से काम करता है, तो आपको इस तरह का परिणाम दिखाई देगा:
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 321 Connection: keep-alive Date: Thu, 15 Dec 2022 10:47:30 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Server: APISIX/3.0.0 { "args": {}, "headers": { "Accept": "*/*", "Host": "local.httpbin.org", "User-Agent": "curl/7.29.0", "X-Amzn-Trace-Id": "Root=xxxxx", "X-Forwarded-Host": "local.httpbin.org" }, "origin": "127.0.0.1, xxxxxxxxx", "url": "http://local.httpbin.org/get" }
हेडर Server: APISIX/3.0.0 इंगित करता है कि अनुरोध APISIX से भेजा गया है। और प्रतिक्रिया में X-Amzn-Trace-Id शामिल है जो इंगित करता है कि अनुरोध को ऑनलाइन httpbin सेवा द्वारा संभाला गया था।
बाहरी नाम सेवा अपस्ट्रीम
आइए test नेमस्पेस में एक सरल httpbin ऐप को बैकएंड के रूप में तैनात करें जिसे हम बाद में बनाने वाली बाहरी नाम सेवा के लिए उपयोग करेंगे।
kubectl create ns test kubectl -n test run httpbin --image-pull-policy IfNotPresent --image=kennethreitz/httpbin --port 80 kubectl -n test expose pod/httpbin --port 80
फिर apisix नेमस्पेस में एक ExternalName सेवा बनाने के लिए निम्नलिखित कॉन्फ़िगरेशन का उपयोग करें।
apiVersion: v1 kind: Service metadata: name: ext-httpbin spec: type: ExternalName externalName: httpbin.test.svc
अब हम एक ExternalName सेवा ApisixRoute और ApisixUpstream बना सकते हैं।
apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: name: ext-route spec: http: - name: rule1 match: hosts: - ext.httpbin.org paths: - /* upstreams: - name: ext-upstream --- apiVersion: apisix.apache.org/v2 kind: ApisixUpstream metadata: name: ext-upstream spec: externalNodes: - type: Service name: ext-httpbin
एक बार कॉन्फ़िगरेशन सिंक हो जाने के बाद, निम्नलिखित कमांड के साथ इसे एक्सेस करने का प्रयास करें।
केवल वह तर्क बदलता है जो हम पास करते हैं।
kubectl exec -it -n apisix APISIX_POD_NAME -- curl -i -H "Host: ext.httpbin.org" http://127.0.0.1:9080/get
आउटपुट इस प्रकार होना चाहिए:
HTTP/1.1 200 OK Content-Type: application/json Content-Length: 234 Connection: keep-alive Date: Thu, 15 Dec 2022 10:54:21 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Server: APISIX/3.0.0 { "args": {}, "headers": { "Accept": "*/*", "Host": "ext.httpbin.org", "User-Agent": "curl/7.29.0", "X-Forwarded-Host": "ext.httpbin.org" }, "origin": "127.0.0.1", "url": "http://ext.httpbin.org/get" }
हम देख सकते हैं कि प्रतिक्रिया पिछले वाले के समान है, लेकिन कुछ फ़ील्ड मौजूद नहीं हैं। ऐसा इसलिए है क्योंकि अनुरोध हमारी स्थानीय httpbin सेवा को भेजा गया था न कि ऑनलाइन वाले को।
बाहरी नाम सेवा में डोमेन
बाहरी नाम सेवा K8s क्लस्टर के बाहर किसी भी डोमेन नाम को भी होल्ड कर सकती है।
आइए पिछले अनुभाग में लागू की गई बाहरी सेवा कॉन्फ़िगरेशन को अपडेट करें।
apiVersion: v1 kind: Service metadata: name: ext-httpbin spec: type: ExternalName externalName: httpbin.org
इसे फिर से एक्सेस करने का प्रयास करें, और आउटपुट में कई origin और एक X-Amzn-Trace-Id हेडर शामिल होना चाहिए, जिसका अर्थ है कि हम ऑनलाइन httpbin.org सेवा तक पहुंच रहे हैं।
निष्कर्ष
इस ट्यूटोरियल में, हमने APISIX Ingress Controller की कार्यात्मक सीमाओं को बाहरी सेवाओं को प्रॉक्सी करके विस्तारित किया है। यह उपयोगकर्ताओं को तीसरे पक्ष की सेवाओं, जैसे प्रमाणीकरण सेवाओं या क्रॉस-क्लस्टर सेवाओं को आसानी से एकीकृत करने की अनुमति देता है।
API गेटवे के बारे में अधिक जानकारी के लिए, कृपया हमारे ब्लॉग पर जाएं या हमसे संपर्क करें।