تحديد المشاكل وحلّها

أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

خطأ 404 (لم يتم العثور على الصفحة) في Istio

قد يكون تصحيح الخطأ 404 (لم يتم العثور على الصفحة) في Istio أمرًا محبطًا. نأمل أن يمنحك هذا نقطة انطلاق لتحديد المشاكل المحتملة.

تعارض البوابة ذات أحرف البدل

لا يمكن أن يكون هناك سوى تعريف واحد للبوابة يستخدم قيمة المضيفين لحرف البدل "*". إذا كنت قد نشرت أي شيء آخر يتضمّن بوابة ذات حرف بدل، ستتعذّر طلبات العميل وستظهر الحالة 404.

مثال:

$ istioctl get gateways
GATEWAY NAME         HOSTS     NAMESPACE   AGE
bookinfo-gateway     *         default     20s
httpbin-gateway      *         default     3s

إذا كان الأمر كذلك، عليك حذف إحدى البوابات المتعارضة أو تغييرها.

تتبُّع مكان تعذُّر عرض المسار

تشبه Istio البصل (أو ربما الغول)، فهي تتضمّن طبقات. لإصلاح الخطأ 404 بشكل منهجي، عليك البدء من الهدف والعمل على توسيع نطاق البحث.

عبء العمل في الخلفية

تأكَّد من إمكانية الوصول إلى عبء العمل من الحاوية الجانبية:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl localhost:80/headers

الخادم الجانبي للخلفية

اضبط عنوان الخدمة واحصل على عنوان IP الخاص بحزمة العمل.

SERVICE=httpbin.default.svc.cluster.local:80
  POD_IP=$(kubectl get pod $WORKLOAD_POD -o jsonpath='{.status.podIP}')

الوصول إلى عبء العمل من خلال التطبيق الجانبي:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl -v http://$SERVICE/headers --resolve "$SERVICE:$POD_IP"

أو إذا تم تفعيل Istio mTLS:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl -v https://$SERVICE/headers --resolve "$SERVICE:$POD_IP" --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --insecure

البوابة (أو حاوية جانبية للواجهة الأمامية)

الوصول إلى الخدمة من البوابة:

kubectl -n istio-system exec $GATEWAY_POD -- curl -v http://$SERVICE/header

أو إذا تم تفعيل Istio mTLS:

kubectl -n istio-system exec $GATEWAY_POD -- curl -v https://$SERVICE/headers --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --insecure

الإحصاءات غير المتوفّرة

إذا لم تظهر لك الإحصاءات في واجهة مستخدم "إحصاءات Google"، إليك الأسباب المحتملة:

  • قد يتأخّر استيعاب Apigee لبضع دقائق
  • لم يتم إعداد سجلّ الوصول إلى gRPC في Envoy بشكل صحيح
  • يتعذّر على Envoy الوصول إلى "الخدمة البعيدة"
  • تعذُّر تحميل "الخدمة عن بُعد"

عدم رفض مفتاح واجهة برمجة التطبيقات غير المتوفّر أو غير الصالح

إذا لم تنجح عملية التحقّق من صحة مفتاح واجهة برمجة التطبيقات بشكلٍ سليم، يُرجى مراعاة الأسباب المحتملة التالية:

الخادم الوكيل المباشر

تحقَّق من إعدادات ext-authz.

Sidecar
  • تأكَّد من ضبط المستمع على وضع الاعتراض.
  • تحقَّق من إعدادات ext-authz.

يتم التحقّق من الطلبات غير الصالحة والسماح بها

  • تم ضبط "الخدمة عن بُعد" على وضع "السماح بالوصول عند التعذّر"
  • لم يتم ضبط Envoy لإجراء عمليات التحقّق من التحكم المستند إلى الأدوار (RBAC)

للحصول على معلومات حول كيفية حلّ هذه المشاكل، يُرجى الرجوع إلى موضوع مستندات Envoy التالي: الترخيص الخارجي، والرجوع إلى معلومات حول السمة failure_mode_allow. تتيح لك هذه السمة تغيير سلوك الفلتر عند حدوث أخطاء.

عدم رفض رمز ويب JSON غير متوفّر أو غير صالح

السبب المحتمل هو عدم ضبط فلتر Envoy JWT.

تعذُّر استخدام مفتاح واجهة برمجة التطبيقات الصالح

الأسباب المحتملة

  • يتعذّر على Envoy الوصول إلى الخدمة البعيدة
  • بيانات الاعتماد غير صالحة
  • لم يتم ضبط منتج Apigee API للهدف والبيئة

خطوات تحديد المشاكل وحلّها

التحقّق من منتج واجهة برمجة التطبيقات على Apigee

  • هل تم تفعيلها لبيئتك (الاختبار مقابل الإنتاج)؟

    يجب ربط المنتج بالبيئة نفسها التي تستخدمها "الخدمة عن بُعد".

  • هل هو مرتبط بالهدف الذي تحاول الوصول إليه؟

    راجِع قسم استهدافات الخدمة البعيدة في Apigee. تذكَّر أنّ اسم الخدمة يجب أن يكون اسم مضيف مؤهَّلاً بالكامل. إذا كانت الخدمة من Istio، سيكون الاسم على النحو التالي: helloworld.default.svc.cluster.localcode>، وهو يمثّل الخدمة helloworld في مساحة الاسم default.

  • هل يتطابق مسار المورد مع طلبك؟

    تذكَّر أنّ مسارًا مثل / أو /** سيطابق أي مسار. يمكنك أيضًا استخدام أحرف البدل "*" أو "**" للمطابقة.

  • هل لديك تطبيق مطوِّر؟

    يجب ربط منتج واجهة برمجة التطبيقات بتطبيق مطوِّر للتحقّق من مفاتيحه.

التحقّق من طلبك

  • هل يتم تمرير مفتاح المستهلك في x-api-key header؟

    مثال:

    curl http://localhost/hello -H "x-api-key: wwTcvmHvQ7Dui2qwj43GlKJAOwmo"
  • هل تستخدم Consumer Key جيّدًا؟

    تأكَّد من الموافقة على بيانات الاعتماد من التطبيق الذي تستخدمه لمنتج واجهة برمجة التطبيقات.

التحقّق من سجلّات "الخدمة عن بُعد"

  • بدء "الخدمة عن بُعد" مع تسجيل الدخول في debug level

    استخدِم الخيار -l debug في سطر الأوامر.

  • محاولة الوصول إلى هدفك ومراجعة السجلات

    ابحث في السجلّات عن سطر يشبه ما يلي:

    Resolve api: helloworld.default.svc.cluster.local, path: /hello, scopes: []
    Selected: [helloworld]
    Eliminated: [helloworld2 doesn't match path: /hello]