كيفية وكيل الخدمات الخارجية في 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: