تخطَّ إلى المحتوى
نسخة تجريبية

Kubernetes

يشغّل سحابتي مجموعات Kubernetes مُدارة داخل الشبكة الخاصة لمساحة عملك. نحن نشغّل مستوى التحكم والأجهزة الافتراضية التي تعمل عليها عُقدك العاملة ونراقبها، ونستبدل العقدة العاملة التي تتوقف عن العمل؛ وأنت تحصل على ملف kubeconfig وتستخدم kubectl أو Helm أو أي أداة تعرفها.

كل عقدة آلة افتراضية داخل شبكتك، فتصل حاوياتك إلى قواعد بياناتك ومواردك الأخرى عبر الشبكة الخاصة، ولا يُتاح شيء في المجموعة للعالم إلا حين تتيحه أنت.

ما نديره عنك اليوم

  • مستوى التحكم. نشغّله ونفحصه كل دقيقة، ونتلقّى تنبيهًا حين يتوقّف عن الاستجابة.
  • العُقد العاملة. نراقب كل عقدة عاملة ونستبدل التي تتوقف عن العمل، مع الاستثناءات المذكورة في حين تتوقف عقدة عاملة عن العمل. وتُستبدل كذلك العقدة التي تفشل في الإقلاع أو في الانضمام أثناء إنشاء المجموعة أو تغيير حجمها، والعقدة التي تزيلها تُفرَّغ أولًا.
  • متحكّم المنصّة داخل مجموعتك، الذي يربطها بوحدات التخزين وموزّعات الحمل والوصول، نحدّثه نحن، وأي تحديث له يفشل يُتراجَع عنه.

ما يأتي لاحقًا

  • ترقية إصدار Kubernetes، ونشر صور عُقد جديدة على العُقد العاملة القائمة. وإلى ذلك الحين تبقى المجموعة على إصدار Kubernetes الذي أُنشئت به، وتحتفظ كل عقدة عاملة بصورة العقدة التي بدأت بها.

ما الذي تحصل عليه

  • Kubernetes ‏1.36.
  • مستوى تحكم مُدار بالكامل: نشغّله ونراقبه نحن، ولا يُعرض لك، لا بين عُقد المجموعة ولا في رسوم لوحة التحكم. ومع التوافر العالي يعمل منسوخًا على مضيفات منفصلة، فتبقى واجهة المجموعة تجيب حتى لو تعطّل أحد المضيفات.
  • عُقد عاملة ضمن مجمّعات عُقد بالحجم والمنطقة اللذين تختارهما، مع تسمياتك وقيودك. أضف عُقدًا عاملة أو أزلها متى شئت.
  • خدمات من نوع LoadBalancer على العنوان العام لمساحة عملك، وGateway API لتوجيه HTTP حسب اسم المضيف.
  • وحدات تخزين دائمة من فئتَي تخزين: إحداهما تحذف البيانات مع مطالبتها والأخرى تحتفظ بها. انظر وحدات تخزين Kubernetes.
  • kubectl top والتوسّع الأفقي التلقائي للحاويات وسياسات الشبكة، جاهزة للاستخدام، وأمان الـ Pods الذي يرفض الـ Pods ذات الامتيازات افتراضيًا.
  • عرض في لوحة التحكم لما يعمل داخل المجموعة: أحمال العمل وسجلات الحاويات، والخدمات والمسارات، واستهلاك العُقد العاملة والأحداث. انظر لوحة Kubernetes.

الخطط والحدود

الخطة المجانيةالخطط المدفوعة
المجموعات في مساحة العمل15
العُقد العاملة في المجموعة، عبر مجمّعات عُقدها1حتى 20
أحجام العُقد العاملةFreeSmall وMedium وLarge
التوافر العالي—نعم
وحدات التخزين في المجموعة2، حتى 10 غيغابايت لكل منها50، حتى 1,000 غيغابايت لكل منها
حجم العقدة العاملةالمعالجاتالذاكرةالقرص
Free24 غيغابايت20 غيغابايت
Small22 غيغابايت20 غيغابايت
Medium24 غيغابايت40 غيغابايت
Large48 غيغابايت80 غيغابايت

شبكة العقدة العاملة المجانية محدودة بـ 10 ميغابت في الثانية، كشبكة النسخة المجانية، ويتشارك معالجاها وقت معالجة نواة واحدة. وتحتفظ كل عقدة عاملة بجزء من معالجاتها وذاكرتها لنفسها: انظر ما تحتفظ به العقدة العاملة لنفسها.

