فحص الحاوية في كوبرنيتس مع واجهة برمجة تطبيقات مخصصة

بيان المشكلة

التحدي

تحتاج المؤسسات التي تدير تطبيقات معزولة في Kubernetes غالبًا إلى التقاط والحفاظ على حالة الحاويات التي تعمل من أجل:

  • استعادة الكوارث
  • ترحيل التطبيقات
  • تصحيح الأخطاء/استكشاف الأخطاء
  • الحفاظ على الحالة
  • إعادة إنتاج البيئة

ومع ذلك، لا توجد طريقة مباشرة وأوتوماتيكية لـ:

  1. إنشاء نقاط تحقق للحاويات عند الطلب
  2. تخزين هذه النقاط في تنسيق موحد
  3. جعلها سهلة الوصول عبر الكتل
  4. تفعيل نقاط التحقق من خلال واجهة قياسية

القيود الحالية

  • يتطلب إنشاء نقطة تحقق يدوي الوصول المباشر إلى الكتلة
  • لا يوجد تنسيق تخزين موحد لنقاط التحقق
  • تكامل محدود مع سجلات الحاويات
  • عدم وجود وصول برمجي للأتمتة
  • تنسيق معقد بين containerd وأنظمة التخزين

الحل

خدمة sidecar في Kubernetes تقوم بـ:

  1. كشف وظيفة نقطة التحقق عبر واجهة برمجة التطبيقات REST
  2. تحويل نقاط التحقق تلقائيًا إلى صور متوافقة مع OCI
  3. تخزين الصور في ECR للتوزيع السهل
  4. التكامل مع البنية التحتية الحالية لـ Kubernetes
  5. تقديم واجهة موحدة للأتمتة

هذا يحل المشكلات الأساسية عن طريق:

  • أتمتة عملية نقطة التحقق
  • توحيد تخزين نقاط التحقق
  • جعل نقاط التحقق قابلة للنقل
  • تمكين الوصول البرمجي
  • تبسيط التكامل مع سير العمل الحالي

المستخدمون المستهدفون:

  • فرق DevOps
  • مهندسو المنصات
  • مطورون التطبيقات
  • مهندسو موثوقية المواقع (SREs)

استنادًا إلى Checkpoint/Restore In Userspace (CRIU)، يسمح تسجيل نقاط التحقق الحرفية بإنشاء نسخ تحتوي على حالة لحاوية قيد التشغيل دون أن تعرف الحاوية أنها قيد التسجيل. يمكن تحليل نسخة الحاوية واستعادتها في بيئة معزولة عدة مرات دون أن تكون الحاوية الأصلية على علم بذلك. تم تقديم تسجيل نقاط التحقق الحرفية كميزة ألفا في Kubernetes v1.25.

ستوجهك هذه المقالة حول كيفية نشر كود Golang الذي يمكن استخدامه لأخذ نقطة تحقق لحاوية باستخدام واجهة برمجة التطبيقات (API).

يأخذ الكود معرف البود، ويسترجع معرف الحاوية من containerd كمدخل، ثم يستخدم أمر ctr لتسجيل نقطة تحقق للحاوية المحددة في مساحة أسماء k8s.io الخاصة بـ containerd:

المتطلبات الأساسية

  • عنقود Kubernetes
  • قم بتثبيت أداة سطر الأوامر ctr. إذا كنت قادرًا على تشغيل أوامر ctr على kubelet أو عقدة العامل؛ إذا لم تكن كذلك، قم بتثبيت أو ضبط AMI لتحتوي على ctr.
  • تكوين kubectl للتواصل مع مجموعتك
  • تثبيت Docker محليًا
  • الوصول إلى سجل الحاويات (مثل Docker Hub، ECR)
  • Helm (لاستخدامه في تثبيت تحكم توجيه Nginx Ingress)

الخطوة 0: الكود لإنشاء نقطة فحص الحاوية بواسطة GO

أنشئ ملفًا باسم checkpoint_container.go بالمحتوى التالي:

Go

 

الخطوة 1: تهيئة الوحدة go

Shell

 

قم بتعديل ملف go.mod كالتالي:

Go

 

قم بتشغيل الأمر التالي:

Shell

 

الخطوة 2: بناء ونشر صورة Docker

أنشئ ملفًا Dockerfile في نفس الدليل:

Dockerfile

 

يقوم هذا الملف بفعل الآتي:

  1. استخدام golang:1.20 كمرحلة بناء لتجميع تطبيق Go الخاص بك.
  2. استخدام amazonlinux:2 كصورة أساسية نهائية.
  3. تثبيت AWS CLI، Docker (الذي يتضمن containerd)، و skopeo باستخدام yum و amazon-linux-extras.
  4. نسخ الثنائي Go المجمع من مرحلة البناء.
Shell

 

استبدل <your-docker-repo> بمستودع Docker الفعلي.

الخطوة 3: تطبيق موارد RBAC

أنشئ ملفًا باسم rbac.yaml:

YAML

 

قم بتطبيق موارد RBAC:

Shell

 

الخطوة 4: إنشاء نشر Kubernetes

إنشاء ملف باسم deployment.yaml:

YAML

 

تطبيق النشر:

