API7 Cloud تتكامل مع Kubernetes Service Discovery

Yong Qian

February 24, 2023

Products

توفير التكاليف، المرونة، قابلية التوسع، الموثوقية — إن انفجار تقنيات السحابة والحاويات قد أتى بالعديد من المزايا مقارنة بالهيكل التقليدي الأحادي. هذه المزايا جعلتها مفضلة لدى العديد من المستخدمين المؤسسيين.

ما يصاحب ذلك هو أن التغيير في الهيكل يجلب أيضًا تحديات جديدة. على سبيل المثال، تقليديًا، كانت قائمة عناوين IP الأمامية للوكيل العكسي غالبًا ما تكون ثابتة ويمكن كتابتها مباشرة في ملف التكوين الثابت. في عصر السحابة والحاويات، تتغير قائمة عناوين IP لكل خدمة أمامية باستمرار. يصبح صيانة ملفات التكوين كابوسًا إذا استمررت في استخدام ملفات التكوين الثابتة. لأن توقيت تحديثات ملفات التكوين سيؤثر مباشرة على توجيه حركة المرور، يتعين على المستخدمين إدخال برامج إضافية للتعامل مع التحديث التلقائي لملفات التكوين، مما يزيد بشكل كبير من تعقيد الهيكل.

لتبسيط العملية، تقدم API7 Cloud وظيفة اكتشاف الخدمة، والتي تتصل مباشرة بـ Kubernetes API Server للحصول على بيانات Endpoints في الوقت الفعلي، مما يساعد المستخدمين على وكيل التطبيقات الموزعة في مجموعة Kubernetes بسهولة.

اكتشاف الخدمة في API7 Cloud

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

إنشاء سجل خدمة في API7 Cloud

نشر الخدمات في 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

تم إنشاء خدمة httpbin

إنشاء تطبيق وAPI في API7 Cloud

بعد نشر التطبيق الاختباري، انتقل إلى صفحة API Management -> Applications في API7 Cloud وانقر على زر Create Application لإنشاء تطبيق جديد. التكوين الأساسي هو كما يلي:

  • sd.httpbin.org كـ Host
  • / كـ Path prefix

الجزء الحرج هو تكوين الخدمة الأمامية لاستخدام Kubernetes والسجل الذي أنشأناه للتو لاكتشاف الخدمة بدلاً من قائمة ثابتة من عناوين IP:

اكتشاف الخدمة بدلاً من قائمة ثابتة من عناوين IP

بعد ذلك، قمنا بإنشاء API /anything في التطبيق لاختبار الوكيل:

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
Tags: