تفعيل تطبيق Spring Bot Java على Kubernetes على Google Kubernetes Engine

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

إعداد البيئة الذاتية

  1. سجِّل الدخول إلى Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب في Gmail أو G Suite حاليًا، يجب إنشاء حساب.)

عذرًا! وسيُشار إليه لاحقًا في هذا الدرس التطبيقي بعنوان PROJECT_ID.

  1. بعد ذلك، ستحتاج إلى تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud.

من المفترَض ألا يكلفك تنفيذ هذا الدرس التطبيقي أكثر من بضعة دولارات، ولكن قد يكلف ذلك أكثر إذا قررت استخدام المزيد من الموارد أو إذا تركتها قيد التشغيل.

يكون مستخدمو Google Cloud الجدد مؤهّلين للاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

تفعيل Cloud Shell

  1. من Cloud Console، انقر على تفعيل Cloud Shell .

إذا لم تكن قد بدأت استخدام Cloud Shell من قبل، ستظهر لك شاشة متوسطة (في الجزء السفلي غير المرئي من الصفحة) تصف المقصود بذلك. وإذا كان الأمر كذلك، انقر على متابعة (ولن تظهر لك مرة أخرى مطلقًا). في ما يلي الشكل الذي تظهر به الشاشة لمرة واحدة:

من المفترض أن تستغرق إدارة إمكانيات Cloud Shell والاتصال بها بضع لحظات فقط.

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. ويوفر دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت ويتم تشغيله في Google Cloud، ما يعزّز بشكل كبير أداء الشبكة والمصادقة. يمكن إتمام معظم عملك إن لم يكن كلّه في هذا الدرس التطبيقي باستخدام متصفّح أو جهاز Chromebook.

بعد الربط بخدمة Cloud Shell، من المفترض أن تتم مصادقتها وأن المشروع مُعدّ على رقم تعريف المشروع.

  1. شغِّل الأمر التالي في 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].

بعد إطلاق Cloud Shell، يمكنك استخدام سطر الأوامر في إنشاء نسخة من رمز المصدر في الدليل الرئيسي.

$ git clone https://github.com/spring-guides/gs-spring-boot.git
$ cd gs-spring-boot/complete
  1. يمكنك بدء تشغيل تطبيق Spring Kiosk عادةً باستخدام المكوّن الإضافي Spring Bot.
$ ./mvnw -DskipTests spring-boot:run
  1. بعد بدء تشغيل التطبيق، انقر على معاينة الويبفي شريط أدوات Cloud Shell واختَر معاينة على المنفذ 8080.

يتم فتح علامة تبويب في المتصفِّح وتتصل بالخادم الذي بدأته للتو.

وبعد ذلك، يجب إعداد تطبيقك للتشغيل على Kubernetes. تتمثل الخطوة الأولى في تحديد الحاوية ومحتواها.

  1. إنشاء JAR قابل للنشر للتطبيق
$ ./mvnw -DskipTests package
  1. فعِّل Registry Registry لتخزين صورة الحاوية التي ستنشئها.
$ gcloud services enable containerregistry.googleapis.com
  1. استخدِم Jib لإنشاء صورة الحاوية وإرسالها إلى سجل الحاوية.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. إذا سارت الأمور بدون مشاكل، من المفترض أن ترى صورة الحاوية مُدرجة في وحدة التحكم عن طريق الانتقال إلى حاويات السجلّ &gt؛ الصور. لديك الآن صورة إرساء على مستوى المشروع، وهي لغة Kubernetes يمكن الوصول إليها وتنظيمها كما سترى خلال بضع دقائق.
  1. بعد اكتمال هذا (سيستغرق الأمر بعض الوقت لتنزيل كل الملفات واستخراجها)، يمكنك اختبار الصورة محليًا باستخدام الأمر التالي، والذي سيعمل على تشغيل حاوية docker كبرنامج خفي في المنفذ 8080 من صورة الحاوية التي تم إنشاؤها حديثًا:
$ docker run -ti --rm -p 8080:8080 \
  gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. ومرة أخرى، يمكنك الاستفادة من ميزة معاينة الويب في Cloud Shell.

  1. من المفترض أن تظهر الصفحة التلقائية في علامة تبويب جديدة. وبعد التحقُّق من تشغيل التطبيق محليًا في حاوية docker، يمكنك إيقاف حاوية التشغيل عن طريق الضغط على Control+C.

أنت مستعد لإنشاء مجموعة GKE. تتكون المجموعة من خادم Kubernetes API الذي تديره Google ومجموعة من عُقد العاملين. عُقد العامل هي أجهزة افتراضية على Compute Engine.

  1. تأكد أولاً من تفعيل ميزات واجهة برمجة التطبيقات ذات الصلة.