Shell

 

في deployment.yaml، تحديث ما يلي:

YAML

الخطوة 5: خدمة Kubernetes

إنشاء ملف باسم service.yaml:

YAML

 

تطبيق الخدمة:

Shell

 

الخطوة 6: تثبيت وحدة تحكم Ngnix Ingress

Shell

 

الخطوة 7: إنشاء مورد Ingress

إنشاء ملف باسم ingress.yaml:

YAML

 

تطبيق Ingress:

Shell

 

الخطوة 8: اختبار واجهة برمجة التطبيقات

Shell

 

Shell

 

استبدال <EXTERNAL-IP> بعنوان IP الخارجي الفعلي.

اعتبارات إضافية

  1. الأمان.
    • تطبيق HTTPS عن طريق إعداد شهادات TLS
    • إضافة مصادقة إلى واجهة برمجة التطبيقات
  2. المراقبة. إعداد تسجيل الدخول والمراقبة لواجهة برمجة التطبيقات وعملية التحقق.
  3. إدارة الموارد. تكوين طلبات وقيود الموارد لحاوية sidecar.
  4. معالجة الأخطاء. تنفيذ معالجة أخطاء قوية في تطبيق Go.
  5. الاختبار. اختبار الإعداد بشكل شامل في بيئة غير إنتاجية قبل نشره في الإنتاج.
  6. التوثيق. الحفاظ على توثيق واضح حول كيفية استخدام واجهة برمجة التطبيقات الخاصة بالتحقق.

الخاتمة

تقوم هذه الإعدادات بنشر حاوية نقاط التفتيش كحاوية جانبية في Kubernetes وتعرض وظائفها من خلال واجهة برمجة التطبيقات القابلة للوصول من خارج العنقود. إنها توفر حلاً مرنًا لإدارة نقاط تفتيش الحاويات في بيئة Kubernetes.

محددات AWS/EKS

الخطوة 7: تثبيت وحدة تحكم موازن تحميل AWS

بدلاً من استخدام وحدة تحكم Nginx Ingress، سنستخدم وحدة تحكم موازن تحميل AWS. ستقوم هذه الوحدة بإنشاء وإدارة ALBs لموارد Ingress الخاصة بنا.

1. أضف مستودع مخطط EKS إلى Helm:

Shell

 

2. قم بتثبيت وحدة تحكم موازن تحميل AWS:

Shell

 

استبدل <your-cluster-name> باسم مجموعة EKS الخاصة بك.

ملاحظة: تأكد من أنك قد قمت بإعداد الأذونات اللازمة لـ IAM لوحدة تحكم موازن تحميل AWS. يمكنك العثور على سياسة IAM التفصيلية في وثائق AWS.

الخطوة 8: إنشاء مورد Ingress

قم بإنشاء ملف باسم ingress.yaml:

YAML

 

قم بتطبيق Ingress:

Shell

 

الخطوة 9: اختبار واجهة برمجة التطبيقات

1. احصل على اسم DNS الخاص بـ ALB:

Shell

 

ابحث عن حقل ADDRESS، والذي سيكون اسم DNS الخاص بـ ALB.

2. أرسل طلب اختبار:

Shell

 

استبدل <ALB-DNS-NAME> باسم DNS الفعلي لـ ALB الخاص بك من الخطوة 1.

اعتبارات إضافية لـ AWS ALB

1. مجموعات الأمان. سيتم إنشاء مجموعة أمان تلقائيًا للـ ALB. تأكد من أنه يسمح بحركة المرور الواردة على المنفذ 80 (و 443 إذا كنت قد قمت بإعداد HTTPS).

2. SSL/TLS: لتمكين HTTPS، يمكنك إضافة التعليقات التالية إلى Ingress الخاص بك:

YAML

 

3. سجلات الوصول. قم بتمكين سجلات الوصول لـ ALB الخاص بك عن طريق إضافة ما يلي:

YAML

 

4. تكامل WAF. إذا كنت ترغب في استخدام AWS WAF مع ALB الخاص بك، يمكنك إضافة:

YAML

 

5. المصادقة. يمكنك إعداد المصادقة باستخدام Amazon Cognito أو OIDC عن طريق استخدام التعليقات المناسبة لتحكم Ingress الخاص بك.

سيقوم هذه التغييرات بإعداد Ingress الخاص بك باستخدام AWS Application Load Balancer بدلاً من Nginx. سيقوم تحكم Ingress Controller الخاص بـ ALB بتوفير وتكوين ALB تلقائيًا استنادًا إلى مصدر Ingress الخاص بك.

الختام

تذكر التأكد من أن عنصر تحكم EKS الخاص بك لديه الأذونات اللازمة لإنشاء وإدارة ALBs. عادةً ما ينطوي ذلك على إنشاء سياسة IAM وحساب خدمة بالأذونات المناسبة.

سيتم الآن استخدام هذا الإعداد حلاً للتوازن التلقائي الأصلي من AWS، الذي يتكامل بشكل جيد مع خدمات AWS الأخرى ويمكن أن يكون أكثر كفاءة من حيث التكلفة في بيئة AWS.

Source:
https://dzone.com/articles/container-checkpointing-kubernetes-api