- ClickHouse 24.8 — مخزن تحليلات الأحداث والتقييمات الموثوق (StatefulSet بحجم وحدة تخزين دائمة 100Gi). مطلوب: الخادم يرفض البدء بدونه.
- PostgreSQL 16 — مخزن البيانات العلائقية/البيانات الوصفية للمنظمات ومفاتيح API والمستخدمين لوحات المعلومات والاستعلامات المحفوظة والمصادقة (StatefulSet بحجم وحدة تخزين دائمة 50Gi)
- Redis 7.2 — ذاكرة تخزين مؤقت مشتركة اختيارية وخادم تحديد المعدل؛ يتدهور الخادم ولوحة المعلومات بشكل أنيق إذا كان غير متاح
- خادم AgentEye — واجهة برمجية Rust لالتقاط الأحداث والتحليلات وإدارة المفاتيح (نسختان من البدائل)
- لوحة معلومات AgentEye — واجهة ويب Next.js (نسختان من البدائل)
- مساعد AI (خدمة الوكيل) — مساعد اختياري للقراءة فقط داخل لوحة المعلومات على المنفذ 9100؛ خامل حتى يتم تكوين نقطة نهاية LLM
- Traefik (عام) — وحدة تحكم الإدخال لحركة المجمع، محمية بـ mTLS
- Traefik (لوحة المعلومات) — وحدة تحكم الإدخال للوحة المعلومات، للشبكة الخاصة فقط/قائمة السماح بـ IP
- cert-manager — شهادات TLS و CA خاص mTLS
- وظيفة Backup CronJob — دمج يومي لـ PostgreSQL + ClickHouse في الساعة 03:00 UTC
- مراقب تجديد الشهادات — تنبيهات عند اقتراب انتهاء صلاحية شهادات العميل
المتطلبات الأساسية
قم بتشغيل كل أمر تحقق قبل البدء. يجب أن تمر كل فحص.| المتطلب | الحد الأدنى | أمر التحقق | المتوقع |
|---|---|---|---|
| مجموعة Kubernetes | 1.27+ | kubectl version | Server Version >= v1.27 |
| Kustomize (مدمج في kubectl) | Kustomize v1.14+ (يتم شحنه داخل kubectl 1.27+) | kubectl kustomize --help | يطبع نص الاستخدام |
| Helm | v3 | helm version | Version:"v3.x.x" |
| RBAC مسؤول المجموعة | — | kubectl auth can-i create namespaces | yes |
| فئة التخزين الافتراضية | — | kubectl get storageclass | صف واحد على الأقل محددة (default) |
| دعم LoadBalancer | — | يعتمد على السحابة (EKS و GKE و AKS جميعها تدعم هذا افتراضياً) | — |
| GitHub PAT | — | echo $AGENTEYE_TOKEN | غير فارغ (انظر enterprise-docs/github-token.md) |
| openssl | — | openssl version | OpenSSL 1.x أو 3.x |
| دلو التخزين السحابي | — | لـ PostgreSQL + ClickHouse backups (S3 أو GCS أو Azure Blob) | — |
قم بتشغيل جميع الفحوصات مرة واحدة
شكل النشر
يتم توفير نقطة نهاية الالتقاط على اسم مضيف تتحكم فيه (على سبيل المثالingest.your-company.example). يطلب cert-manager شهادة TLS موثوقة بشكل علني من Let’s Encrypt عبر HTTP-01، لذلك يتحقق المجمعون من شهادة الخادم مقابل مخزن الثقة بالنظام، بدون تثبيت CA لكل عميل.
تعمل نقطة نهاية لوحة المعلومات بنفس الطريقة: يتم توفيرها على اسم مضيف ثانٍ تتحكم فيه (على سبيل المثال agenteye.your-company.example) يشير إلى LoadBalancer Traefik للوحة المعلومات، و cert-manager يصدر شهادة Let’s Encrypt الخاصة به من خلال LoadBalancer هذا. المتصفحات تحصل على شهادة موثوقة بدون تحذير.
يتم التحقق من إصدار واستجابة الشهادة عبر HTTP-01، لذلك يجب أن تكون كلا LoadBalancers قابلة للوصول من الإنترنت العام على المنفذ 80. إذا كنت بحاجة إلى تقييد IP للوحة معلومات LoadBalancer، فقم بتنسيق محلل DNS-01 مع الدعم أولاً - وإلا فإن التجديدات تفشل بصمت وتنتهي صلاحية الشهادة.
احصل على البيانات الوصفية
AGENTEYE_TOKEN الخاص بك.
هيكل المجلد:
مراقبة الصحة (اختيارية): اختبار جاهزية الخادم بالفعل يعكس صحة Postgres + ClickHouse، و third-party/robusta/ يضيف تنبيهات فشل البروانة المحلية بـ Kubernetes القابلة للاختيار إلى Slack. انظر enterprise-docs/health-monitoring.md.
المرحلة 1 - البنية التحتية الخارجية (~30 دقيقة)
1.1 تثبيت cert-manager
يدير cert-manager شهادات TLS لـ HTTPS و CA الخاص المستخدم لشهادات عملاء mTLS.Running — cert-manager و cert-manager-cainjector و cert-manager-webhook.
certificates.cert-manager.io و clusterissuers.cert-manager.io و issuers.cert-manager.io.
إذا فشل: عادة ما تعني البروانات في CrashLoopBackOff عدم تثبيت CRDs. قم بإعادة التشغيل باستخدام --set crds.install=true. إذا فشلت بروانات webhook في جاهزية، انتظر 30 ثانية وتحقق مرة أخرى - قد تستغرق بعض الوقت للبدء.
1.2 تثبيت Traefik - وحدة تحكم الإدخال العامة
تتعامل هذه النسخة من Traefik مع حركة المجمع على LoadBalancer خارجي. يقوم بإنهاء TLS وفرض mTLS (التحقق من شهادة العميل) على نقطة نهاية الالتقاط.Running.
kubectl describe pod -n traefik-public <pod-name> للأخطاء في سحب الصور أو قيود الموارد.
1.3 تثبيت Traefik - وحدة تحكم لوحة المعلومات
تخدم نسخة Traefik هذه لوحة المعلومات على LoadBalancer مخصص، مقيدة بقائمة السماح بـ IP.تشحن آليات قائمة السماح المزدوجة لهذه النسخة. يستخدم هذا الدليلقبل التثبيت، عدّلvalues-dashboard.yaml، والذي يقيد الوصول بحقلservice.loadBalancerSourceRangesالمحمول. يتم توفيرvalues-internal.yamlالموازي أيضاً لبيئات AWS التي تفضل التعليق التوضيحيservice.beta.kubernetes.io/aws-load-balancer-source-rangesبدلاً من ذلك. اختر أحدهما واستخدمه بثبات؛ تفترض الخطوات أدناهvalues-dashboard.yaml.
third-party/traefik/values-dashboard.yaml لتعيين عناوين IP المسموحة بالمصدر. يتحكم حقل loadBalancerSourceRanges في عناوين IP التي يمكنها الوصول إلى لوحة المعلومات. بشكل افتراضي، يتم تعيينه على 0.0.0.0/0 (جميع عناوين IP)؛ قيده بـ VPN أو مكتب أو معروف عنوان IP للخروج.
قائمة السماح بعنوان IP واحد
قائمة السماح بعناوين IP متعددة
أضف إدخالاً واحداً لكل عنوان IP أو كتلة CIDR. لاحقة/32 تطابق عنوان IPv4 واحد؛ كتلة CIDR (على سبيل المثال /24) تطابق نطاقاً. يمكنك خلط عناوين IP الفردية والنطاقات بحرية:
- احفظ إدخالاً واحداً لكل سطر وأضف تعليقاً موجزاً
#يحدد مالك أو غرض كل عنوان IP؛ هذا ما يستخدمه المشغلون في المستقبل لتحديد ما إذا كان الإدخال لا يزال مطلوباً. - استخدم دائماً تدوين CIDR. عنوان IP عام مثل
203.0.113.10يتم رفضه من قبل موفر السحابة؛ استخدم203.0.113.10/32. - بالنسبة إلى نطاقات IPv6، استخدم
/128المكافئ (عنوان واحد) أو CIDR أكبر، على سبيل المثال2001:db8::1/128. لا تدعم جميع موفري السحابة نطاقات مصدر IPv6؛ تحقق من وثائق LoadBalancer لموفرك. - القائمة هي OR: يُسمح بالحركة إذا كان المصدر يطابق أي إدخال.
helm install أدناه. إذا كانت وحدة التحكم مثبتة بالفعل، فقم بتشغيل helm upgrade بنفس العلامات، أو أصلح الخدمة في وقت التشغيل (القسم التالي).
تحديث قائمة السماح في وقت التشغيل
يمكنك تغيير عناوين IP المسموحة بدون ترقية Helm بإصلاح الخدمة مباشرة. يستبدل الإصلاح القائمة بأكملها؛ قم دائماً بتضمين كل عنوان IP تريد الاحتفاظ به، وليس الآخر الجديد. لاستبدال القائمة بمجموعة جديدة من عناوين IP:
لا يتم الاحتفاظ بالإصلاحات في وقت التشغيل مرة أخرى إلى values-dashboard.yaml. للاحتفاظ بالتغيير عبر ترقيات Helm المستقبلية، قم أيضاً بتحديث ملف القيم والالتزام به.
ثم ثبت:
Running.
1.4 انتظر LoadBalancers
تحتاج كلا نسختا Traefik إلى عناوين IP خارجية قبل المتابعة.EXTERNAL-IP (وليس <pending>).
إذا كانت لا تزال قيد الانتظار، راقب التخصيص:
Ctrl+C بمجرد ظهور عنوان IP. عادة ما يستغرق تخصيص عنوان IP 2-5 دقائق.
إذا فشل: عادة ما يعني <pending> بعد 10 دقائق أن موفر السحابة لا يستطيع توفير LoadBalancer. تحقق من: علامات الشبكة الفرعية (EKS يتطلب kubernetes.io/role/elb)، تكوين VPC، حصص الخدمة، وأن التعليق التوضيحي LB الداخلي الصحيح مضبوط للنسخة الداخلية.
المرحلة 2 - إنشاء الأسرار (~10 دقائق)
يتم إنشاء جميع الأسرار يدويا قبل نشر التطبيق. هذا يضمن عدم ظهور القيم الحساسة في ملفات البيان.2.1 إنشاء مساحة الأسماء
Active.
2.2 سر سحب الصور
يقوم هذا السر بالمصادقة علىghcr.io لسحب صور حاوية AgentEye. انظر enterprise-docs/github-token.md لكيفية إنشاء PAT الخاص بك.
kubernetes.io/dockerconfigjson.
اختبره (عميق) - تحقق من أن الرمز يمكنه فعلاً سحب الصور:
استخدم علامة صورة server المثبتة في تراكب kustomization.yaml الخاص بك (حالياً v0.0.1-beta.48 في كل من تراكب acme المجمع والنشر الأساسي). استبدل العلامة أدناه بالعلامة التي تنشرها حتى لا ينجرف هذا الفحص عبر الإصدارات:
ok مطبوع في السجلات.
إذا فشل: ErrImagePull أو 401 Unauthorized يعني أن PAT غير صحيح أو يفتقد النطاق read:packages. أعد التحقق من enterprise-docs/github-token.md.
2.3 بيانات اعتماد PostgreSQL
مهم: نستخدم-hex(وليس-base64) لإنشاء كلمة المرور. يمكن لمخرجات Base64 أن تحتوي على+و/و=التي تقسم سلسلة الاتصالDATABASE_URL. انظر enterprise-docs/troubleshooting.md للتفاصيل.
قم بتخزين POSTGRES_PASSWORD في مدير الأسرار الخاص بك فوراً. ستحتاجه إذا كنت بحاجة إلى الاستعادة من نسخة احتياطية أو الاتصال بقاعدة البيانات مباشرة.
اختبره:
48 (24 بايت سادس عشر = 48 حرفاً).
2.4 مفتاح API للإدارة
قم بتخزين ADMIN_KEY في مدير الأسرار الخاص بك فوراً.
اختبره:
2.5 تكوين المصادقة (تسجيل الدخول إلى لوحة المعلومات)
تستخدم لوحة المعلومات البريد الإلكتروني + OTP لتسجيل دخول المستخدم. بدون هذا السر، يبدأ الخادم بشكل طبيعي ويستمر مسارADMIN_KEY API في العمل، لكن لا يمكن لأي مستخدم تسجيل الدخول عبر الواجهة.
تتم الإشارة إلى جميع المفاتيح كـ optional: true في البيان الأساسي، لذا فإن الأسرار الجزئية (أو عدم وجود سر على الإطلاق) جيدة؛ يعود الخادم إلى الافتراضيات الموثقة. جمع كل شيء في سر واحد agenteye-auth يجعل سطح المصادقة قابلاً للدوران في مكان واحد.
| المفتاح | الغرض |
|---|---|
ADMIN_EMAIL | مستخدم إدارة التمهيد. يتم تحديثه أو إدراجه في كل بدء مع جميع الأذونات وحمايته من الحذف/تعديلات الأذونات عبر لوحة المعلومات. بدونه، لا يتم بذر أي مسؤول ويكون أول تسجيل دخول مستحيلاً. |
ALLOWED_EMAILS | قائمة السماح المفصول بينها بفواصل. يدعم عناوين دقيقة (user@example.com) وأحرف دومين بدل (*@example.com). بدونها، لا يمكن لأي مستخدم تسجيل الدخول أو إنشاؤه. |
SMTP_HOST, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD, SMTP_FROM | مرحل SMTP لإرسال رموز OTP. إذا لم تكن SMTP_HOST مضبوطة، يتم تسجيل رموز OTP في stdout الخادم بدلاً من إرسالها بالبريد الإلكتروني (مفيد لاختبارات التحقق الأولى). قدم جميع مفاتيح SMTP معاً لتسليم البريد الإلكتروني الفعلي. |
SMTP_TLS | أحد starttls (الافتراضي) أو tls أو none. |
DEFAULT_ORG_NAME, DEFAULT_ORG_SLUG | اختياري. أعط للمنظمة المدمجة default اسم عرض ودية وشريحة عنوان URL بحيث تعيش على سبيل المثال في /acme بدلاً من /default. يتم تطبيقها فقط عند البدء الأول؛ بمجرد إعادة تسمية المنظمة باستخدام agenteye-orgctl org rename (انظر §7.6) يتم تجاهلها. يجب أن تكون الشريحة 1-40 أحرفاً صغيرة وأرقام مع شرطات داخلية واحدة. اتركهما دون تعيين للاحتفاظ بـ default عام. |
قم بتخزين بيانات اعتماد SMTP في مدير الأسرار الخاص بك.اختبره:
2.6 مفتاح عزل المنظمة متعددة المستأجرين (اختياري)
تخطي هذا للنشر بمستأجر واحد؛ يعمل الخادم على بناء مدمج dev افتراضي ويخدم المنظمة الواحدةdefault بشكل جيد. قبل إنشاء منظمة ثانية، قم بتعيين ORG_CH_SECRET قوي واستقر: كلمة مرور ClickHouse لكل منظمة مشتقة كـ HMAC(ORG_CH_SECRET, org_id)، لذا فإن الافتراضي المدمج المعروف بالعام سيؤدي إلى بيانات اعتماد محتملة معروفة لكل منظمة. يرفض أمر agenteye-orgctl org create (انظر §7.6 توفير المنظمات) التشغيل بينما الخادم لا يزال في الافتراضي dev المدمج.
secretKeyRef اختياري، لذا فإن مجموعة بمستأجر واحد لا تنشئها أبداً بدء الأمر بشكل طبيعي. حافظ على القيمة مستقرة ومطابقة عبر جميع البدائل؛ تدويرها يلغي كلمة مرور ClickHouse المشتقة من كل منظمة حتى يعيد التوفيق في وقت البدء تزويد المستخدمين (إعادة تشغيل متدرجة مع القيمة المتسقة في كل مكان يشفيها). انظر deploy/base/server/secret.example.yaml.
قم بتخزين ORG_CH_SECRET في مدير الأسرار الخاص بك ولا تقوم بتدويره بشكل عرضي.
2.7 التحقق من جميع الأسرار
agenteye-admin-key و agenteye-auth و agenteye-image-pull و agenteye-postgres) موجودة قبل المتابعة. agenteye-org-ch-secret مطلوب فقط لنشرات متعددة المستأجرين (انظر §2.6).
المرحلة 3 - نشر التطبيق (~5 دقائق)
3.1 تكوين اسم المضيف العام
يحتاج cert-manager إلى اسم المضيف للالتقاط ولوحة المعلومات قبل أن يتمكن من طلب شهادات Let’s Encrypt الخاصة به. انسخ القالب وعيّن كلاهما:domain.env يتم تجاهله من قبل git؛ يبقى محلياً لكل نشر. بناء kustomize يفشل بصراحة إذا كان أي مفتاح مفقوداً.
يجب أن ينحل DNS أولاً. لا تضطر إلى الإشارة بـ DNS إلى LoadBalancers حتى الآن (فهي غير موجودة حتى تكتمل المرحلة 1.2)، لكن إصدار ACME في الخطوة 3.2 سيحاول مجدداً حتى يحل كل اسم مضيف إلى LoadBalancer الخاص به. يمكنك إما تعيين DNS الآن (باستخدام أسماء مضيف LoadBalancer المجمعة في المرحلة 1.4) أو المتابعة وإضافة السجلات في المرحلة 4.
3.2 تطبيق البيانات الوصفية
قم بتطبيق القاعدة مباشرة لتثبيت جديد، أو تراكب إذا قمت بقطع واحد لهذه البيئة (التراكبات فقط دبابيس علامات الصور و env vars وحدود الموارد؛ يرثون شهادات القاعدة والتوجيه):3.3 انتظر البروانات
agent (مساعد AI) و redis الاختيارية جنباً إلى جنب معهم؛ المساعد يبقى خاملاً حتى توفر نقطة نهاية LLM الخاصة به (انظر enterprise-docs/assistant.md)، و Redis هو ذاكرة تخزين مؤقت أفضل جهد، لذا لا يحتاج أي منهما إلى أن يكون جاهزاً للخدمة لخدمة البلاتفورم حركة.
اختبره:
agent و redis الاختيارية تظهر أيضاً وتصل إلى Running):
| حالة البروانة | السبب المحتمل | أمر التصحيح |
|---|---|---|
ImagePullBackOff | سر سحب صورة سيء أو PAT | kubectl describe pod <name> -n agenteye |
CrashLoopBackOff | متغيرات البيئة السيئة (على سبيل المثال DATABASE_URL) | kubectl logs <name> -n agenteye |
Pending | وحدة المعالجة المركزية / الذاكرة غير كافية أو بدون عقد | kubectl describe pod <name> -n agenteye (تحقق من الأحداث) |
3.4 التحقق من التخزين
Bound:
| PVC | السعة | ظهره |
|---|---|---|
postgres-data-postgres-0 | 50Gi | مخزن البيانات العلائقية / البيانات الوصفية PostgreSQL |
clickhouse-data-clickhouse-0 | 100Gi | مخزن تحليلات أحداث ClickHouse + التقييمات |
redis-data-redis-0 (1Gi) لذاكرة التخزين المؤقت الاختيارية.
إذا فشل: Pending يعني أن فئة التخزين لا يمكنها توفير الحجم. تحقق من kubectl get storageclass وتأكد من وجود افتراضي. للإنتاج، ضع حجم ClickHouse على فئة تخزين SSD سريعة (على سبيل المثال gp3 على AWS أو pd-ssd على GCP)؛ يعاني معدل النقابة من الأقراص البطيئة.
3.5 التحقق من الشهادات
Ready: True:
| الاسم | المُصدر | الغرض |
|---|---|---|
mtls-ca | selfsigned | CA خاص لإصدار شهادات عملاء mTLS (صحة 10 سنوات) |
ingest-tls | letsencrypt-prod | شهادة TLS عام لنقطة نهاية الالتقاط (90 يوماً، تجديد تلقائي) |
dashboard-tls | letsencrypt-prod | شهادة TLS عام لوحة المعلومات (90 يوماً، تجديد تلقائي) |
ingest-tls أو dashboard-tls جاهزة:
kubectl describe certificate <name> -n agenteye واقرأ الأحداث. الأسباب الشائعة:
- DNS لم تشير بعد إلى LB. يحل Let’s Encrypt اسم المضيف ويضرب المنفذ 80 للتحقق -
INGEST_DOMAINيجب أن يحل إلى LoadBalancer العام وDASHBOARD_DOMAINإلى LoadBalancer لوحة المعلومات. حتى ينتشر CNAME / Alias، تبقى الطلب معلقة. بمجرد أن يكون DNS صحيحاً، يحاول cert-manager مجدداً تلقائياً (لا حاجة لحذف الشهادة). - اسم المضيف لم يتم استبداله. إذا كانت
dnsNamesتقرأ بعدINGEST_DOMAIN_PLACEHOLDER/DASHBOARD_DOMAIN_PLACEHOLDER، فقد تخطيت الخطوة 3.1 - أنشئbase/certificates/domain.envوأعد التطبيق. - Traefik لوحة المعلومات لا يمكنه خدمة التحدي (
dashboard-tlsفقط). يجب تثبيت نسخة Traefik من لوحة المعلومات مع ملف القيم المجمع (المرحلة 1.3)، والذي يمكن موفر الإدخال المحدود الذي يخدم حلال HTTP-01 من cert-manager. نسخة مثبتة بدونها تترك التحدي غير قابل للتوجيه والطلب معلق للأبد.
mtls-ca جاهزة: cert-manager نفسه غير صحي. أعد التحقق من بروانات cert-manager من الخطوة 1.1.
3.6 التحقق من CronJobs
| الاسم | الجدول الزمني | الغرض |
|---|---|---|
agenteye-backup | 0 3 * * * | النسخ الاحتياطية اليومية Postgres + ClickHouse في 03:00 UTC |
cert-renewal-check | 0 3,15 * * * | تنبيهات انتهاء صلاحية الشهادة في 03:00 و 15:00 UTC |
3.7 تحقق من بدء الخادم بشكل صحيح
POSTGRES_PASSWORD يحتوي على أحرف غير آمنة للعنوان الذي ينقسم DATABASE_URL. انظر enterprise-docs/troubleshooting.md.
3.8 تحقق من لوحة المعلومات المتصلة بالخادم
Ready في الإخراج بدون أخطاء ECONNREFUSED أو ما شابه.
إذا فشل: تحقق من أن خدمة server موجودة (kubectl get svc server -n agenteye) وأن AGENTEYE_SERVER_URL مضبوطة على http://server:8080 في نشر لوحة المعلومات.
المرحلة 4 - الوصول إلى الشبكة (~5 دقائق)
4.1 استرجع عناوين LoadBalancer
على AWS EKS، تُرجع LoadBalancers اسم مضيف بدلاً من عنوان IP. استبدلاختبره:.ipبـ.hostnameفي الأوامر أعلاه.
4.2 أشر DNS إلى LoadBalancers
أنشئ سجلات DNS بحيث تحل أسماء المضيفات منbase/certificates/domain.env إلى LoadBalancers الخاصة بهم - INGEST_DOMAIN إلى LoadBalancer Traefik العام، DASHBOARD_DOMAIN إلى LoadBalancer Traefik لوحة المعلومات:
- AWS Route 53: سجل
AمعAlias = Yes، الهدف = اسم مضيف LoadBalancer. لا تستخدم A → IP عادي؛ عناوين ELB IP تدور. - أي موفر آخر:
CNAMEمن اسم المضيف إلى اسم مضيف LoadBalancer.
$PUBLIC_IP و $INTERNAL_IP على التوالي (أو، على EKS، حل نفس أسماء مضيفات *.elb.amazonaws.com).
بمجرد حل DNS، ينهي cert-manager طلبات ACME المعلقة من المرحلة 3.5 في غضون دقيقة. أعد تشغيل kubectl get certificates -n agenteye حتى تظهر كلا ingest-tls و dashboard-tls Ready: True.
4.3 الوصول إلى نقطة نهاية الالتقاط
تفرض نقطة نهاية الالتقاط العام TLS متبادل، لذا يجب أن يقدم كل طلب (بما في ذلك/health) شهادة عميل. تصدر شهادة عميل أولى في المرحلة 5؛ إذا كان لديك واحدة بالفعل، تحقق من قابلية الوصول الآن:
{"status":"ok"}. لا يلزم -k - شهادة الخادم تربط إلى CA عام لـ INGEST_DOMAIN، لذا فهي صحيحة مقابل مخزن الثقة بالنظام. الوصول إلى نقطة نهاية الالتقاط برمز INGEST_DOMAIN (الذي يطابق الشهادة الصادرة)، وليس برمز LoadBalancer الخام IP / اسم المضيف.
يتم توفير نقطة نهاية لوحة المعلومات على DASHBOARD_DOMAIN مع شهادة عام موثوق بها وليست خلف mTLS، لذا لا يلزم -k ولا شهادة عميل:
DASHBOARD_DOMAIN، لذا فإن العنوان الخام يوضح عدم تطابق اسم الشهادة.
إذا فشل: إذا كان curl معلقاً، تحقق من أن LoadBalancer قابل للوصول من جهازك (VPN وعناصر الأمان وقواعد الجدار). يعني خطأ مصادقة certificate required على اسم المضيف الالتقاط عدم تقديم شهادة عميل؛ أكمل المرحلة 5 أولاً. يعني خطأ التحقق من TLS على اسم المضيف الالتقاط أن شهادة الخادم لم تنته من الإصدار حتى الآن؛ عد إلى المرحلة 3.5 وحل المشكلة هناك.
المرحلة 5 - إصدار شهادات عملاء mTLS (~10 دقائق لكل مجموعة)
يتحقق المجمعون مع عاملين: شهادة عميل (طبقة النقل، يثبت أن الطلب يأتي من مجموعة مصرح بها) ومفتاح API (طبقة التطبيق، يثبت أن الطلب من مجمع لديه إذنevents:add). مفتاح مسرب غير مفيد بدون الشهادة؛ شهادة مسروقة غير مفيدة بدون مفتاح صحيح.
5.1 إصدار شهادة
تحتاج كل مجموعة تشغل مجمعات إلى شهادة عميل خاصة بها. من دليل البيانات الوصفية:<cluster-name> بمعرّف ذي مغزى (على سبيل المثال us-east-1-prod أو staging).
اختبره: يطبع الكتاب النصي ==> Done! ويسرد ملفات الإخراج.
Ready: True.
ملفات الإخراج في issued/<cluster-name>/:
| الملف | الغرض |
|---|---|
client.crt | شهادة العميل (صحة 90 يوماً) |
client.key | مفتاح خاص العميل |
ca.crt | شهادة CA للتحقق من الخادم |
collector-mtls-secret.yaml | سر Kubernetes جاهز للتطبيق لمجموعة المجمع |
5.1b توصيل بديل: AWS Secrets Manager
إذا كان المستهلك للشهادة Kubernetes Pod الذي يحتاجclient.crt و client.key على القرص - الحالة النموذجية عند تشغيل agenteye-collector كـ sidecar في pod التطبيق الخاص بك - ادفع مجموعة الشهادات إلى AWS Secrets Manager. ثم يمكن لـ pod التطبيق تثبيته عبر Secrets Store CSI Driver مع IRSA، وتجديد الشهادة بالكامل بدون أيدي.
PutSecretValue على نفس السر، لذا يبقى ARN والاسم مستقراً. يختار CSI Driver النسخة الجديدة في استطلاع دورانها التالي ويعيد كتابة الملفات داخل الـ pod.
المتطلبات الأساسية:
awsCLI v2 موثق في حسابك AWS.jqمثبت.- مجموعة متغير البيئة
AWS_REGION. - أذونات IAM على هوية المتصل (نطاق
Resourceإلىarn:aws:secretsmanager:<region>:<account>:secret:agenteye/mtls-client/*):secretsmanager:CreateSecretsecretsmanager:DescribeSecretsecretsmanager:PutSecretValuesecretsmanager:TagResource
| الخطوة | الإجراء |
|---|---|
| 1 | يصدر / يعيد استخراج الشهادة عبر cert-manager (نفس الوضع الافتراضي). |
| 2 | استدعاء DescribeSecret على agenteye/mtls-client/<cluster-name> لقرار الإنشاء مقابل التحديث. |
| 3 | عند أول تشغيل: CreateSecret بحمول JSON بثلاثة مفاتيح (client.crt و client.key و ca.crt)، وسم AgentEyeCluster=<cluster-name>. عند عمليات تشغيل لاحقة: PutSecretValue لنشر نسخة جديدة؛ الوسم محدث عبر TagResource. |
| 4 | حذف issued/<cluster-name>/ فقط بعد تحميل ناجح. عند أي فشل، يتم الاحتفاظ بالمجلد حتى تحاول مجدداً. |
aws secretsmanager restore-secret --secret-id agenteye/mtls-client/<cluster-name> قبل إعادة المحاولة.
للأسلاك الـ pod الكاملة (SecretProviderClass و IRSA و سلوك الدوران و استكشاف الأخطاء) انظر enterprise-docs/single-pod-deployment.md.
5.2 تحقق من عمل الشهادة
اختبر الشهادة الصادرة ضد ingress mTLS:{"status":"ok"}
إذا فشل:
| خطأ | السبب | الإصلاح |
|---|---|---|
certificate required | لا يتم تقديم الشهادة | تحقق من مسارات الملفات في أم |

