كيفية وكيل الخدمات الخارجية في Apache APISIX Ingress Controller
Yeqi Peng
January 13, 2023
في هذا البرنامج التعليمي، سنقدم كيفية تكوين الخدمات الخارجية في موارد 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، يرجى زيارة مدوناتنا أو الاتصال بنا.