1. قبل البدء
Kubernetes هو مشروع مفتوح المصدر يمكن تشغيله في العديد من البيئات المختلفة، بدءًا من أجهزة الكمبيوتر المحمول إلى المجموعات المتعددة العُقد العالية التوفّر، ومن السُحب الإلكترونية العامة إلى عمليات النشر المحلية، ومن مثيلات الأجهزة الافتراضية إلى الأجهزة غير الافتراضية.
في هذا الدرس التطبيقي حول الترميز، ستنشر تطبيق ويب بسيطًا مكتوبًا بلغة Java باستخدام Spring Boot على Kubernetes في GKE، والهدف هو أن تتمكّن من تشغيل تطبيق الويب كتطبيق مكرّر على Kubernetes. ستأخذ الرمز الذي تطوّره على جهازك، وتحوّله إلى صورة حاوية Docker، وتشغّل الصورة على GKE.
ستستخدم GKE، وهي خدمة Kubernetes مُدارة بالكامل على Google Cloud، ما يتيح لك التركيز بشكل أكبر على تجربة Kubernetes بدلاً من إعداد البنية الأساسية.
إذا كنت مهتمًا بتشغيل Kubernetes على جهازك المحلي، مثل كمبيوتر محمول مخصّص للتطوير، يمكنك الاطّلاع على Minikube الذي يوفّر إعدادًا بسيطًا لمجموعة Kubernetes أحادية العقدة لأغراض التطوير والاختبار. يمكنك استخدام Minikube لتجربة هذا الدرس التطبيقي حول الترميز إذا أردت.
سيستخدم الدرس التطبيقي حول الترميز نموذج الرمز البرمجي من الدليل حول إنشاء تطبيق باستخدام Spring Boot.
المتطلبات الأساسية
- معرفة بلغة البرمجة Java وأدواتها
- معرفة أدوات تحرير النصوص العادية في Linux، مثل Vim وEmacs وnano
المهام التي ستنفذها
- تعبئة تطبيق Java بسيط كحاوية Docker
- أنشِئ مجموعة Kubernetes على GKE.
- انشر تطبيق Java على Kubernetes في GKE.
- توسيع نطاق الخدمة وطرح ترقية
- الوصول إلى لوحة بيانات Access، وهي واجهة مستخدم Kubernetes مستندة إلى الويب
المتطلبات
- مشروع على السحابة الإلكترونية من Google
- متصفّح، مثل Google Chrome
2. الإعداد والمتطلبات
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
- رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم
PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تحمّل تكاليف تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.

إذا كانت هذه هي المرة الأولى التي تبدأ فيها Cloud Shell، ستظهر لك شاشة وسيطة توضّح ماهية هذه الخدمة. إذا ظهرت لك شاشة وسيطة، انقر على متابعة.

يستغرق توفير Cloud Shell والاتصال به بضع لحظات فقط.

يتم تحميل هذا الجهاز الافتراضي بجميع أدوات التطوير اللازمة. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إنجاز معظم عملك في هذا الدرس التطبيقي حول الترميز، إن لم يكن كله، باستخدام متصفح.
بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تم إثبات هويتك وأنّه تم ضبط المشروع على رقم تعريف مشروعك.
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من إكمال عملية المصادقة:
gcloud auth list
ناتج الأمر
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّ أمر gcloud يعرف مشروعك:
gcloud config list project
ناتج الأمر
[core] project = <PROJECT_ID>
إذا لم يكن كذلك، يمكنك تعيينه من خلال هذا الأمر:
gcloud config set project <PROJECT_ID>
ناتج الأمر
Updated property [core/project].
3- الحصول على رمز المصدر
بعد تشغيل Cloud Shell، يمكنك استخدام سطر الأوامر لاستنساخ نموذج رمز المصدر في الدليل الرئيسي.
$ git clone https://github.com/spring-guides/gs-spring-boot.git $ cd gs-spring-boot/complete
4. تشغيل التطبيق محليًا
- تأكَّد من ضبط JAVA_HOME على الإصدار الصحيح:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
- يمكنك بدء تشغيل تطبيق Spring Boot بشكل عادي باستخدام مكوّن Spring Boot الإضافي.
$ ./mvnw -DskipTests spring-boot:run
- بعد بدء تشغيل التطبيق، انقر على معاينة الويب
في شريط أدوات Cloud Shell واختَر المعاينة على المنفذ 8080.

تُفتح علامة تبويب في المتصفّح ويتم الربط بالخادم الذي بدأت تشغيله للتو.