تُحتسب العُقد العاملة ذات الحجم المدفوع (Small وMedium وLarge) من حصة خطتك تمامًا كالنسخ: تأخذ كل منها معالجاتها وذاكرتها وقرصها من الحصة نفسها التي تستهلكها نسخك، فتحتاج العُقد الجديدة إلى متّسع فيها. أما العقدة العاملة المجانية فلا تُحتسب، ومستوى التحكم يأتي مع كل مجموعة دون أن يُحتسب كذلك. وتُحتسب وحدات التخزين أيضًا من حصة القرص، وكل خدمة من نوع LoadBalancer تستهلك واحدًا من موزّعات الحمل لديك — والخطة المجانية تتضمّن موزّعًا واحدًا، فإن أردت أن تخدم عدة مواقع HTTP من خلاله فاستخدم Gateway API.

خطة مالك مساحة العمل هي التي تحدّد العمود الذي ينطبق. وحين تنفد الحصة، احذف نسخًا أو عُقدًا لم تعد تحتاجها، أو اطلب زيادة من صفحة الاستخدام.

وللعُقد العاملة ذات الحجم المدفوع، ومستوى التحكم عالي التوافر، ووحدات التخزين كذلك أسعار للدفع حسب الاستخدام تُقاس بالساعة؛ أما العقدة العاملة المجانية ومستوى التحكم القياسي فبلا تكلفة. انظر أسعار Kubernetes واستخدامه.

أنشئ مجموعة

افتح Kubernetes في مساحة عملك واختر مجموعة جديدة. يأخذك معالج قصير عبر كل الخيارات. يعيدك زر رجوع إلى خطوة سابقة دون أن تفقد ما أدخلته، ولا يُنشأ شيء قبل الخطوة الأخيرة.

  1. الأساسيات: اسم المجموعة (أحرف لاتينية صغيرة وأرقام وشرطات؛ يُطلق على عُقد المجموعة ولا يمكن تغييره لاحقًا)، والشبكة التي تنضمّ إليها عُقدها (شبكة خاصة جاهزة في مساحة العمل هذه)، وإصدار Kubernetes، والإقليم والمنطقة حيث تعمل عُقدها.
  2. مستوى التحكم: نشغّله نحن عنك في الحالتين. إن كانت خطتك تتضمّن التوافر العالي فاختر توافر عالٍ، فتبقى واجهة المجموعة تجيب حتى لو تعطّل أحد المضيفات؛ وإلا فتحصل المجموعة على مستوى التحكم القياسي. ويعرض كل خيار سعره الشهري.
  3. مجمّعات العُقد: أول مجمّع في المجموعة، واسمه default ما لم تغيّره، مع حجم العقدة العاملة وعدد العُقد العاملة، والتسميات والقيود إن احتجت إليها. اختر إضافة مجمّع آخر لأحمال العمل التي تحتاج إلى أجهزة خاصة بها. تُحتسب العُقد العاملة في كل المجمّعات من حدّ العُقد العاملة لكل مجموعة في خطتك، ويجب أن يبقى مجمّع واحد على الأقل دون قيد NoSchedule أو NoExecute، لأن خدمات المجموعة نفسها تعمل عليه. وتستهلك العُقد العاملة ذات الحجم المدفوع كذلك من حصة خطتك، وتعرض الخطوة مقدار ذلك، مع السعر الشهري لكل حجم وتكلفة عُقد كل مجمّع. انظر مجمّعات عُقد Kubernetes.
  4. الميزات: البوابة المُدارة، المفعّلة افتراضيًا، التي تقدّم مسارات HTTP في المجموعة عبر HTTPS. أوقِفها لتشغّل بوابتك أو متحكّم Ingress الخاص بك. تظهر هذه الخطوة حين تكون البوابة المُدارة متاحة لمساحة عملك.
  5. المراجعة: كل اختياراتك، ولكل منها زر تعديل يعيدك إلى خطوته، وما تأخذه المجموعة من خطتك: عُقدها العاملة، ومجموع المعالجات والذاكرة والقرص لها، وما تستهلكه عُقدها العاملة ذات الحجم المدفوع من حصة خطتك، ومجموعات مساحة العمل، وتقدير الدفع حسب الاستخدام الشهري. اختر إنشاء المجموعة.

وتقبل الواجهة البرمجية وأدوات الوكلاء الخيارات نفسها، بما فيها مجمّعات العُقد.

تنتقل المجموعة من في الانتظار إلى قيد الإنشاء — حجز العناوين، ثم تشغيل مستوى التحكم، ثم ضمّ العقد العاملة — وتصبح جاهزة خلال نحو خمس دقائق. ويعرض قسم نظرة عامة في المجموعة كل خطوة لحظة حدوثها.

