التوجيه: كيف تصل حركة مرور المطوّر إلى نسخه
يشغّل نزال موجّهًا واحدًا لكل أساس (Baseline) بجوار خدمات التطبيق. ويشير كل اسم Service
داخل الكلستر (ledger أو payments-api) إلى الموجّه. أما الـ Pods الحقيقية فتعمل خلف
<name>-baseline. وتوجد نسخ البيئة في مساحة الأسماء الخاصة بها ولا يُوصَل إليها إلا عبر
الموجّه.
مفتاح التوجيه
تحمل الطلبات اسم البيئة في X-Nezal-Env: <environment>. ويقبل الموجّه أيضًا عنصر baggage
وفق معيار W3C بالصيغة nezal-env=<environment> ويضبطه كذلك. وبهذا لا تحتاج الخدمات التي
تمرّر baggage الخاص بـ OpenTelemetry أصلًا إلى أي تغيير.
يجب أن تمرّر خدماتك X-Nezal-Env (أو baggage) في كل استدعاء صادر بالطريقة نفسها
التي تمرّر بها سياق التتبع. ومن دونه يصل الاستدعاء الصادر من خدمة في الأساس إلى نسخة الأساس
من الخدمة حتى لو كانت البيئة تستبدل تلك الخدمة بنسختها.
ما يفعله الموجّه بالطلب
| يصل عبر | تُؤخذ البيئة من | ترويسات التوجيه القادمة من العميل | يذهب إلى |
|---|---|---|---|
| منفذ الـ Service (داخل الكلستر) | X-Nezal-Env وإلا فمن baggage |
موثوقة | النسخة إذا كانت البيئة تستبدل الخدمة وإلا فإلى <name>-baseline |
| منفذ الحافة (من الـ Ingress) | ترويسة Host فقط | تُحذف | خدمة entrypoint في الأساس مع اختيار النسخة أو الأساس كما سبق |
أسماء البيئات غير المعروفة تُوجَّه إلى الأساس ولا تُرفض. وتُحصى كل حالة في
nezal_router_unknown_env_total وتُسجَّل حدثًا (Event) من نوع UnknownEnvironment على
الأساس. وبهذا يظهر المطوّر الذي حُذفت بيئته في منتصف جلسته.
المنافذ المعلنة بـ protocol: tcp والخدمات الموسومة بـ shared: true لا تمر عبر الموجّه
أبدًا. فهي تصل دائمًا إلى Pods الأساس مباشرة.
روابط المعاينة وTLS
مع --ingress-domain=<domain> ينشر المشغّل:
<app>.<domain>للأساس<env>--<app>.<domain>لكل بيئة
وكلاهما كائن Ingress بمضيف محدد تمامًا في مساحة أسماء التطبيق ويخدمهما Service الحافة
التابع للموجّه. اضبط --ingress-class إذا كان في الكلستر أكثر من متحكم ingress واحد.
لـ TLS شكلان ولا يُصدر نزال شهادة في أي منهما. لا يتصل المنتج أبدًا بأي جهة إصدار شهادات. لذلك فالشهادات مسؤوليتك سواء كنت تملكها أو تشغّل أداة تحصل عليها.
- شهادة شاملة (wildcard) لـ
*.<domain>: أنشئ Secret من نوع TLS يحملها في كل مساحة أسماء تطبيق ومرّر اسمه عبر--ingress-tls-secret. ويمكن لـ cert-manager أن يملأ ذلك الـ Secret عبر تحدٍّ من نوع DNS-01 إذا كان لديك موفّر يدعم خدمة DNS الخاصة بك. - شهادة لكل مضيف: مرّر
--ingress-per-host-tlsوأعطِ--ingress-annotationsالوسم (annotation) الذي يقرأه مدير الشهادات لديك مثلcert-manager.io/cluster-issuer=letsencrypt-prod. عندها يسمّي كل Ingress ينشئه المشغّل كائن Secret خاصًا به هو<host>-tlsويحمل ذلك الوسم. فيُصدر cert-manager شهادة لكل مضيف معاينة عبر HTTP-01 بمجرد ظهوره. لا حاجة إلى شهادة شاملة ولا إلى موفّر DNS. والثمن هو حد المعدل الذي تفرضه جهة الإصدار على الشهادات الجديدة.
تُقدَّم روابط المعاينة عبر HTTP غير مشفر إلى أن يُطبَّق أحد هذين الشكلين. ويعرض كل أساس
حينها الشرط IngressTLS=False بالسبب NoTLSSecret. ومع الإصدار لكل مضيف يكون السبب
CertificatePending إلى أن يوجد Secret مضيف الأساس.
روابط المعاينة تتطلب تسجيل الدخول افتراضيًا (previewAuth.enabled في المخطط). ويتحقق الموجّه
من ملف تعريف ارتباط (cookie) موقّع تصدره واجهة API بعد التحقق المعتاد من الجلسة. والزائر الذي لا
يملكه يُحوَّل إلى صفحة تسجيل الدخول. وهذا يغطي الوضع المشترك. أما بيئة الوضع الكامل فليس لها
موجّه ورابط معاينتها لا يتطلب تسجيل الدخول بعد.
التشخيص
- ترويسة الاستجابة
X-Nezal-Upstream: copy|baselineتبيّن أي نسخة أجابت. - يسرد
Baseline.status.routesمنفذ الاستماع في الموجّه لكل منفذ خدمة. - يعرض
Baseline.status.conditions[RoutingReady]القيمةRouterStartingأوRouterSwitching(قد تحدث انقطاعات وجيزة) أوRouterReady. - المقاييس على المنفذ 9090 في Service الموجّه:
nezal_router_requests_totalوnezal_router_request_duration_secondsوnezal_router_unknown_env_totalوnezal_router_edge_headers_dropped_total.