كيفية وكيل الخدمات الخارجية في 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، يرجى زيارة مدوناتنا أو الاتصال بنا.