API7 Cloud تتكامل مع Kubernetes Service Discovery
Yong Qian
February 24, 2023
توفير التكاليف، المرونة، قابلية التوسع، الموثوقية — إن انفجار تقنيات السحابة والحاويات قد أتى بالعديد من المزايا مقارنة بالهيكل التقليدي الأحادي. هذه المزايا جعلتها مفضلة لدى العديد من المستخدمين المؤسسيين.
ما يصاحب ذلك هو أن التغيير في الهيكل يجلب أيضًا تحديات جديدة. على سبيل المثال، تقليديًا، كانت قائمة عناوين IP الأمامية للوكيل العكسي غالبًا ما تكون ثابتة ويمكن كتابتها مباشرة في ملف التكوين الثابت. في عصر السحابة والحاويات، تتغير قائمة عناوين IP لكل خدمة أمامية باستمرار. يصبح صيانة ملفات التكوين كابوسًا إذا استمررت في استخدام ملفات التكوين الثابتة. لأن توقيت تحديثات ملفات التكوين سيؤثر مباشرة على توجيه حركة المرور، يتعين على المستخدمين إدخال برامج إضافية للتعامل مع التحديث التلقائي لملفات التكوين، مما يزيد بشكل كبير من تعقيد الهيكل.
لتبسيط العملية، تقدم API7 Cloud وظيفة اكتشاف الخدمة، والتي تتصل مباشرة بـ Kubernetes API Server للحصول على بيانات Endpoints في الوقت الفعلي، مما يساعد المستخدمين على وكيل التطبيقات الموزعة في مجموعة Kubernetes بسهولة.
اكتشاف الخدمة في API7 Cloud
التحضير
أولاً، نحتاج إلى نشر مثيل APISIX عبر cloud-cli. راجع وثائق API7 Cloud: نشر مثيل بوابة.
في هذا المثال، سنستخدم إرشادات النشر في Kubernetes المقدمة في الوثيقة لإنشاء موارد مختلفة تحت مساحة الاسم apisix
، والتي نحتاج إلى إنشائها مسبقًا:
kubectl create namespace apisix
cloud-cli deploy kubernetes \
--name my-apisix \
--namespace apisix \
--apisix-image apache/apisix:2.15.0-centos
إنشاء حساب خدمة
حساب الخدمة هو المورد الأساسي لـ Kubernetes لتنفيذ التحكم في الوصول القائم على الأدوار (RBAC). يحتاج API7 Cloud إلى الحصول على أذونات list
و watch
لمورد Endpoints للحصول على قائمة مثيلات الخدمة الأمامية.
التكوين المقابل في yaml هو كما يلي:
# rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: apisix-k8s-sd-watcher
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: apisix-k8s-sd-watcher-binding
subjects:
- kind: ServiceAccount
name: apisix-k8s-sd-sa
namespace: apisix
roleRef:
kind: ClusterRole
name: apisix-k8s-sd-watcher
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: apisix-k8s-sd-sa
namespace: apisix
إنشاء حساب خدمة والحصول على رمز:
kubectl apply -f rbac.yaml
SECRET_NAME=`kubectl get sa -n apisix apisix-k8s-sd-sa -ojsonpath='{.secrets[0].name}'`
kubectl get secrets $SECRET_NAME -n apisix -ojsonpath='{.data.token}' | base64 -d
إنشاء سجل خدمة في API7 Cloud
انتقل إلى Control Plane -> Settings -> Service Registry، واستخدم الرمز الذي تم الحصول عليه في الخطوة السابقة لإنشاء سجل خدمة من نوع Kubernetes في API7 Cloud (لاحظ أنه يجب ملء عنوان API Server بناءً على حالتك الاستخدامية). في هذا المثال، تم نشر APISIX أيضًا في مجموعة Kubernetes المستهدفة، لذا فإن عنوان خادم API الذي نستخدمه هو kubernetes.default.svc.cluster.local
:
نشر الخدمات في Kubernetes
للتحقق من فعالية اكتشاف خدمة Kubernetes، قمنا بنشر ثلاث نسخ من خدمة HTTPBin وإنشاء خدمة مقابلة.
kubectl create deployment httpbin --image=kennethreitz/httpbin:latest --replicas=3 -n apisix
kubectl create service clusterip httpbin --tcp=80:80 -n apisix
إنشاء تطبيق وAPI في API7 Cloud
بعد نشر التطبيق الاختباري، انتقل إلى صفحة API Management -> Applications في API7 Cloud وانقر على زر Create Application لإنشاء تطبيق جديد. التكوين الأساسي هو كما يلي:
sd.httpbin.org
كـHost
/
كـPath prefix
الجزء الحرج هو تكوين الخدمة الأمامية لاستخدام Kubernetes والسجل الذي أنشأناه للتو لاكتشاف الخدمة بدلاً من قائمة ثابتة من عناوين IP:
بعد ذلك، قمنا بإنشاء API /anything
في التطبيق لاختبار الوكيل:
اختبار الوكيل
أولاً، قم بتوجيه منفذ HTTP لطائرة البيانات إلى الجهاز المحلي عبر port-forward
:
kubectl port-forward -n apisix svc/apisix-gateway 9080:80
استخدم curl لطلب الخدمة المستهدفة:
curl http://127.0.0.1:9080/anything -H 'Host: sd.httpbin.org' -i
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 373
Connection: keep-alive
Date: Mon, 09 Jan 2023 08:33:44 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX