متغيرات البيئة في بيئة المعاينة
ينشئ المطوّر بيئة. فتجد خدماتها بعضها بعضًا وتعرف كل خدمة رابط المعاينة الخاص بها دون أن يعدّل أحد أي متغيّر. وفيما يلي كيف يحدث ذلك.
لا يدخل هنا أي نموذج ذكاء اصطناعي ولا أي تخمين. كل قاعدة حتمية وضيّقة. فإعادة الكتابة التي تصيب في أغلب الأحيان أسوأ من عدمها لأنها تنقل حركة المرور إلى مكان لم يطلبه أحد ولا يراه أحد.
يعمل التطبيق بأحد وضعين وتعمل المتغيرات بطريقة مختلفة في كل منهما:
- الوضع الكامل هو الافتراضي للتطبيق الذي يحوي مجلد
nezal/. كل بيئة نسخة كاملة في مساحة أسماء مساحة العمل ويُسمّى كل كائن فيها<service>-preview-<environment>. راجع دليل مجلد nezal. - الوضع المشترك يبقي أساسًا مشتركًا واحدًا لكل تطبيق. ولكل بيئة مساحة أسماء خاصة بها فيها نسخ من الخدمات التي غيّرتها وأسماء بديلة (aliases) لكل ما عداها.
الوضع الكامل
1. العناوين التي تسمّي خدمة أخرى يُعاد توجيهها. يُعاد تسمية كل Service للبيئة. ولذلك فالمخطط
الذي يستدعي http://collaboration-server-service:9600 لن يصل إلى أي شيء. وينقل نزال هذه العناوين
إلى النسخة الموجودة في البيئة نفسها:
| ما هو | يصبح في البيئة amr |
|---|---|
<service> |
<service>-preview-amr |
<service>.<namespace> و<service>.<namespace>.svc والاسم الكامل في الكلستر |
<service>-preview-amr |
| أي شيء آخر | كما هو |
لا تُعاد كتابة القيمة إلا إذا كانت القيمة كلها عنوانًا. فالرابط داخل مستند JSON أو داخل قائمة
يُترك كما هو لأن التعديل داخل صيغة لا يحللها نزال قد يفسد قيمة كانت تعمل. أما سلسلة الاتصال
مثل redis://cache:6379 فهي قيمة كاملة على شكل رابط ولذلك يتغيّر مضيفها وحده.
وتُوجَّه بالطريقة نفسها المراجع إلى ConfigMap وSecret وطلبات وحدات التخزين (volume claims) وأسرار سحب الصور (image pull secrets) إلى النسخ الخاصة بالبيئة.
2. nezal.env لكل ما عدا ذلك. ملف واحد في مجلد nezal/ فيه قيم ثابتة وقوالب مثل
{{ .Environment }} و{{ .Service.cache.Host }}. ويصبح {{ .Secret.NAME }} مرجعًا إلى Secret
الخاص بالتطبيق ولا تُقرأ قيمته أبدًا داخل متغيّر. ويشرح
دليل مجلد nezal الصيغة وكل القوالب.
الأولوية في الوضع الكامل. من الأدنى إلى الأعلى. وعند تكرار اسم المتغيّر تغلب الطبقة اللاحقة.
- متغيرات البيئة التي يعلنها مخططك أو ملفات manifests مع إعادة توجيه عناوينها
- ما يضبطه نزال في كل نسخة (أدناه)
nezal.envمن فرع البيئة
الوضع المشترك
1. الأسماء القصيرة تعمل أصلًا. داخل مساحة أسماء البيئة توجد كل خدمة من خدمات التطبيق
باسمها القصير. والخدمة التي استبدلتها نسخة حقيقية. وكل خدمة أخرى اسم بديل يشير إلى الأساس
المشترك. لذلك فالخدمة التي تستدعي http://ledger:8080 تصل إلى ledger الخاص بك حين تشغّل نسخة
منه وإلى ledger المشترك حين لا تشغّلها. لا يُعاد كتابة أي شيء ولا حاجة إلى ذلك.
2. العناوين التي تسمّي الأساس يُعاد توجيهها. المخطط الذي يضبط
LEDGER_URL=http://ledger.payments.svc.cluster.local:8080 يتخطى الاسم البديل ويصل إلى
النسخة المشتركة حتى وأنت تشغّل نسختك. ونزال ينقل هذه العناوين. والقواعد هي هذه تحديدًا ولا شيء
غيرها:
| ما هو | يصبح | لماذا |
|---|---|---|
<service>.<app-namespace>.svc.<cluster-domain> |
<service> |
فيحلّه الاسم البديل داخل هذه البيئة |
<service>.<app-namespace>.svc |
<service> |
الحالة نفسها بصيغة أقصر |
<service>.<app-namespace> |
<service> |
الحالة نفسها بأقصر صيغة |
| المضيف العام للتطبيق | مضيف المعاينة لهذه البيئة | الرابط الذي يفتحه المتصفح يجب أن يصل إلى نسختك |
| أي شيء آخر | كما هو | ليس من شأننا نقله |
لا تُعاد كتابة القيمة إلا إذا كانت القيمة كلها عنوانًا. فالرابط داخل مستند JSON أو داخل قائمة
يُترك كما هو للسبب نفسه الوارد في الوضع الكامل. أما سلسلة الاتصال مثل
postgres://user:[email protected]:5432/shop فهي قيمة كاملة على شكل رابط.
ولذلك يتغيّر مضيفها وحده وتبقى بيانات الاعتماد واسم قاعدة البيانات كما هي.
3. ملف اختياري واحد لما تبقّى. علامة تفعيل ميزة (feature flag) أو بادئة مسار أو نقطة نهاية خارجية تختلف من فرع إلى آخر. هذه لا يستطيع نزال استنتاجها ولا يحاول.
الملف
nezal/environment.yaml في جذر مستودعك ويُقرأ من الفرع الذي أُنشئت منه البيئة. وغياب الملف
هو الحالة المعتادة ولا يعني شيئًا.
version: 1
services:
frontend:
env:
FEATURE_NEW_CHECKOUT: "true"
PUBLIC_API_URL: "{{ .PreviewURL }}/api"
BACKEND: "{{ .Service.backend.URL }}"
backend:
envFrom:
DATABASE_URL:
secretKeyRef:
name: shop-db
key: url
ويرتبط الملف بالفرع لا بالمطوّر عن قصد. تعدّله في فرع الميزة فيسري على بيئتك وعلى بيئة طلب الدمج (pull request) لذلك الفرع دون أن يكتب أحد شيئًا. أما الملف المسمّى باسم شخص فيتقادم ويُسرّب إعدادات شخصية إلى الشجرة المشتركة. ولا يفيد كذلك طلب دمج لا يرتبط بشخص.
ما يمكن أن يشير إليه القالب:
| المرجع | معناه |
|---|---|
{{ .Environment }} |
اسم البيئة |
{{ .Owner }} |
مالكها |
{{ .Ref }} |
الفرع الذي أُنشئت منه |
{{ .Namespace }} |
مساحة أسماء Kubernetes التي تضم النسخ |
{{ .PreviewURL }} |
رابط المعاينة الكامل |
{{ .PreviewHost }} |
المضيف وحده |
{{ .Domain }} |
نطاق الـ ingress |
{{ .Service.<name>.URL }} |
كيف تصل إلى تلك الخدمة من داخل هذه البيئة |
{{ .Service.<name>.Host }} |
اسمها القصير |
{{ .Service.<name>.Port }} |
أول منفذ معلن لها |
والاسم غير الموجود خطأ وليس سلسلة فارغة. فالبديل يطبع <no value> داخل متغيّر مستخدم فعلًا
ويجعل أحدهم يلاحق رابطًا هو حرفيًا هذه العبارة.
لا تضع أسرارًا في هذا الملف أبدًا. فهو مُودَع في git ويقرؤه كل من يستطيع استنساخ المستودع.
والقيمة النصية الصريحة التي يبدو اسمها اسم بيانات اعتماد تُرفض. استخدم envFrom مع
secretKeyRef أو configMapKeyRef لكل ما هو حسّاس.
الأولوية في الوضع المشترك. من الأدنى إلى الأعلى. وعند تكرار اسم المتغيّر تغلب الطبقة اللاحقة.
- متغيرات البيئة الخاصة بالأساس كما يعلنها مخططك أو ملفات manifests
- العناوين المعاد توجيهها إلى هذه البيئة
- ما يضبطه نزال في كل نسخة (أدناه)
nezal/environment.yamlمن فرعك- ما تضبطه أنت على البيئة في لوحة التحكم أو بالأمر
nezal up --set
ما يضبطه نزال في كل نسخة
تُضبط هذه المتغيرات في الوضعين تحت أي شيء تضبطه أنت ولذلك تغلب قيمتك دائمًا. وهي عقد ثابت: فالاسم الذي يُطرح في إصدار لا يُعاد تسميته ولا يُحذف أبدًا.
| المتغيّر | معناه |
|---|---|
NEZAL_ENVIRONMENT |
اسم البيئة |
NEZAL_OWNER |
مالكها |
NEZAL_REF |
الفرع الذي أُنشئت منه |
NEZAL_NAMESPACE |
مساحة الأسماء التي تضم النسخ |
NEZAL_PREVIEW_URL |
رابط المعاينة الكامل. ويكون فارغًا إذا لم يُضبط نطاق ingress |
NEZAL_PREVIEW_HOST |
المضيف وحده |
NEZAL_ROUTING_HEADER |
X-Nezal-Env. وهي الترويسة التي تمرّرها حين تستدعي خدمة أخرى عبر الـ ingress في الوضع المشترك |
وتعرض صفحة البيئة النتيجة مع مصدر كل قيمة فترى أي طبقة أنتجت كل قيمة. وتظهر فيها كل إعادة كتابة مع القيمة التي حلّت محلها والقاعدة التي انطبقت عليها. فلا يتغيّر شيء في الخفاء.
تطبيق واحد وبيئات كثيرة
عشرة مطوّرين على عشرة فروع يعني تطبيقًا واحدًا وعشر بيئات منه وليس عشرة تطبيقات. فالتطبيق هو ما يُربط بمستودع. والبيئة هي نسخة مطوّر واحد منه. وربط المستودع نفسه مرتين بالمسار نفسه يعني في أغلب الأحيان أن المطلوب بيئة جديدة. ونزال ينبّهك إلى ذلك حين تفعله.