5- تعبئة تطبيق Java في حاوية Docker
بعد ذلك، عليك إعداد تطبيقك للتشغيل على Kubernetes. الخطوة الأولى هي تحديد الحاوية ومحتوياتها.
- أنشئ ملف JAR القابل للنشر للتطبيق.
$ ./mvnw -DskipTests package
- فعِّل Artifact Registry API لتخزين صورة الحاوية التي ستنشئها.
$ gcloud services enable artifactregistry.googleapis.com
- أنشئ مستودع Docker جديدًا إذا لم يكن هناك مستودع. يجب إنشاء مستودع قبل أن تتمكّن من نقل أي صور إليه:
$ gcloud artifacts repositories create codelabrepo --repository-format=docker --location=us-central1
- ستكون صورتك بالتنسيق التالي:
{LOCATION}-docker.pkg.dev/{PROJECT-ID}/{REPOSITORY}/{IMAGE-NAME}
على سبيل المثال، إذا أنشأت المستودع في الموقع الجغرافي us-central1 باسم codelabrepo، وأردت تسمية صورتك hello-java:v1، ستكون الصورة على النحو التالي:
us-central1-docker.pkg.dev/{PROJECT-ID}/codelabrepo/hello-java:v1
- استخدِم Jib لإنشاء صورة الحاوية ونقلها إلى Artifact Registry.
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format="value(core.project)"`
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build -Dimage=us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/codelabrepo/hello-java:v1
- من المفترض أن تتمكّن من رؤية صورة الحاوية مُدرَجة في وحدة التحكّم من خلال الانتقال إلى صفحة صور Artifacts Registry في Cloud Console. يتوفّر لديك الآن صورة Docker على مستوى المشروع، ويمكن أن يصل إليها Kubernetes وينسّقها كما سترى في غضون بضع دقائق.
- (اختياري) بعد اكتمال العملية (سيستغرق تنزيل كل شيء واستخراجه بعض الوقت)، اختبِر الصورة باستخدام الأمر التالي الذي سيشغّل حاوية Docker كبرنامج خفي على المنفذ 8080 من صورة الحاوية التي أنشأتها حديثًا. إذا واجهت مشاكل في الأذونات، شغِّل
gcloud auth configure-dockerus-central1-docker.pkg.devأولاً:
$ docker run -ti --rm -p 8080:8080 \ us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
- مرّة أخرى، يمكنك الاستفادة من ميزة معاينة الويب في Cloud Shell.

- من المفترض أن تظهر الصفحة التلقائية في علامة تبويب جديدة. بعد التأكّد من أنّ التطبيق يعمل محليًا في حاوية Docker، يمكنك إيقاف الحاوية قيد التشغيل بالضغط على
Control+C.
6. إنشاء مجموعتك
أنت الآن جاهز لإنشاء مجموعة GKE. تتألف المجموعة من خادم Kubernetes API تديره Google ومجموعة من عُقد العامل. عُقد العامل هي أجهزة Compute Engine الافتراضية.
- أولاً، تأكَّد من تفعيل ميزات واجهة برمجة التطبيقات ذات الصلة.
$ gcloud services enable compute.googleapis.com container.googleapis.com
- أنشئ مجموعة تتضمّن عقدتَين من
n1-standard-1(سيستغرق إكمال ذلك بضع دقائق).
$ gcloud container clusters create hello-java-cluster \ --num-nodes 2 \ --machine-type n1-standard-1 \ --zone us-central1-c
في النهاية، من المفترض أن ترى المجموعة التي تم إنشاؤها.
Creating cluster hello-java-cluster...done. Created [https://container.googleapis.com/v1/projects/...]. kubeconfig entry generated for hello-dotnet-cluster. NAME ZONE MASTER_VERSION hello-java-cluster us-central1-c ...
يُفترض أن يكون لديك الآن مجموعة Kubernetes تعمل بكامل طاقتها وتستند إلى GKE.

حان الوقت الآن لنشر تطبيقك المحفوظ في حاوية إلى مجموعة Kubernetes. من الآن فصاعدًا، ستستخدم سطر الأوامر kubectl (الذي تم إعداده مسبقًا في بيئة Cloud Shell). تتطلّب بقية الدرس العملي أن يكون إصدار خادم Kubernetes وبرنامجه 1.2 أو إصدارًا أحدث. سيُظهر لك الأمر kubectl version الإصدار الحالي من الأمر.
7. نشر تطبيقك على Kubernetes
- يمكن لعملية نشر Kubernetes إنشاء عدة مثيلات من تطبيقك وإدارتها وتوسيع نطاقها باستخدام صورة الحاوية التي أنشأتها. يمكنك نشر نسخة واحدة من تطبيقك على Kubernetes باستخدام الأمر
kubectl run.
$ kubectl create deployment hello-java --image=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
- لعرض عملية النشر التي أنشأتها، ما عليك سوى تنفيذ الأمر التالي:
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 1 1 1 1 37s
- لعرض مثيلات التطبيق التي تم إنشاؤها من خلال عملية النشر، شغِّل الأمر التالي:
$ kubectl get pods NAME READY STATUS RESTARTS AGE hello-java-714049816-ztzrb 1/1 Running 0 57s
في هذه المرحلة، من المفترض أن يكون الحاوي قيد التشغيل تحت سيطرة Kubernetes، ولكن لا يزال عليك إتاحته للجمهور.
8. السماح بالزيارات الخارجية
بشكلٍ تلقائي، لا يمكن الوصول إلى Pod إلا من خلال عنوان IP الداخلي الخاص به داخل المجموعة. لكي تتمكّن من الوصول إلى الحاوية hello-java من خارج شبكة Kubernetes الافتراضية، عليك إتاحة Pod كخدمة Kubernetes.
- في Cloud Shell، يمكنك إتاحة الوصول إلى Pod من خلال الإنترنت المتاح للجميع عن طريق إنشاء خدمة LoadBalancer في Kubernetes.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
يُرجى العِلم أنّك تعرض عملية النشر مباشرةً، وليس Pod. سيؤدي ذلك إلى موازنة تحميل الخدمة الناتجة على جميع وحدات Pod التي يديرها النشر (في هذه الحالة، وحدة Pod واحدة فقط، ولكن ستضيف المزيد من النسخ المتماثلة لاحقًا).
ينشئ خادم Kubernetes الرئيسي موازن التحميل وقواعد التوجيه ذات الصلة في Compute Engine ومجموعات الأهداف وقواعد جدار الحماية لجعل الخدمة متاحة بالكامل من خارج Google Cloud.
- للعثور على عنوان IP الذي يمكن الوصول إليه بشكل علني للخدمة، ما عليك سوى طلب
kubectlلإدراج جميع خدمات المجموعة.
$ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-java 10.3.253.62 aaa.bbb.ccc.ddd 8080/TCP 1m kubernetes 10.3.240.1 <none> 443/TCP 5m
- من المفترض أن تتمكّن الآن من الوصول إلى الخدمة من خلال توجيه المتصفّح إلى
http://<EXTERNAL_IP>:8080.
9- توسيع نطاق خدمتك
من الميزات الفعّالة التي توفّرها Kubernetes سهولة توسيع نطاق تطبيقك. لنفترض أنّك تحتاج فجأةً إلى المزيد من السعة لتطبيقك. يمكنك ببساطة إخبار وحدة التحكّم في النسخ المتماثلة بإدارة عدد جديد من النسخ المتماثلة لمثيلات تطبيقك.
$ kubectl scale deployment hello-java --replicas=3 deployment "hello-java" scaled $ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 3 3 3 3 22m
لاحظ النهج التقريري. بدلاً من بدء مثيلات جديدة أو إيقافها، يمكنك تحديد عدد المثيلات التي يجب أن تعمل في جميع الأوقات. تضمن حلقات التسوية في Kubernetes ببساطة تطابق الواقع مع ما طلبته، وتتّخذ الإجراءات اللازمة إذا لزم الأمر.
10. طرح ترقية لخدمتك
في مرحلة ما، سيتطلّب التطبيق الذي نشرته في قناة الإصدار العلني إصلاح أخطاء أو إضافة ميزات. يمكن أن يساعدك Kubernetes في نشر إصدار جديد في مرحلة الإنتاج بدون التأثير في تجربة المستخدمين.
- افتح أداة تعديل الرموز من خلال النقر على فتح أداة التعديل
في قائمة Cloud Shell. - انتقِل إلى
src/main/java/com/example/springboot/HelloController.javaوعدِّل قيمة الردّ.
package com.example.springboot;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Google Kubernetes Engine!";
}
}
- استخدِم Jib لإنشاء إصدار جديد من صورة الحاوية ونشره. يجب أن يكون إنشاء الصورة المعدَّلة ونشرها أسرع بكثير لأنّك تستفيد بشكل كامل من التخزين المؤقت.
$ ./mvnw -DskipTests package com.google.cloud.tools:jib-maven-plugin:build -Dimage=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2
أنت الآن جاهز لتحديث وحدة التحكّم في النسخ المتماثلة بسلاسة إلى الإصدار الجديد من التطبيق باستخدام Kubernetes.
- لتغيير تصنيف صورة الحاوية قيد التشغيل، عليك تعديل عملية النشر الحالية
hello-javaوتغيير الصورة منus-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v1
إلى us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v2
- يمكنك استخدام الأمر
kubectl set imageلطلب نشر الإصدار الجديد من تطبيقك على مستوى المجموعة بأكملها، وذلك بمعدّل مثيل واحد في كل مرة باستخدام التحديثات المتجدّدة.
$ kubectl set image deployment/hello-java hello-java=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2 deployment "hello-java" image updated
- تحقَّق من
http://EXTERNAL_IP:8080مرة أخرى للتأكّد من أنّه يعرض الردّ الجديد.
11. مُعاد إلى الإصدار السابق
عفوًا. هل حدث خطأ في إصدار جديد من التطبيق؟ ربما كان الإصدار الجديد يتضمّن خطأ وعليك التراجع عنه بسرعة. باستخدام Kubernetes، يمكنك إعادة التطبيق إلى حالته السابقة بسهولة. يمكنك التراجع عن التحديث من خلال تنفيذ الأمر التالي:
$ kubectl rollout undo deployment/hello-java
من المفترض أن يظهر لك الرد القديم عند النقر على http://EXTERNAL_IP:8080 مرة أخرى.
12. تهانينا
تعرّفت على كيفية إنشاء تطبيق ويب جديد يستند إلى Java ونشره على Kubernetes في GKE.
تنظيف
$ gcloud container clusters delete hello-java-cluster --zone us-central1-c $ gcloud container images delete us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1 us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2