Infrastructure as Code
منصة k3s على Azure
منصة Kubernetes صغيرة بمستوى الإنتاج على Azure، مبنية بالكود فقط: Terraform يُنشئ أجزاء السحابة، وAnsible يقوّي الخوادم ويثبّت k3s، وpipeline تطبّق كل تغيير بعد المراجعة، بلا أسرار مخزّنة.
نظرة سريعة
- 3
- أجهزة افتراضية بأمر واحد
- 0
- أسرار في الـ pipeline (OIDC)
- 2
- مراجعتان قبل أي تغيير: الخطة والموافقة
- 1
- أمر واحد لحذف كل شيء
الهدف
الخوادم المبنية يدويًا تختلف مع الوقت، ولا أحد يعرف من غيّر ماذا، وإعادة بناء جهاز مفقود تأخذ يومًا. الهدف: منصة تكون فيها البيئة كلها كودًا، ويُراجَع كل تغيير كخطة قبل تنفيذه، وتُقوّى الخوادم بالطريقة نفسها كل مرة، وتبقى التكلفة تحت السيطرة.
ماذا يُظهر المشروع
- البنية ككود
- Terraform (azurerm 4) بوحدتين (الشبكة والعقدة) وحالة بعيدة في Azure Storage بتسجيل دخول Entra ID.
- الشبكة
- VNet وNSG ترفض كل شيء افتراضيًا، وبوابة NAT للخروج، وStandard Load Balancer للمنفذين 80/443، والدخول الإداري من عنوانك فقط.
- الهوية والأسرار
- GitHub OIDC (بلا client secret)، وهويات مُدارة على الأجهزة، ورمز انضمام k3s داخل Key Vault.
- التقوية
- SSH وsysctl وauditd وfail2ban والتحديثات التلقائية؛ وتشفير أسرار k3s وPod Security وسجل التدقيق وشبكة pods مشفّرة.
- المراقبة
- Prometheus وAlertmanager وGrafana وLoki وFluent Bit مع قواعد تنبيه خاصة، وAzure Monitor لسجلات النظام.
- التحكم في التكلفة
- ميزانية مع تنبيه توقّع، وأحجام أجهزة صغيرة، وحد للسجلات، وأمر واحد لحذف كل شيء.
البنية
بيئة Azure. موازن الحمل وحده مفتوح للمواقع؛ وSSH وواجهة Kubernetes لا تجيبان إلا عنوان المدير.
خطوة بخطوة
Pull request
terraform fmt وvalidate وtflint وفحص IaC بـ Trivy. ثم تسجّل الـ pipeline الدخول إلى Azure بـ OIDC وتكتب الخطة كتعليق في الـ pull request.
المراجعة
يقرأ شخص الخطة: ما الذي سيُنشأ أو يتغيّر أو يُحذف. لم يتغيّر شيء في Azure بعد.
التطبيق
بعد الدمج ينتظر التطبيق موافقة على البيئة production. ثم يبني Terraform الخطة المُراجَعة بالضبط.
الإعداد
يقوّي Ansible خوادم Ubuntu الثلاثة، ويثبّت k3s مع التشفير وسجل التدقيق، ويضيف مكوّنات المنصة.
كل ليلة
فحص انحراف يشغّل terraform plan. إذا اختلف Azure عن الكود، يفتح issue.
دليل من تشغيل حقيقي
تشغيل على الفرع main بتاريخ 2026-10-27، من GitHub Actions. مدة كل مهمة:
- fmt, validate, tflint, Trivy 23s
- ansible-lint (production profile) 22s
افتح هذا التشغيل (opens in a new tab)
ضوابط الأمان
| الضابط | ماذا يمنع |
|---|---|
| NSG ترفض افتراضيًا + admin_cidrs | فتح SSH وواجهة Kubernetes للإنترنت. |
| لا عنوان عامًا على العقد العاملة | الهجوم المباشر على العقد العاملة. |
| GitHub OIDC | سر سحابي طويل العمر قد يتسرّب من CI. |
| Key Vault + هوية مُدارة | رمز انضمام العنقود في ملفات أو في Git. |
| مراجعة الخطة + الموافقة | حذف مفاجئ في الإنتاج. |
| tflint + فحص IaC بـ Trivy | إعدادات خاطئة أو غير آمنة قبل وصولها إلى Azure. |
| فحص الانحراف الليلي | تغييرات يدوية لا يعرف عنها أحد. |
| تنبيه الميزانية | معمل منسي يكلّف مالًا كل يوم. |
جرّبه بنفسك
az login && make bootstrap # once: state storage + GitHub OIDC app
cp terraform/terraform.tfvars.example terraform/terraform.tfvars # your IP and SSH key
make init plan apply # VNet, NSG, NAT, load balancer, 3 VMs, Key Vault, monitoring
make configure # Ansible: hardening, k3s, platform charts
make kubeconfig && KUBECONFIG=./kubeconfig kubectl get nodes
make destroy # after the demo: everything is goneماذا تعلّمت
- الخطة الواضحة في الـ pull request هي أفضل أداة مراجعة: يقرأ الناس ما سيتغيّر، لا الكود.
- الإعدادات الآمنة مكانها الكود: منافذ الويب تبقى مغلقة حتى تفتحها عن قصد.
- المنصة التي يمكن حذفها وإعادة بنائها في دقائق أرخص وأأمن من منصة تخاف أن تلمسها.