$ gcloud services enable compute.googleapis.com container.googleapis.com
Operation "operations/..." finished successfully
  1. أنشئ مجموعة تضم عقدتين من 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 الإصدار الحالي من الأمر.

  1. يمكن لعملية نشر Kubernetes إنشاء مثيلات متعددة لتطبيقك وإدارتها وقياسها باستخدام صورة الحاوية التي أنشأتها. انشر مثيلاً واحدًا من تطبيقك على Kubernetes باستخدام الأمر kubectl run.
$ kubectl create deployment hello-java \
  --image=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. لعرض النشر الذي أنشأته، ما عليك سوى تشغيل الأمر التالي:
$ kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-java   1         1         1            1           37s
  1. لعرض مثيلات التطبيق التي تم إنشاؤها من خلال عملية النشر، شغِّل الأمر التالي:
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-java-714049816-ztzrb   1/1       Running   0          57s

وفي هذه المرحلة، يجب أن تكون الحاوية تعمل تحت تحكّم Kubernetes، ولكن عليك أيضًا أن تجعلها متاحة للعالم الخارجي.

ولا يمكن الوصول إلى لوحة البيانات تلقائيًا إلا من خلال عنوان IP الداخلي بداخل المجموعة. لإتاحة حاوية hello-java من خارج شبكة Kubernetes الافتراضية، يجب عرض "لوحة Pod" كخدمة Kubernetes.

  1. في Cloud Shell، يمكنك عرض لوحة الإعلان على الإنترنت بشكل علني باستخدام الأمر kubectl expose بالإضافة إلى العلامة --type=LoadBalancer. العلامة مطلوبة لإنشاء عنوان IP يمكن الوصول إليه خارجيًا.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

تشير العلامة المستخدمة في الأمر إلى أنك ستستخدم جهاز موازنة الحمل الذي تقدمه البنية الأساسية. يُرجى ملاحظة أنه يتم الكشف مباشرةً عن عملية النشر، وليس عن اللوحة. وسيؤدي ذلك إلى تحميل الخدمة الناتجة لعدد زيارات التوازن عبر جميع اللوحات التي تديرها عملية النشر (في هذه الحالة، لوحة واحدة فقط، ولكن ستضيف المزيد من النُسخ المكرّرة لاحقًا).

يُنشئ Kubernetes Master جهاز موازنة الحمل وقواعد إعادة التوجيه في Compute Engine ذات الصلة، والمجموعات المستهدفة، وقواعد الجدار الناري لتسهيل الوصول إلى الخدمة بشكل كامل من خارج Google Cloud.

  1. للعثور على عنوان 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
  1. يُرجى العلم بأنّ هناك عنوانَي IP مُدرَجين للخدمة، وكلاهما يمثّل المنفذ 8080. أحدهما هو عنوان IP الداخلي الذي لا يظهر إلا في السحابة الإلكترونية الافتراضية الخاصة. والآخر هو عنوان IP الخارجي المتوازن. في المثال، عنوان IP الخارجي هو aaa.bbb.ccc.ddd. من المفترض أن يكون بإمكانك الآن الوصول إلى الخدمة من خلال توجيه المتصفّح إلى http://<EXTERNAL_IP>:8080.

إحدى الميزات الفعّالة التي تقدمها 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 ببساطة التأكّد من أن الواقع يتطابق مع الواقع الذي طلبته واتخذ الإجراء المناسب، إذا لزم الأمر.

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

  1. افتَح أداة تعديل الرموز من خلال النقر على إطلاق المحرِّر في قائمة Cloud Shell.
  2. انتقِل إلى 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!";
    }
}
  1. استخدِم Jib لإنشاء إصدار جديد من صورة الحاوية ونشره.
$ ./mvnw -DskipTests package \
  com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

أنت مستعد كي يتمكّن Kubernetes من تحديث وحدة التحكُّم في النسخ إلى الإصدار الجديد من التطبيق بسلاسة.

  1. لتغيير تصنيف الصورة لحاوية التشغيل، يجب تعديل نشر hello-java الحالي وتغيير الصورة من gcr.io/PROJECT_ID/hello-java:v1 إلى gcr.io/PROJECT_ID/hello-java:v2.
  1. يمكنك استخدام الأمر 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
  1. تحقق من http://EXTERNAL_IP:8080 مرة أخرى للتأكد من أنه يعرض الرد الجديد.

عفوًا. هل ارتكبت خطأً في الإصدار الجديد من التطبيق؟ وقد يكون هناك خطأ في الإصدار الجديد وعليك الرجوع بسرعة إليه. باستخدام Kubernetes، يمكنك إعادته إلى الحالة السابقة بسهولة. يرجع التطبيق إلى الحالة السابقة من خلال تشغيل الأمر التالي:

$ kubectl rollout undo deployment/hello-java

لقد تعلمت إنشاء تطبيق ويب جديد مستند إلى جافا ونشره على Kubernetes على GKE.

مزيد من المعلومات