كيفية وكيل الخدمات الخارجية في Apache APISIX Ingress Controller

Yeqi Peng

January 13, 2023

Products

في هذا البرنامج التعليمي، سنقدم كيفية تكوين الخدمات الخارجية في موارد ApisixUpstream.

هذا مفيد عندما تعتمد خدمتك على خدمة طرف ثالث أو خدمة من مجموعة K8s أخرى. كما يوفر طريقة لإدارة ApisixRoute الخاص بك مع خدمات ExternalName المشتركة، دون الحاجة إلى تعديل عدد كبير من ApisixRoutes عند تحديث اسم الخدمة المشار إليها.

المتطلبات الأساسية

  • مجموعة Kubernetes متاحة
  • تثبيت APISIX و APISIX Ingress Controller متاح

نفترض أن APISIX الخاص بك مثبت في مساحة الاسم apisix.

مقدمة

يدعم APISIX Ingress تكوين الخدمات الخارجية كنقاط نهاية خلفية، سواء لخدمات ExternalName في K8s أو النطاقات المباشرة.

في هذه الحالة، لا نقوم بتكوين حقل backends في مورد ApisixRoute. بدلاً من ذلك، سنستخدم حقل 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

في هذا المثال، قمنا بتكوين httpbin.org كنقطة نهاية خلفية. يشير النوع Domain إلى أن هذه خدمة طرف ثالث، وأي اسم نطاق مدعوم هنا.

إذا كنت تريد استخدام خدمة اسم خارجي في مجموعة K8s، يجب أن يكون النوع Service ويجب أن يكون الاسم هو اسم الخدمة. من خلال تكوين ApisixUpstream مع النوع Service، ستقوم وحدة التحكم بالمدخلات تلقائيًا بتتبع محتوى خدمة 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

بعد تطبيق التكوين أعلاه، يمكننا محاولة الوصول إلى httpbin.org مباشرة من خلال APISIX.

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 عبر الإنترنت.

خدمة الاسم الخارجي كنقطة نهاية خلفية

لنقم بنشر تطبيق httpbin بسيط في مساحة الاسم test كنقطة نهاية خلفية لخدمة الاسم الخارجي التي سننشئها لاحقًا.

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

ثم استخدم التكوين التالي لإنشاء خدمة ExternalName في مساحة الاسم apisix.

apiVersion: v1 kind: Service metadata: name: ext-httpbin spec: type: ExternalName externalName: httpbin.test.svc

الآن يمكننا إنشاء 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 عن طريق توجيه الطلبات إلى الخدمات الخارجية. يسمح للمستخدمين بسهولة دمج خدمات الطرف الثالث، مثل خدمات المصادقة أو الخدمات عبر المجموعات.

لمزيد من المعلومات حول بوابة API، يرجى زيارة مدوناتنا أو الاتصال بنا.

Tags: