إضافة OAuth2 إلى دفاتر ملاحظات Jupyter على Kubernetes

Built for Speed: ~10ms Latency, Even Under Load
Blazingly fast way to build, track and deploy your models!
- Handles 350+ RPS on just 1 vCPU — no tuning needed
- Production-ready with full enterprise support
TrueFoundry يمكن للمستخدمين نشر دفاتر Jupyter على حساباتهم السحابية الشخصية، مثل AWS أو Azure أو GCP. تتيح لهم هذه الميزة إجراء تجارب التعلم الآلي ومهام التدريب على أجهزتهم الخاصة بسهولة. في البداية، كانت دفاتر الملاحظات المنشورة عبر TrueFoundry مؤمنة باستخدام مجموعة اسم مستخدم وكلمة مرور. ومع ذلك، استجابةً لطلبات العملاء المتزايدة، قمنا بدمج تسجيل الدخول الموحد (Single Sign-On). هذا يعني أنه يمكن للمستخدمين الآن الوصول بسهولة إلى دفاتر الملاحظات الخاصة بهم بنفس بيانات الاعتماد التي يستخدمونها لـ TrueFoundry. تتعمق هذه المدونة في تفاصيل كيفية تنفيذنا لهذه الميزة.

دفاتر الملاحظات على TrueFoundry
تستخدم TrueFoundry داخليًا نسخة معدلة من Kubeflow Notebook Controller لتنسيق نشر دفاتر الملاحظات. يوفر المتحكم ميزات متنوعة نستفيد منها، مثل:
- مواصفات دفتر الملاحظات المبسطة: واجهات برمجة تطبيقات Kubeflow Notebook بسيطة ويقوم المتحكم بتنسيق إنشاء عمليات نشر دفاتر Jupyter.
- الإيقاف التلقائي: يقوم المتحكم بإيقاف دفتر الملاحظات تلقائيًا بعد فترة معينة من عدم النشاط. هذا مفيد للغاية لعملائنا الذين يجرون تجارب على دفاتر ملاحظات مدعومة بأجهزة GPU.
- دليل الصفحة الرئيسية الدائم: يتولى المتحكم مهمة إنشاء وحدة تخزين دائمة تحفظ تقدم المستخدم على دفتر الملاحظات عبر الجلسات.
- صور أساسية قابلة للتوسيع: يدعم المتحكم مجموعة من صور دفاتر الملاحظات الأساسية لـ Jupyter Notebook و VS Code التي تحتفظ بها TrueFoundry. يمكن للمستخدم توسيع الميزات على صور Docker هذه عن طريق إضافة نص برمجي للتشغيل أو تثبيت مكتبات محددة.
للمعلومة، إليك كيف يبدو كائن Kubeflow Notebook بسيط:
apiVersion: kubeflow.org/v1
kind: Notebook
metadata:
name: my-notebook
spec:
template:
spec:
containers:
- name: my-notebook
image: kubeflownotebookswg/jupyter:master
args:
[
"start.sh",
"lab",
"--LabApp.token=''",
"--LabApp.allow_remote_access='True'",
"--LabApp.allow_root='True'",
"--LabApp.ip='*'",
"--LabApp.base_url=/test/my-notebook/",
"--port=8888",
"--no-browser",
]
المصادقة الأساسية لدفاتر الملاحظات
قبل تطبيق OAuth2، قدمت TrueFoundry للمستخدمين خيار تعزيز أمان دفاتر الملاحظات العامة الخاصة بهم من خلال دمج المصادقة الأساسية. كانت طبقة الأمان الإضافية هذه حاسمة لضمان أن الأفراد المصرح لهم فقط يمكنهم الوصول إلى المحتوى الحساس لهذه الدفاتر. لتنفيذ هذه الميزة، استخدمت TrueFoundry إمكانيات مكونات WebAssembly (Wasm) الإضافية ضمن وكيل Istio، وتحديداً الـ وكيل Envoy.
Istio، وهي شبكة خدمات مفتوحة المصدر، توفر إطار عمل لإدارة اتصالات الشبكة بين أعباء عمل الخدمة المختلفة. بفضل Istio، تمكنت TrueFoundry من حقن منطق مخصص مباشرة في طبقة الشبكة، والتي تتم إدارتها بواسطة وكيل Envoy. سمح هذا النهج بالتحكم الفعال والأمان لحركة المرور المتدفقة من وإلى دفاتر Jupyter الخاصة بهم. كان المفتاح لتطبيق المصادقة الأساسية هو WasmPlugin، وهي ميزة من ميزات Istio تسهل نشر وحدات WebAssembly داخل وكيل Envoy.
يتم دمج WasmPlugin للمصادقة الأساسية هذا في سلسلة من مرشحات الشبكة داخل وكيل Envoy. تمكن هذه المرشحات من تنفيذ وظائف ذات مستوى أعلى تتعلق بالتحكم في الوصول، والتحويل، وإثراء البيانات، والتدقيق، والمزيد، مما يعزز الأمان والوظائف العامة لشبكة الخدمات. إليك نسخة مبسطة من المواصفات لإضافة مرشح المصادقة الأساسية إلى سلسلة مرشحات Envoy:
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
name: basic-auth
namespace: istio-ingress
spec:
phase: AUTHN
pluginConfig:
basic_auth_rules:
- credentials:
- user:pass
hosts: www.example.com
prefix: /secret/
selector:
matchLabels:
istio: ingressgateway
url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
OAuth2 لدفتر الملاحظات
لتطبيق OAuth2 في دفاتر الملاحظات الخاصة بنا، استخدمنا مرشح Envoy، لكن النهج اختلف عن المصادقة الأساسية. على عكس المصادقة الأساسية حيث كان بإمكاننا إدراج WasmPlugin جاهز بسهولة في سلسلة المرشحات، تطلب OAuth2 حلاً أكثر تخصيصًا. لتحقيق ذلك، استخدمنا مرشح HTTP مصممًا خصيصًا لـ OAuth. في TrueFoundry، يتكامل نظام الدخول الموحد (SSO) الخاص بنا مع FusionAuth، ليعمل كمزود OAuth الخاص بنا.
إليك كيف تبدو مواصفات مرشح Envoy – ارجع إلى التعليقات في الملف لمزيد من التفاصيل:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: truefoundry-notebook-tfy-oauth2 # اسم مرشح Envoy
namespace: auth-test # مساحة الاسم التي يتم فيها نشر مرشح Envoy
spec:
workloadSelector:
labels:
truefoundry.com/application: truefoundry-notebook # محدد يستهدف أعباء العمل ذات التسميات المحددة
configPatches:
- applyTo: CLUSTER
match:
context: SIDECAR_OUTBOUND
patch:
العملية: إضافة
القيمة:
الاسم: tfy-oauth2 # اسم المجموعة لخدمة مصادقة OAuth2
النوع: LOGICAL_DNS # نوع اكتشاف الخدمة (DNS)
مهلة_الاتصال: 5s # مهلة لإنشاء اتصال
سياسة_موازنة_التحميل: ROUND_ROBIN # سياسة موازنة التحميل
# إعدادات أخرى لموازنة التحميل
- يُطبق_على: HTTP_FILTER
مطابقة:
السياق: SIDECAR_INBOUND
المستمع:
سلسلة_المرشحات:
المرشح:
الاسم: "envoy.filters.network.http_connection_manager"
المرشح_الفرعي:
الاسم: envoy.filters.http.jwt_authn
تعديل:
العملية: إدراج_قبل # إدراج هذا المرشح قبل مرشح مصادقة JWT
القيمة:
الاسم: envoy.filters.http.tfy-oauth # اسم مرشح OAuth
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
تكوين:
use_refresh_token: false # ما إذا كان سيتم استخدام رمز تحديث
pass_through_matcher:
- name: Authorization
present_match: true # مرر إذا كان رأس التفويض موجودًا
forward_bearer_token: true # إعادة توجيه رمز الحامل إلى المصدر
auth_type: BASIC_AUTH # نوع المصادقة المستخدم
token_endpoint:
cluster: tfy-oauth2 # المجموعة لنقطة نهاية الرمز
uri: <token-endpoint-uri-of-oauth-provider>
timeout: 5s # مهلة لنقطة نهاية الرمز
authorization_endpoint: <authorization-endpoint-uri-of-oauth-provider>
redirect_uri: https://%REQ(:authority)%/truefoundry-notebook/_auth/callback # عنوان URI لإعادة التوجيه للاستدعاء العكسي
redirect_path_matcher:
path:
exact: /truefoundry-notebook/_auth/callback # المسار لعنوان URI لإعادة التوجيه
signout_path:
path:
exact: /truefoundry-notebook/_auth/signout # مسار تسجيل الخروج
credentials:
client_id: <client-id-for-oauth>
token_secret:
# إعدادات لجلب سر الرمز المميز
# اقرأ المزيد حول كيفية جلب الأسرار هنا:
# https://www.envoyproxy.io/docs/envoy/latest/configuration/security/secret
hmac_secret:
# إعدادات لجلب hmac
عندما يحاول المستخدم الوصول إلى خدمة محمية بواسطة مرشح OAuth2 للمرة الأولى، يتم إعادة توجيهه إلى authorization_endpoint. نقطة النهاية هذه هي عنوان URL لموفر OAuth الخارجي الخاص بنا، والذي، في تطبيقنا، هو نافذة تسجيل الدخول TrueFoundry المستندة إلى FusionAuth. تعد عملية إعادة التوجيه هذه خطوة حاسمة في عملية OAuth، حيث توجه المستخدمين إلى موقع آمن يمكنهم من خلاله المصادقة ومن ثم منح الأذونات اللازمة للوصول إلى الخدمة.
بمجرد اكتمال تسجيل الدخول، سيقوم FusionAuth بإعادة توجيهك إلى redirect_uri (المكون في مواصفات المرشح)، مضيفًا رمز تفويض سري ومؤقت هناك. يتم اعتراض هذا الطلب بواسطة المرشح ويقوم بإجراء طلب إلى token_endpoint، مبادلاً الرمز برمز JWT مميز. أخيرًا، يقوم المرشح بتعيين ملفات تعريف الارتباط (cookies) باستخدام رمز JWT المميز.
يتم تمرير عمليات الوصول اللاحقة إلى الخدمة عبر مرشح HTTP نظرًا لأن ملف تعريف الارتباط (cookie) يقوم بتعيين Authorization كرأس (header) بقيمة JWT. تم تكوين المرشح لتمرير مثل هذه الطلبات (راجع pass_through_matcher في المواصفات). للتحقق من أن JWT هو رمز مميز صالح، نقوم بإنشاء سياسة RequestAuthentication التي ستتحقق مع موفر OAuth:
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
# ...
spec:
selector:
# ...
jwtRules:
- issuer: "truefoundry.com"
fromHeaders:
- name: Authorization
prefix: "Bearer "
audiences:
- <client-id>
jwksUri: <oauth-provider-jwks-uri>
forwardOriginalToken: true
أخيرًا، نضيف سياسة التفويض التي تحدد الطلبات التي سيتم تطبيقها RequestAuthentication نريد تطبيق التفويض على جميع الطلبات على المنفذ 8888:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: best-notebook-tfy-oauth2
namespace: auth-test
spec:
selector:
matchLabels:
truefoundry.com/application: best-notebook
action: DENY
rules:
- from:
- source:
notRequestPrincipals: ["*"]
to:
- operation:
ports:
- "8888"
TrueFoundry AI Gateway delivers ~3–4 ms latency, handles 350+ RPS on 1 vCPU, scales horizontally with ease, and is production-ready, while LiteLLM suffers from high latency, struggles beyond moderate RPS, lacks built-in scaling, and is best for light or prototype workloads.
The fastest way to build, govern and scale your AI






















.png)
.webp)










.webp)






