Kubernetes هو نظام مفتوح المصدر لأتمتة نشر، توسيع نطاق، وإدارة تطبيقات الحاويات. يسمح للمستخدمين بتشغيل التطبيقات في بيئات الحوسبة السحابية أو في مراكز البيانات الخاصة بهم بطريقة موحدة ومرنة.
تم تصميم Kubernetes لمساعدة المطورين وفرق العمليات على إدارة حمولات العمل والخدمات المرتبطة بها بكفاءة، وذلك بفضل قدراته في الجدولة التلقائية للحاويات، إدارة الحالة، التحديثات المتدرجة، والمزيد.
نشأة Kubernetes:
- التطوير والإطلاق: تم تطوير Kubernetes بواسطة مهندسي Google، وتم إطلاقه كمشروع مفتوح المصدر في عام 2014. استفاد Kubernetes من خبرة Google في تشغيل الحاويات على نطاق واسع ضمن إنتاجهم، خاصة باستخدام نظام Borg الداخلي الذي كان يعالج عمليات مماثلة.
- التأسيس: تم تصميم Kubernetes لمعالجة التحديات المرتبطة بتشغيل التطبيقات في بيئات الحوسبة السحابية، مثل الحاجة إلى الأتمتة في توزيع الحمل، وإدارة النسخ الاحتياطية، والتعافي من الفشل.
- التبني والنمو: منذ إطلاقه، شهد Kubernetes نموًا هائلًا في الشعبية والتبني من قبل الشركات والمجتمعات البرمجية حول العالم. أصبح يُعتبر النظام القياسي لأتمتة نشر وإدارة التطبيقات المحتواة.
تم تطوير Kubernetes ليكون مستقلاً عن البنية التحتية السحابية، مما يسمح بالتشغيل على أي منصة سحابية عامة، مثل Google Cloud Platform، Amazon Web Services، وMicrosoft Azure، إضافة إلى بيئات الحوسبة السحابية الخاصة والمحلية. هذه القدرة تجعل من Kubernetes أداة مرنة وقوية لإدارة الحاويات على مختلف البنيات التحتية.
كيف أبدأ العمل على Kubernetes
يمكن تطبيق الKubernetes حتى على جهازك المحلي بحيث تستطيع تعلم كيفية عمله بنظام مبسط، ومن ثم يمكنك تطبيق ما تعلمته على بيئتك المحلية على بيئات حقيقية ومن أشهر الأدوات في نظام ماك هو `minikube` الذي يمكنك بعمل بيئة مماثلة على جهازك بنظام ماك وهناك أيضا docker kubernetes والعديد من الأنظمة المماثلة التي تساعدك على محاكاة النظام.
سنعتمد التنصيب على بيئة Mac مع العلم جميع الأدوات على أنظمة التشغيل الأخرى مثل Windows و Linux
Mini Kube
Minikube هو أداة تسمح بتشغيل Kubernetes بسهولة على جهاز كمبيوتر محلي. يتم استخدامه بشكل أساسي لأغراض التطوير والاختبار. يقوم Minikube بإنشاء مجموعة (Cluster) صغيرة من Kubernetes تحتوي على عقدة واحدة فقط تعمل على جهاز الكمبيوتر الخاص بك. يوفر بيئة مثالية لتجربة Kubernetes وتعلم استخدامه دون الحاجة إلى توفير عدة عقد على خوادم بعيدة.
سنبدأ بتنصيب ال minikube أولا
brew install minikube
Kubectl
kubectl
هي أداة سطر الأوامر (CLI) تسمح لك بتشغيل الأوامر ضد مجموعات Kubernetes. يمكنك استخدام kubectl
لنشر التطبيقات، فحص وإدارة حالة موارد المجموعة، وعرض السجلات، وغير ذلك الكثير. إنها تعتبر أداة أساسية للتفاعل مع Kubernetes، توفر واجهة تحكم قوية للإدارة والتشغيل، يمكنك إستعمالها في التواصل مع Kubernetes سواء المحلية أو البعيدة.
لتنصيب الأداة
brew install kubectl
يمكنك التأكد من عمل الآداة
kubectl version --client
Docker
Docker هو منصة مفتوحة المصدر تُستخدم لتطوير، شحن، وتشغيل التطبيقات. يسمح Docker للمطورين بتغليف تطبيقاتهم والتبعيات الخاصة بها في حاويات. هذه الحاويات يمكن تشغيلها في أي بيئة تدعم Docker، مما يجعل التطبيق محمولًا ومتسقًا عبر البيئات المختلفة من التطوير وحتى الإنتاج. يوفر Docker أيضًا Docker Hub، وهو سجل للحاويات يسمح للمستخدمين بمشاركة وتوزيع الحاويات بسهولة. ويعتمد ال Kubernetes علي Docker لإنشاء والتحكم بالوحدات وتجهيز التطبيقات عليها.
لتنصيب الأداة
يمكن تنزيل Docker Desktop for Mac من موقع Docker الرسمي واتباع الإرشادات الموجودة في المثبت.
الآن أنت جاهز للإنطلاق، لنبدأ العمل بتشغيل ال minikube
مع العلم أن الشفرة في الأسفل تحتوي على إضافات مشهورة يمكن إستعمالها في خلال العمليات الخاصة بال Kubernetes
minikube start --addons=dashboard --addons=metric-server --addons="ingress" --addons="ingress-dns"
وسيبدأ بتجهيز الأداءة وسيعطيك الأشارة بأنك جاهز للإستعمال
وللتأكد من عمل كل شيء على مرام من خلال تطبيق الأمر التالي
kubectl get nodes
وفي حال كل شيء يعمل على مايرام سيكون هنا نود تشير إلى الماستر أو أنها كونترول بمعنى أنها تدير الكوبرنيتيز
وهذا يظهر لأنها تعمل على جهاز واحد ولكن في الحالة الطبيعية فإن هناك الكثير من النودز تعمل على الكلستر
العمليات الدورية وتجهيز ال Kubernetes
إذا أردت إيقاف ال miniKube يمكنك ذلك من خلال
minikube stop
ويمكنك إعادة تشغيله من خلال
minikube start
دون الحاجة لإضافة جميع الخيارات لأن أي إضافة تم تجهيزها مسبقا سيتم تشغيلها مع الكود السابق.
الآن لنبدأ بإنشاء أول حاوية “container” وهو يمثل “image” تم تجهيزها مسبقا من خلال “docker”
Kubectl run —-image=“negix” web
يمكنك معرفة تفاصيل البودز والتي تمثل الحاويات التي تم تشغيلها
Kubectl get pods
ولكن ما هو ال Pod
Kubernetes Pod هو أصغر وحدة قابلة للنشر والإدارة في نظام Kubernetes. يمكن تعريف Pod بأنه مجموعة من واحد أو أكثر من الحاويات (مثل Docker containers) التي تشارك نفس الشبكة ومساحة تخزين ومواصفات تشغيل. الحاويات داخل Pod تشغل على نفس العقدة الفعلية أو الافتراضية داخل الكلاستر، مما يسمح لها بالتواصل بسهولة مع بعضها البعض.
في Kubernetes، Pods هي الوحدات الأساسية التي يتم جدولتها على عقد (nodes) الكلاستر. يتم إدارتها بواسطة مكونات أعلى مستوى، مثل ReplicaSets، Deployments، وStatefulSets، التي تدير دورة حياة الPods، بما في ذلك النشر، التحديث، والمقياسة.
ولمعرفة حالة بود معين
Kubectl describe pod web
يعطيك Kubernetes مجال لتحديد ما إذا كنت تريد تشغيل دائم للحاوية “container” أو تحديد خصائص كيفية تشغيل container
وبالتالي فإن هذه الخصائص متعددة، لذلك يقوم container بالتعامل مع ذلك عبر ملفات YML والتي تحوي طبيعة التجهيز اللازم والكثير من الخصائص لضمان تشغيله حسب المطلوب
مثال
apiVersion: v1
kind: Pod
metadata:
name: green
labels:
app: blue-green
spec:
containers:
- name: green
image: docker.io/mtinside/blue-green:green
ويمكنك تطبيق أي إعدادات من خلال هذه الملفات عبر أمر
Kubectl apply -f “filename”
وبمجرد فعل ذلك سيقوم الكوبرنيتيز بتجهيز الإعدادات اللازمة حسب المحتوى
أيضا يمكنك تحديد خدمات للبود الواحد وتجهيزها بحيث يمكن إستعمالها داخليا من خلال بودز أخرى أو حتى على مستوى الكلستر كامل
Kubectl expose pod “pod name” --port 8080 --name “your service name”
يمكنك بكل تأكيد عمل ذلك كما أسلفنا من خلال YML
يمكن أيضا إستعراض الخدمات
kubectl get services
لمعرفة ملف الإعدادات المخصصة ل Pod معين
Kubectl get pod “Pod Name” -o yaml
#export the yaml "تصدير كملف"
kubectl get pod web -o yaml > web.yaml
يمكن معرفة أيضا الفرق بين ملف إعدادات تود تنفيذه وبين ما هو موجود في ال Kubernetes
kubectl diff -f "file to check what will be changed"
بالطريقة السابقة يمكنك أيضا معرفة إعدادات أي خدمة أو نوع يدار من خلال ال Kubernetes بمعنى أن الأمر لا يقتصر فقط على ال Pod
يمكن أيضا حذف أي بود أو خدمة أو أي نوع يدار من خلال ال Kubernetes
Kubectl delete TYPE NAME
للحصول على ال IP الخاص بال Minikube بحيث يمكنك أيضا
Mininkube ip
يمكن في Kubernetes لإعادة توجيه أحد المنافذ على جهازك المحلي إلى منفذ داخل Pod معين يعمل داخل الكلاستر. هذا يسمح لك بالوصول إلى التطبيقات والخدمات التي تعمل داخل الPod بشكل مباشر من جهازك الخاص. الصيغة العامة للأمر هي كالتالي
Kubectl port-forward “pod name” “localPort”:”remote Port”
هذه الطريقة مفيدة جدًا لأغراض التطوير والاختبار، حيث يمكنها توفير وصول سريع ومؤقت إلى التطبيقات والخدمات داخل الكلاستر دون الحاجة إلى تعريف وتكوين Ingress أو خدمات مكشوفة (exposed services).
إجراء تعديلات على الإعدادات
سيؤدي تغيير العناصر الأساسية إلى إعادة تشغيل Kubernetes، بينما إذا قمت فقط بتغيير التسمية في yml وتطبيقها فلن يتم إعادة التشغيل، يمكنك تسمية مجموعة من الإعدادات تحت علامة واحدة والتحكم بها كمجموعة `label`
مثلا لمعرفة ال logs الخاصة ببود معين من خلال اسم البود أو من خلال علامة لمعرفة من خلال مجموعة تحمل نفس الlabel
Kubectl logs “Pod Name”
#By Label
Kubectl logs -l app=“label”
كما يمكن تنفيذ أوامر مباشرة من داخل ال حاوية في ال Pod بمعنى أن تدخل إلى نافذة الأوامر الخاصة بالبود وتفحص أو تنصب أي شيء داخليا
kubectl exec -ti "pod name" -- /bin/sh
خصائص مهمة لل Kubernetes
العديد من مهام إدارة الخوادم تُسهّل بواسطة Kubernetes؛ فعند حدوث مشكلة في أي من الPods، يتولى Kubernetes إعادة تشغيلها تلقائيًا، حتى في حال أنك قمت مثلا بتحديث ال Pods مثلا فسيقوم هو ذاتيا بإدارة تغييرها مع ضمان بقاء الخدمة دون إنقطاع.
في حالة تلقي Pod لعدد كبير من الطلبات، مما قد يؤدي إلى ضغط عليه، Kubernetes يدخل في الصورة لمعالجة هذا التحدي عبر آلياته الذكية.
يمكن أيضًا تحديد مواقع الPods بدقة ضمن عقدة محددة في الكلاستر، مما يسمح بتجميع بعض الPods عن قرب لتحسين الأداء وتباعد آخرين لزيادة الاستقرار والتوزيع الأمثل للموارد. كذلك، يتيح Kubernetes إمكانية تخصيص سلوك الاتصالات داخل الشبكة لتلبية متطلبات التطبيقات المختلفة.
عزل العناصر في Kubernetes بال namespace
يمكن تعريف خاصية الـ namespace في كوبرنتيس كطريقة لعزل وإدارة الموارد داخل البيئة الواحدة، حيث تسمح بتقسيم موارد النظام إلى أقسام معزولة يمكن التعامل مع كل قسم منها بشكل مستقل. هذا العزل يفيد في توفير بيئات متعددة داخل نفس الكلاستر مثل بيئات الاختبار (testing)، التجهيز (staging)، والإنتاج (production). بالإضافة إلى ذلك، يمكن استخدام الـ namespaces لتنظيم الموارد بحسب الفرق العاملة أو العملاء، مما يساعد في تحسين إدارة الأمان والوصول إلى الموارد، وكذلك في توزيع الموارد بطريقة أكثر فعالية داخل الكلاستر.
لإنشاء namespace جديد يمكنك استخدام الأمر التالي:
kubectl create namespace testing
هذا الأمر سيقوم بإنشاء namespace يدعى testing
. يمكنك استبدال “testing” بأي اسم تفضله للـ namespace الذي تريد إنشاءه.
لرؤية قائمة بجميع الـ namespaces الموجودة في الكلاستر:
kubectl get namespaces
إذا أردت تشغيل pod داخل namespace محدد، يمكنك تحديد الـ namespace باستخدام العلامة --namespace
مع الأمر. على سبيل المثال، لتشغيل nginx داخل namespace يدعى testing
:
kubectl run nginx --image=nginx --namespace=testing
الحصول على معلومات حول الموارد في Namespace معين
للحصول على معلومات حول pods في namespace محدد، استخدم:
kubectl get pods --namespace=testing
تطبيق ملف YAML داخل Namespace
إذا كان لديك ملف YAML يحدد resource مثل Deployment أو Service، وتريد تطبيقه داخل namespace محدد، يمكنك استخدام الأمر التالي:
kubectl apply -f deployment.yaml --namespace=staging
تأكد من أن ملف YAML يحدد الـ namespace بشكل صحيح، أو يمكنك تجاوز الـ namespace المحدد في الملف باستخدام العلامة --namespace
.
هذه الأمثلة توضح بعض الطرق الأساسية لاستخدام namespaces في Kubernetes لتنظيم وإدارة الموارد داخل كلاستر Kubernetes بشكل فعال.
إدارة إصدارات Deployment في Kubernetes: التراجع وإعادة الإنتاج
في بيئات Kubernetes، يعد التحكم في إصدارات التطبيقات وإمكانية التراجع عن التحديثات الأخيرة أمرًا حيويًا لضمان الاستقرار والمرونة في النظام. الأوامر التالية توفر آليات للتعامل مع إصدارات Deployment في Kubernetes، مما يسمح بالتراجع عن التغييرات وإعادة بدء الخدمات بكفاءة.
التراجع إلى الإصدار السابق من Deployment
للتراجع بسرعة إلى الإصدار السابق من Deployment في حالة وجود مشاكل بعد التحديث، يمكن استخدام الأمر التالي:
kubectl rollout undo deployment/your-deployment-name
يؤدي تنفيذ هذا الأمر إلى استعادة الإصدار السابق من Deployment دون الحاجة إلى تحديد رقم الإصدار يدويًا، مما يجعله خيارًا سريعًا للتراجع عن التحديثات غير المرغوب فيها.
التراجع إلى إصدار محدد من Deployment
في بعض الحالات، قد تحتاج إلى التراجع إلى إصدار معين بدلاً من الإصدار الأخير. يمكن القيام بذلك عن طريق الخطوات التالية:
kubectl rollout history deployment/your-deployment-name
ثم، للتراجع إلى إصدار محدد، استخدم العلامة --to-revision
مع الأمر التالي:
kubectl rollout undo deployment/your-deployment-name --to-revision=revision-number
إعادة بدء Deployment في Namespace معين
لإعادة بدء Deployment في بيئة معينة مثل الإنتاج، يمكن استخدام الأمر التالي، الذي يضمن إعادة تشغيل الخدمات دون تغيير الإعدادات الحالية:
kubectl -n production rollout restart deployment/your-deployment-name
هذا الأمر يقوم بإعادة تشغيل جميع الـ Pods ضمن Deployment المحدد في الـ namespace production
، مما يساعد في حالات مثل تحديث الإعدادات السرية أو التغييرات التي تحتاج إلى تطبيق فوري.
هذه الأدوات تعزز مرونة التحكم في التطبيقات داخل Kubernetes، مما يتيح للمديرين تعديل أو استعادة الخدمات بكفاءة وفقًا للمتطلبات العملية.
تعزيز الكفاءة والمرونة في إدارة الحاويات مع Kubernetes
Kubernetes يوفر نظامًا متكاملًا ومرنًا لإدارة تطبيقات الحاويات على نطاق واسع، مما يجعله الخيار المفضل للشركات التي تسعى لتحسين أتمتة التطبيقات وإدارتها بكفاءة. الأدوات والأوامر التي تمت مناقشتها في هذه المقالة تعكس فقط جزءًا من القدرات القوية التي يقدمها Kubernetes، بدءًا من إنشاء وتنظيم الـ namespaces، إلى إدارة إصدارات وتحديثات الـ Deployments بكفاءة وسلاسة.
عبر استخدام Kubernetes، يمكن للمطورين وفرق العمليات تسريع دورات التطوير والتأكد من استقرار وأمان التطبيقات، حتى في أكثر البيئات تحديًا وتقلبًا. هذا النظام لا يسهل فقط على الشركات توسيع نطاق تطبيقاتها بفعالية، ولكنه يمكّنها أيضًا من تحقيق استجابة أسرع لمتطلبات السوق وتغييراته.
مع تواصل تطور Kubernetes وتوسع نظامه الإيكولوجي، من المتوقع أن يستمر في تشكيل مستقبل التطبيقات المحتواة. الشركات التي تعتمد على هذه التقنية ستكون مجهزة بشكل جيد لمواجهة التحديات التكنولوجية المستقبلية واغتنام الفرص بأقصى قدر من الكفاءة والمرونة.