اتصل عبر kubectl

افتح المجموعة، ثم انتقل إلى الوصول واختر تنزيل kubeconfig. يحمل الملف اسم <cluster>.kubeconfig:

bash
export KUBECONFIG=~/Downloads/<cluster>.kubeconfig
kubectl get nodes

يجدّد ملف kubeconfig هذا بيانات اعتماده بنفسه باستخدام sh وcurl (على macOS وLinux وWSL). وعلى جهاز يخلو منهما، اختر kubeconfig لمدة 12 ساعة بدلًا منه. وتشرح صفحة الوصول إلى مجموعات Kubernetes النوعين وما يتيحه لك دورك.

نقطة وصول واجهة المجموعة، المعروضة في صفحتها، تقع على العنوان العام لمساحة عملك، وتبقى مفتوحة للإنترنت حتى تحصرها: في قسم الوصول من المجموعة، تستطيع بطاقة الوصول إلى الـ API أن تحصرها بالشبكات التي تتصل منها، أو أن تجعل المجموعة خاصة لا يُوصَل إليها إلا من داخل شبكة مساحة عملك، كما يشرح قسم من يستطيع الوصول إلى الواجهة. ومن العناوين التي تسمح بها، تجيب عن فحوص السلامة لأي أحد، وعن كل ما عدا ذلك لبيانات اعتماد صالحة فقط.

انشر حمل عمل

bash
kubectl create deployment web --image=nginx:1.27-alpine --replicas=2
kubectl get pods -o wide

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

أتِحه للعالم

موزّع حمل لخدمة

yaml
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  type: LoadBalancer
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 80
bash
kubectl apply -f web-service.yaml
kubectl get service web

تحصل الخدمة على موزّع حمل من المنصّة على العنوان العام لمساحة عملك، ويظهر بوصفه عنوانها الخارجي، وتتوزّع حركة المرور على كل العُقد العاملة. تتشارك موزّعات الحمل في مساحة عملك هذا العنوان، فيستجيب كل منفذ من منافذ الخدمة على منفذ عام خاص به بين 40000 و49999، وتسجّله المنصّة على الخدمة:

bash
kubectl get service web -o jsonpath='{.metadata.annotations.service\.sahabti\.com/public-ports}'
# 80/TCP=40001

اتصل على ذلك المنفذ. وحذف الخدمة يحرّر موزّع الحمل الخاص بها. ويظهر موزّع الحمل هذا في صفحة موزّعات الحمل بعلامة Kubernetes وللقراءة فقط: غيّره من خلال الخدمة، التي يمكنها أيضًا أن تحدّد من يصل إليه، وترفض مصادر بعينها، وتضبط ملف حمايته ومهلة خموله ونمط عنوان العميل، كما يشرح دليل اضبط خدمة من نوع LoadBalancer. وله أيضًا اسم مضيف خاص به تحت lb.sahabti.app: اتصل به مع ذلك المنفذ، مثل prod-default-web-a1b2c3d4-k3x9mq.lb.sahabti.app:40001. ولا منفذ 443 على العنوان المشترك، فلخدمة HTTPS بلا رقم منفذ استخدم البوابة المُدارة أدناه.

توجيه HTTP حسب اسم المضيف

أبسط طريقة لخدمة مواقع HTTP عبر HTTPS هي البوابة المُدارة في المجموعة، فهي لا تحتاج إلى موزّع حمل وتتولّى الشهادات عنك: انظر أتِح خدمات HTTP للعالم.

ولتشغيل بوابة خاصة بك بدلًا منها، تأتي كل مجموعة مزوّدة بـGateway API وبفئة بوابة اسمها sahabti، فيستطيع موزّع حمل واحد أن يخدم مواقع كثيرة. ويحتاج إنشاء بوابة (Gateway) إلى دور مدير في المجموعة؛ أما المحرّرون فيستطيعون إنشاء المسارات دون البوابات:

yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: public
spec:
  gatewayClassName: sahabti
  listeners:
    - name: http
      protocol: HTTP
      port: 80
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: shop
spec:
  parentRefs:
    - name: public
  hostnames:
    - shop.example.com
  rules:
    - backendRefs:
        - name: web
          port: 80

يعرض kubectl get gateway public عنوان البوابة حين تجهز. وكأي موزّع حمل في المجموعة، يقع موزّع حمل البوابة على العنوان المشترك لمساحة عملك، حيث يستجيب منفذها 80 على منفذ عام خاص به: تعرضه صفحة موزّعات الحمل بعلامة Kubernetes ومعه ذلك المنفذ تحت المستمعون، وتحمله الخدمة التي تُنشأ للبوابة في التعليق التوضيحي service.sahabti.com/public-ports. وجّه سجل DNS لاسم المضيف إلى العنوان واتصل على ذلك المنفذ؛ وأي طلب لاسم مضيف لا يطالب به أي مسار يحصل على 404. ولـHTTPS، أضف مستمعًا بـprotocol: HTTPS وسرّ شهادة تنشئه في المجموعة.

