شبكة خدمة APISIX مع Istio و Amesh
June 16, 2023
Apache APISIX تُستخدم بشكل أساسي لمعالجة حركة المرور بين الشمال والجنوب وغالبًا ما تكون موجودة عند الحدود بين تطبيقات العملاء والخدمات الخلفية.
باستخدام APISIX Ingress Controller، يمكن لـ APISIX أيضًا التحكم في حركة المرور الداخلة والخارجة في مجموعات Kubernetes باستخدام التكوين الأصلي.
ولكن مع تبني المنظمات للهندسة المعمارية القائمة على الخدمات المصغرة (microservices)، ظهرت تحديات جديدة تتمثل في التعامل مع حركة المرور بين هذه الخدمات المصغرة (east-west traffic).
تقوم شبكات الخدمات مثل Istio بحل هذه المشكلة عن طريق إزالة مسؤولية الشبكات من مطور الخدمة المصغرة وتوفير طبقة شبكات إضافية من المستوى الرابع والسابع (L4/L7).
باستخدام مكتبة Amesh الجديدة و Istio، يمكن أيضًا استخدام Apache APISIX كشبكة خدمات، وتحديدًا كطائرة بيانات لـ Istio، مما يجلب جميع إمكانيات إدارة حركة المرور إلى الاتصال بين الخدمات.
في هذه المقالة، سنستعرض ما هو Amesh، وكيف تم تطويره، وكيف يتم استخدامه لإدخال APISIX في شبكة خدمات.
Istio وبروتوكول xDS
Istio هي واحدة من أكثر شبكات الخدمات استخدامًا على نطاق واسع.
تحت الغطاء، تستخدم Istio Envoy كخادم وكيل عكسي في حاوياتها الجانبية.
تقوم Istio بإدارة حركة المرور عن طريق تكوين الحاويات الجانبية ديناميكيًا باستخدام واجهات برمجة تطبيقات xDS الخاصة بـ Envoy.
واجهات برمجة تطبيقات xDS هي طريقة لتكوين Envoy مع تغييرات تدريجية بدلاً من التكوينات البسيطة باستخدام ملفات ثابتة.
على الرغم من أن هذه الواجهات كانت مخصصة في البداية لتكوين Envoy، إلا أنها تطورت لتصبح واجهة برمجة تطبيقات طائرة بيانات عالمية. يمكن لأي طائرة بيانات تنفيذ هذه الواجهات، ويمكن لأي طائرة تحكم استخدام هذه الواجهة للعمل مع طائرات البيانات هذه.
في Istio، هذا يعني أنه يمكنك استبدال طائرة البيانات الافتراضية لـ Envoy بأي طائرة بيانات تنفذ واجهات برمجة تطبيقات xDS. لذا يمكنك استبدال Envoy بـ APISIX للحصول على إمكانيات إدارة حركة المرور في شبكة خدمات.
لكن APISIX لا تدعم واجهات برمجة تطبيقات xDS بشكل افتراضي. وهنا يأتي دور Amesh.
Amesh
Amesh هي مكتبة تقوم بترجمة البيانات من طائرة التحكم في Istio إلى تكوين APISIX.
APISIX تحل محل Envoy كطائرة بيانات لـ Istio.
تقوم Istio بالتواصل مع طائرة البيانات من خلال واجهات برمجة تطبيقات xDS. يدعم Amesh هذه الواجهات ثم يحولها إلى تكوين APISIX.
هذا مشابه لكيفية عمل APISIX ووحدة تحكم APISIX Ingress. تقوم وحدة التحكم بتحويل التكوينات المحددة باستخدام Ingress أو Gateway API إلى تنسيق APISIX.
نظرًا لأن واجهات برمجة تطبيقات xDS مدعومة من قبل المزيد من شبكات الخدمات مثل Linkerd و Open Service Mesh، يمكن لـ APISIX أيضًا العمل معها باستخدام مكتبة Amesh. لا يزال Amesh في مراحل التطوير المبكرة ويعمل حاليًا مع Istio v1.13.1.
باستخدام Amesh + APISIX، يمكنك استخدام Istio كما تفعل عادةً. بمجرد تكوين قواعد حركة المرور باستخدام الخدمة الافتراضية لـ Istio، يمكن لـ APISIX تنفيذ هذه القواعد.
تأتي إمكانيات APISIX الموسعة من خلال أكثر من 80 مكونًا إضافيًا. لاستخدام مكونات APISIX الإضافية مع Istio، نقوم بنشر مكون طائرة تحكم Amesh يسمى وحدة تحكم Amesh.
تأخذ وحدة تحكم Amesh تكوين مكون إضافي محدد باستخدام AmeshPluginConfig
CRD وتحوله إلى تكوين مكون إضافي لـ APISIX.
كل هذا سيمكننا من الاستفادة الكاملة من إمكانيات APISIX داخل الحاويات الجانبية.
APISIX + Istio Mesh
لنضع كل ما تعلمناه موضع التنفيذ.
سنقوم ببناء صور Amesh، وتكوين Istio لاستخدام الحاويات الجانبية لـ APISIX، ونشر Istio، واختبار كل شيء عن طريق تشغيل تطبيق نموذجي.
بناء الصور
سنقوم ببناء ثلاث صور:
- amesh-iptables: تُستخدم لإنشاء حاوية بدء لتعيين بعض قواعد iptables. هذه القواعد هي لتوجيه كل حركة المرور عبر APISIX.
- amesh-sidecar: تُستخدم لإنشاء الحاوية الجانبية.
- amesh-controller: تُستخدم لإنشاء مكون طائرة تحكم Amesh. تُستخدم هذه الوحدة لتكوين مكونات APISIX الإضافية.
أولاً، قم باستنساخ مستودع Amesh:
git clone https://github.com/api7/Amesh.git
cd Amesh
يمكنك بناء هذه الصور ودفعها إلى سجل الحاويات الخاص بك.
أضف عنوان السجل الخاص بك في متغير بيئة قبل تشغيل البناء، كما هو موضح أدناه:
export REGISTRY="docker.io/navendu"
make prepare-images
إذا كنت لا ترغب في بناء صورك الخاصة، يمكنك استخدام هذه الصور:
docker pull navendup/amesh-iptables:dev
docker pull navendup/amesh-sidecar:dev
docker pull navendup/amesh-controller:latest
نشر وحدة تحكم Amesh وتثبيت CRDs
سنستخدم Helm لنشر كل شيء إلى مجموعة Kubernetes. أستخدم minikube في هذه الأمثلة.
سنبدأ بإنشاء مساحة اسم جديدة istio-system
:
kubectl create namespace istio-system
لنشر وحدة تحكم Amesh، قم بتشغيل:
helm install amesh-controller -n istio-system \
./controller/charts/amesh-controller
تحتاج أيضًا إلى تثبيت CRDs للعمل مع وحدة تحكم Amesh:
kubectl apply -k controller/config/crd/
تكوين ونشر Istio + APISIX
قبل نشر شبكة الخدمات، سنقوم بتعيين بعض متغيرات البيئة:
export ISTIO_RELEASE=1.13.1
export REGISTRY="docker.io/navendup"
ثم سنستخدم Helm لنشر شبكة الخدمات:
helm install amesh \
--namespace istio-system \
--set pilot.image=istio/pilot:"$ISTIO_RELEASE" \
--set global.proxy.privileged=true \
--set global.proxy_init.image="$REGISTRY"/amesh-iptables:dev \
--set global.proxy.image="$REGISTRY"/amesh-sidecar:dev \
--set global.imagePullPolicy=IfNotPresent \
--set global.hub="docker.io/istio" \
--set global.tag="$ISTIO_RELEASE" \
./charts/amesh
الآن لدينا شبكة الخدمات ووحدة تحكم Amesh منشورة. بعد ذلك، لننشر تطبيقًا نموذجيًا لاختبار شبكة الخدمات الخاصة بنا.
نشر Bookinfo
سنستخدم تطبيق Bookinfo النموذجي لـ Istio.
أولاً، سنقوم بإضافة تسمية إلى مساحة الاسم الافتراضية لحقن الحاويات الجانبية تلقائيًا في أي وعاء في مساحة الاسم:
kubectl label ns default istio-injection=enabled
ثم يمكننا نشر Bookinfo عن طريق تشغيل:
kubectl apply -f e2e/bookinfo/bookinfo.yaml
سيؤدي هذا إلى تشغيل تطبيق Bookinfo، وسيكون لكل وعاء حاويات جانبية لـ APISIX:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-79f774bdb9-cbn87 2/2 Running 0 55s
productpage-v1-6b746f74dc-tntc8 2/2 Running 0 55s
ratings-v1-b6994bb9-r5j45 2/2 Running 0 55s
reviews-v1-545db77b95-n657s 2/2 Running 0 55s
reviews-v2-7bf8c9648f-zn97s 2/2 Running 0 55s
reviews-v3-84779c7bbc-wn8k2 2/2 Running 0 55s
اختبار الشبكة
للوصول إلى تطبيق Bookinfo، سنحتاج إلى بوابة دخول.
يمكنك استخدام APISIX لهذه البوابة، ولكن هذا موضوع لوقت آخر. في الوقت الحالي، يمكننا فقط استخدام port-forward
للوصول إلى خدمة product-page
:
kubectl port-forward productpage-v1-6b746f74dc-tntc8 9080:9080
الآن إذا فتحنا localhost:9080، سنتمكن من رؤية تطبيقنا النموذجي.
في كل مرة تقوم فيها بتحديث الصفحة، يتم سحب المراجعات من إصدار مختلف من خدمة المراجعات (لقد نشرنا ثلاثة إصدارات).
الآن لنطبق قاعدة باستخدام الخدمات الافتراضية التي توجه كل حركة المرور إلى الإصدارات v1 من الخدمات.
القاعدة واضحة، وستبدو كما يلي:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
---
يمكنك تطبيقها على مجموعتك عن طريق تشغيل:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/networking/virtual-service-all-v1.yaml
الآن إذا عدنا إلى تطبيقنا وقمنا بتحديث الصفحة، سيتوقف التطبيق عن التبديل بين الإصدارات المتعددة من خدمة المراجعات وسيقوم فقط بتوجيه حركة المرور إلى الإصدار v1.
لاحظ كيف تغير مظهر قسم المراجعات هنا. سيظل كما هو حتى إذا قمت بتحديث الصفحة.
باختصار، نقوم بتكوين قاعدة في Istio، وتقوم Istio بتنفيذها باستخدام حاوياتها الجانبية مع Apache APISIX. أنيق!
Amesh المستقبل
Amesh هو مشروع تجريبي، ولا يزال في مراحله الأولى.
تهدف الإصدارات المستقبلية من المشروع إلى دعم المزيد من الميزات من خلال الخدمات الافتراضية.
يمكنك المساهمة في تحسين المشروع أو متابعة الإصدارات الجديدة على GitHub.