1. قبل البدء
Kubernetes هو مشروع مفتوح المصدر يمكن تنفيذه في العديد من البيئات المختلفة، من أجهزة الكمبيوتر المحمولة إلى المجموعات المتعددة العُقد عالية التوفّر، ومن السُحب الإلكترونية العامة إلى عمليات النشر داخل المؤسسة، ومن مثيلات الأجهزة الافتراضية (VM) إلى المعدن المجرّد.
في هذا الدرس التطبيقي حول الترميز، عليك نشر تطبيق ويب بسيط بلغة Spring Boot Java على 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.
- يمكنك توسيع نطاق خدمتك وطرح ترقية.
- الوصول إلى لوحة البيانات، وهي واجهة مستخدم Kubernetes مستندة إلى الويب.
المتطلبات
- مشروع على Google Cloud
- متصفح، مثل 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 لتخزين صورة الحاوية التي ستنشئها.
$ 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
- من المفترَض أن تتمكّن من الاطّلاع على صورة الحاوية المدرَجة في وحدة التحكّم من خلال الانتقال إلى صفحة "صور سجلّ العناصر" في Cloud Console. لديك الآن صورة Docker على مستوى المشروع يمكن لـ Kubernetes الوصول إليها وتنسيقها كما ستظهر لك بعد بضع دقائق.
- (اختياري) بعد الانتهاء (سيستغرق تنزيل كل البيانات واستخراجها بعض الوقت)، اختبِر الصورة باستخدام الأمر التالي الذي سيشغِّل حاوية Docker كبرنامج خفي على المنفذ 8080 من صورة الحاوية التي تمّ إنشاؤها حديثًا. إذا واجهت مشاكل في الأذونات، شغِّل
gcloud auth configure-docker
us-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 تديره 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. السماح بالزيارات الخارجية
لا يمكن الوصول إلى المجموعة تلقائيًا إلا من خلال عنوان IP الداخلي في المجموعة. لإتاحة الوصول إلى حاوية hello-java
من خارج شبكة Kubernetes الافتراضية، عليك عرض Pod كخدمة Kubernetes.
- في Cloud Shell، يمكنك عرض Pod على الإنترنت العام من خلال إنشاء خدمة Kubernetes LoadBalancer.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
يُرجى العِلم أنّك تعرض عملية النشر مباشرةً وليس المجموعة. سيؤدي ذلك إلى تحميل الخدمة الناتجة لتوازن حركة البيانات عبر جميع المجموعات التي تتم إدارتها من خلال عملية النشر (في هذه الحالة، تكون مجموعة 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
لتطلب من Kubernetes نشر الإصدار الجديد من تطبيقك في المجموعة بأكملها على جهاز واحد في كل مرة مع طرح التحديثات.
$ 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