أضف عُقدًا عاملة أو أزلها

تنتمي العُقد العاملة إلى مجمّعات عُقد. في قسم العُقد من المجموعة، عدّل مجمّعًا لتغيير عدد عُقده العاملة، أو أضف مجمّع عُقد بحجم آخر. وحين تزيل عُقدًا تُبقي المجموعة عقدة عاملة في كل منطقة فيها إحدى وحدات تخزينها ما دام العدد الذي تطلبه يسمح بذلك، وتُزيل العُقد التي لم تجهز بعد أو التي لا تتصل بها وحدة تخزين قبل غيرها، وفيما عدا ذلك تُزال الأحدث أولًا. تُخرَج كل منها من موزّعات الحمل، وتُفرَّغ — مع مهلة تصل إلى 15 دقيقة لميزانيات تعطّل الحاويات لديك — وتنتقل وحدات تخزينها إلى العُقد الباقية في منطقتها. وتذهب العُقد الجديدة أولًا إلى منطقة فيها إحدى وحدات تخزين المجموعة ولا عقدة عاملة فيها. ويشرح دليل مجمّعات عُقد Kubernetes المجمّعات وتسمياتها وقيودها.

تحتاج العُقد العاملة الجديدة ذات الحجم المدفوع إلى متّسع في حصة خطتك، أما إزالة العُقد فلا تحتاج إليه. تعرض المجموعة حالة قيد التحديث أثناء التغيير، وتواصل الخدمة طوال الوقت.

حين تتوقف عقدة عاملة عن العمل

نراقب كل عقدة عاملة. والعقدة التي لم تكن جاهزة طوال 10 دقائق، أو التي اختفت آلتها الافتراضية، تُستبدل بآلة افتراضية جديدة بالحجم والاسم نفسيهما على المضيف نفسه، فتتصل بها من جديد وحدات التخزين التي كانت تحملها. وأثناء ذلك تعرض المجموعة حالة قيد التحديث وتواصل الخدمة من عُقدها الأخرى، ويشرح السبب حدثٌ على العقدة سببه WorkerReplacing: تراه في الأحداث في المجموعة ومن خلال kubectl get events. وتُجدوَل الـ Pods التي كانت تعمل على العقدة من جديد كالمعتاد.

  • تُستبدل عقدة واحدة في كل مجموعة في كل مرة، ولا يحدث ذلك أبدًا والمجموعة تتغير أو في مستوى التحكم مشكلة. فإصلاح مستوى التحكم مسؤوليتنا، وأي مشكلة فيه تنبّه فريقنا.
  • حين تتوقف معظم عُقد المجموعة عن الجاهزية في الوقت نفسه، فنادرًا ما يكون السبب في العُقد نفسها، لذا لا تُستبدل أي منها ويتولى فريقنا البحث في الأمر.
  • لا تُستبدل عقدة عاملة مضيفها متوقف: فهي تعود للعمل حين يعود مضيفها.
  • إن تعذّر إكمال الاستبدال خلال 30 دقيقة تصبح المجموعة متدهورة مع رسالة "تعذّر استبدال إحدى العُقد العاملة". وتبقى العُقد العاملة الأخرى قيد التشغيل، ويُنبَّه فريقنا.

ما الذي نخبرك به

نخبر مالكي مساحة العمل ومديريها بالبريد الإلكتروني حين يبدأ أحد هذه الأمور، ومرة أخرى حين ينتهي، مرة واحدة في كل حالة. وما دام قائمًا تعرضه النظرة العامة للمجموعة أيضًا، تحت اسم المجموعة:

  • المجموعة متدهورة: لم يكتمل تغيير ما، مع السبب. وتبقى أحمال العمل فيها قيد التشغيل على العُقد العاملة الجاهزة.
  • عُقد عاملة غير جاهزة منذ أكثر من 15 دقيقة، بأسمائها: الحالات التي لا تُستبدل فيها العقدة العاملة تلقائيًا، المذكورة في حين تتوقف عقدة عاملة عن العمل.
  • وحدة تخزين ممتلئة بأكثر من 85٪، مع نسبة امتلائها. وينتهي الأمر حين تنخفض نسبة امتلائها إلى أقل من 80٪، فلا تصلك رسالتان عن وحدة تخزين تتأرجح حول الحد. وسّعها من قسم التخزين في المجموعة.
  • اقتراب نهاية دعم إصدار Kubernetes الذي تعمل به خلال 30 يومًا، ثم مرة أخرى خلال 7 أيام: بعد ذلك اليوم لا يتلقى أي إصلاحات أمنية. والتواريخ في مرجع Kubernetes.

