تفعيل تطبيق Spring Bot Java على Kubernetes على Google Kubernetes Engine
لمحة عن هذا الدرس التطبيقي حول الترميز
1. قبل البدء
Kubernetes هو مشروع مفتوح المصدر يمكن تنفيذه في بيئات مختلفة، بدءًا من أجهزة الكمبيوتر المحمولة إلى مجموعات ذات عُقد متعدّدة الأبعاد، من السُحُب العامة إلى عمليات النشر داخل المؤسسة، ومن مثيلات الأجهزة الافتراضية (VM) إلى المعادن البسيطة.
في هذا الدرس التطبيقي حول الترميز، عليك نشر تطبيق ويب بسيط بلغة Spring Power Java على Kubernetes على GKE وهدفه هو تشغيل تطبيقك على الويب كتطبيق منسوخ على Kubernetes. يمكنك الحصول على الرمز الذي تطوره على جهازك وتحويله إلى صورة حاوية docker وتشغيل الصورة على GKE.
أنت تستخدم GKE، وهي خدمة Kubernetes مُدارة بالكامل على Google Cloud، بما يسمح لك بالتركيز بشكل أكبر على تجربة Kubernetes، بدلاً من إعداد البنية الأساسية.
إذا كنت مهتمًا بتشغيل تطبيق Kubernetes على جهازك المحلي، مثل كمبيوتر محمول محمول، يمكنك الاطّلاع على أداة Minikube التي توفّر إعدادًا بسيطًا لمجموعة Kubernetes من عُقدة لأغراض التطوير والاختبار. ويمكنك استخدام Minikube خلال الدرس التطبيقي حول الترميز إذا أردت ذلك.
سيستخدم الدرس التطبيقي حول الرمز الرمزي من الدليل الذي يتناول إنشاء تطبيق باستخدام Spring Bot.
المتطلبات الأساسية
- الإلمام بلغة البرمجة Java وأدواتها
- معرفة بالمحرِّرين النصيين العاديين لنظام التشغيل Linux، مثل Vim وEmacs وnano
المهام التي ستنفِّذها
- يمكنك حزمة تطبيق Java بسيط كحاوية docker.
- إنشاء مجموعة Kubernetes على GKE.
- انشر تطبيق جافا على Kubernetes على GKE.
- توسيع نطاق خدمتك وطرح ترقية
- الدخول إلى لوحة البيانات، وهي واجهة مستخدم Kubernetes مستندة إلى الويب.
المتطلبات اللازمة
- مشروع على Google Cloud
- متصفح، مثل Google Chrome
2. الإعداد والمتطلبات
إعداد البيئة الذاتية
- سجِّل الدخول إلى Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب في Gmail أو G Suite حاليًا، يجب إنشاء حساب.)
عذرًا! وسيُشار إليه لاحقًا في هذا الدرس التطبيقي بعنوان PROJECT_ID
.
- بعد ذلك، ستحتاج إلى تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.
من المفترَض ألا يكلفك تنفيذ هذا الدرس التطبيقي أكثر من بضعة دولارات، ولكن قد يكلف ذلك أكثر إذا قررت استخدام المزيد من الموارد أو إذا تركتها قيد التشغيل.
يكون مستخدمو Google Cloud الجدد مؤهّلين للاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
تفعيل Cloud Shell
- من Cloud Console، انقر على تفعيل Cloud Shell
.
إذا لم تكن قد بدأت استخدام Cloud Shell من قبل، ستظهر لك شاشة متوسطة (في الجزء السفلي غير المرئي من الصفحة) تصف المقصود بذلك. وإذا كان الأمر كذلك، انقر على متابعة (ولن تظهر لك مرة أخرى مطلقًا). في ما يلي الشكل الذي تظهر به الشاشة لمرة واحدة:
من المفترض أن تستغرق إدارة إمكانيات Cloud Shell والاتصال بها بضع لحظات فقط.
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. ويوفر دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يعزّز بشكل كبير أداء الشبكة والمصادقة. يمكن إتمام معظم عملك إن لم يكن كلّه في هذا الدرس التطبيقي باستخدام متصفّح أو جهاز Chromebook.
بعد الربط بخدمة 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`
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. تشغيل التطبيق محليًا
- يمكنك بدء تشغيل تطبيق Spring Kiosk عادةً باستخدام المكوّن الإضافي Spring Bot.
$ ./mvnw -DskipTests spring-boot:run
- بعد بدء تشغيل التطبيق، انقر على معاينة الويب
في شريط أدوات Cloud Shell واختَر معاينة على المنفذ 8080.
يتم فتح علامة تبويب في المتصفِّح وتتصل بالخادم الذي بدأته للتو.
5. حزم تطبيق Java كحاوية docker
وبعد ذلك، يجب إعداد تطبيقك للتشغيل على Kubernetes. تتمثل الخطوة الأولى في تحديد الحاوية ومحتواها.
- إنشاء JAR قابل للنشر للتطبيق
$ ./mvnw -DskipTests package
- فعِّل Registry Registry لتخزين صورة الحاوية التي ستنشئها.
$ gcloud services enable containerregistry.googleapis.com
- استخدِم Jib لإنشاء صورة الحاوية وإرسالها إلى سجل الحاوية.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- إذا سارت الأمور بدون مشاكل، من المفترض أن ترى صورة الحاوية مُدرجة في وحدة التحكم عن طريق الانتقال إلى حاويات السجلّ >؛ الصور. لديك الآن صورة إرساء على مستوى المشروع، وهي لغة Kubernetes يمكن الوصول إليها وتنظيمها كما سترى خلال بضع دقائق.
- بعد اكتمال هذا (سيستغرق الأمر بعض الوقت لتنزيل كل الملفات واستخراجها)، يمكنك اختبار الصورة محليًا باستخدام الأمر التالي، والذي سيعمل على تشغيل حاوية docker كبرنامج خفي في المنفذ 8080 من صورة الحاوية التي تم إنشاؤها حديثًا:
$ docker run -ti --rm -p 8080:8080 \ gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- ومرة أخرى، يمكنك الاستفادة من ميزة معاينة الويب في Cloud Shell.
- من المفترض أن تظهر الصفحة التلقائية في علامة تبويب جديدة. وبعد التحقُّق من تشغيل التطبيق محليًا في حاوية docker، يمكنك إيقاف حاوية التشغيل عن طريق الضغط على
Control+C
.
6. إنشاء مجموعتك
أنت مستعد لإنشاء مجموعة GKE. تتكون المجموعة من خادم Kubernetes API الذي تديره Google ومجموعة من عُقد العاملين. عُقد العامل هي أجهزة افتراضية على Compute Engine.
- تأكد أولاً من تفعيل ميزات واجهة برمجة التطبيقات ذات الصلة.
$ gcloud services enable compute.googleapis.com container.googleapis.com Operation "operations/..." finished successfully
- أنشئ مجموعة تضم عقدتين من
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=gcr.io/$GOOGLE_CLOUD_PROJECT/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، يمكنك عرض لوحة الإعلان على الإنترنت بشكل علني باستخدام الأمر
kubectl expose
بالإضافة إلى العلامة--type=LoadBalancer
. العلامة مطلوبة لإنشاء عنوان IP يمكن الوصول إليه خارجيًا.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
تشير العلامة المستخدمة في الأمر إلى أنك ستستخدم جهاز موازنة الحمل الذي تقدمه البنية الأساسية. يُرجى ملاحظة أنه يتم الكشف مباشرةً عن عملية النشر، وليس عن اللوحة. وسيؤدي ذلك إلى تحميل الخدمة الناتجة لعدد زيارات التوازن عبر جميع اللوحات التي تديرها عملية النشر (في هذه الحالة، لوحة واحدة فقط، ولكن ستضيف المزيد من النُسخ المكرّرة لاحقًا).
يُنشئ Kubernetes Master جهاز موازنة الحمل وقواعد إعادة التوجيه في 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
- يُرجى العلم بأنّ هناك عنوانَي IP مُدرَجين للخدمة، وكلاهما يمثّل المنفذ 8080. أحدهما هو عنوان IP الداخلي الذي لا يظهر إلا في السحابة الإلكترونية الافتراضية الخاصة. والآخر هو عنوان IP الخارجي المتوازن. في المثال، عنوان IP الخارجي هو
aaa.bbb.ccc.ddd
. من المفترض أن يكون بإمكانك الآن الوصول إلى الخدمة من خلال توجيه المتصفّح إلى 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/hello/HelloController.java
وعدِّل قيمة الرد.
package hello;
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=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2
أنت مستعد كي يتمكّن Kubernetes من تحديث وحدة التحكُّم في النسخ إلى الإصدار الجديد من التطبيق بسلاسة.
- لتغيير تصنيف الصورة لحاوية التشغيل، يجب تعديل نشر
hello-java
الحالي وتغيير الصورة منgcr.io/PROJECT_ID/hello-java:v1
إلىgcr.io/PROJECT_ID/hello-java:v2
.
- يمكنك استخدام الأمر
kubectl set image
لكي تطلب من Kubernetes نشر الإصدار الجديد من تطبيقك على مستوى المجموعة بالكامل مرة واحدة مع إجراء تحديثات متعاقبة.
$ kubectl set image deployment/hello-java \ hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2 deployment "hello-java" image updated
- تحقق من http://EXTERNAL_IP:8080 مرة أخرى للتأكد من أنه يعرض الرد الجديد.
11. العودة إلى الحالة السابقة
عفوًا. هل ارتكبت خطأً في الإصدار الجديد من التطبيق؟ وقد يكون هناك خطأ في الإصدار الجديد وعليك الرجوع بسرعة إليه. باستخدام Kubernetes، يمكنك إعادته إلى الحالة السابقة بسهولة. يرجع التطبيق إلى الحالة السابقة من خلال تشغيل الأمر التالي:
$ kubectl rollout undo deployment/hello-java
12. تهانينا
لقد تعلمت إنشاء تطبيق ويب جديد مستند إلى جافا ونشره على Kubernetes على GKE.