تذهب الرسائل إلى العناوين التي يسجّل بها المالكون والمديرون دخولهم، باللغة التي اختارها كل منهم. ولا تتلقى مساحة العمل أكثر من 10 رسائل من هذا النوع في الساعة؛ وما يزيد عليها يصل في الساعة التالية.

احذف مجموعة

تبدأ كل مجموعة وحماية الحذف مفعّلة: وما دامت مفعّلة لا يستطيع أحد حذف المجموعة، لا من لوحة التحكم ولا من الـ API ولا من مساعد ذكاء اصطناعي. ولحذف مجموعة يوقف مديرها، أو مالك مساحة العمل أو مديرها، الحماية أولًا من حماية الحذف في قسم الإعدادات من المجموعة. ولا يستطيع ذلك غيرهم، ولا إلا بتسجيل الدخول إلى لوحة التحكم: تستطيع مفاتيح API ومساعدات الذكاء الاصطناعي تفعيل الحماية، ولا تستطيع إيقافها أبدًا، مهما كان المسموح لها غير ذلك. والمجموعة التي تُنشأ من الـ API مع deletionProtection: false، لمجموعة تنوي حذفها لاحقًا، تبدأ دونها.

ثم اختر حذف المجموعة في قسم الإعدادات من المجموعة واكتب اسمها. تُدمَّر كل العُقد وأحمال العمل، وتُحرَّر موزّعات الحمل، وتُحذف وحدات التخزين من الفئة الافتراضية مع بياناتها. أما وحدات التخزين من فئة sahabti-retain فتبقى في صفحة وحدات التخزين في مساحة عملك. ويتوقّف عمل ملفات kubeconfig الخاصة بالمجموعة.

ما الذي يقع على عاتقك

نحن نشغّل مستوى التحكم ونراقبه، ونُبقي واجهة المجموعة متاحة، ونشغّل العُقد العاملة ونستبدل منها ما يتوقف عن العمل؛ وأما الترقيات فلم تأتِ بعد، كما يبيّن أعلى هذه الصفحة. وأحمال عملك وإعداداتها وبياناتها مسؤوليتك: وحدة التخزين الدائمة ليست نسخة احتياطية، فاحتفظ بنسخك الاحتياطية لكل ما لا يمكنك إعادة إنشائه، وكن واعيًا لمن تمنحه ملف kubeconfig أو دور المحرّر في المجموعة.

الأسماء التي تستخدمها المنصّة في مجموعتك

تنشئ المنصّة هذه الأسماء في كل مجموعة وتحافظ عليها. اتركها في مكانها، وسمِّ كائناتك بأسماء أخرى:

الاسمالنوعما هو
sahabti-delete، sahabti-retainStorageClassفئتا التخزين؛ وsahabti-delete هي الافتراضية
sahabtiGatewayClassللبوابات الخاصة بك، كلٌّ منها خلف موزّع حمل
sahabti-managedGatewayClassفئة البوابة المُدارة نفسها؛ لا تستخدمها لبواباتك
sahabti، في مساحة الأسماء sahabti-gatewayGatewayالبوابة المُدارة: اربط بها مساراتك ولا تعدّلها
sahabtiIngressClassقواعد Ingress التي تخدمها البوابة المُدارة
sahabti:cluster-admins، sahabti:developers، sahabti:viewersGroupأدوار من لديهم وصول
service.sahabti.com/public-portsتعليق توضيحي على Serviceالمنفذ العام الذي يستجيب عليه كل منفذ من منافذها
lb.sahabti.com/…تعليقات توضيحية على Serviceإعدادات موزّع حملها
service.sahabti.com/load-balancerfinalizer على Serviceيُبقي الخدمة المحذوفة حتى يُحرَّر موزّع حملها
node.sahabti.com/poolتسمية على عقدة عاملةمجمّع العُقد الذي تنتمي إليه
topology.disk.sahabti.com/zoneتسمية على عقدة عاملةالمنطقة التي تقع فيها، والتي ترتبط بها وحدات التخزين

تعمل البوابة المُدارة في مساحة الأسماء sahabti-gateway وفي مساحة أخرى؛ وهما، مثل kube-system وkube-public وkube-node-lease، تخصّان المنصّة.