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
- توسيع نطاق خدمتك وطرح ترقية
- الوصول إلى لوحة بيانات، وهي واجهة مستخدم Kubernetes مستندة إلى الويب
المتطلبات
- مشروع Google Cloud
- متصفّح، مثل Google Chrome
إعداد البيئة بالسرعة التي تناسبك
- سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب).
تذكَّر معرّف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس العملي باسم 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].
بعد تشغيل Cloud Shell، يمكنك استخدام سطر الأوامر لاستنساخ نموذج رمز المصدر في الدليل الرئيسي.
$ git clone https://github.com/spring-guides/gs-spring-boot.git $ cd gs-spring-boot/complete
- يمكنك بدء تشغيل تطبيق Spring Boot بشكل عادي باستخدام مكوّن Spring Boot الإضافي.
$ ./mvnw -DskipTests spring-boot:run
- بعد بدء تشغيل التطبيق، انقر على معاينة الويب
في شريط أدوات Cloud Shell واختَر المعاينة على المنفذ 8080.
سيتم فتح علامة تبويب في المتصفّح والاتصال بالخادم الذي بدأت تشغيله للتو.
بعد ذلك، عليك إعداد تطبيقك للتشغيل على Kubernetes. الخطوة الأولى هي تحديد الحاوية ومحتوياتها.
- أنشئ ملف JAR القابل للنشر للتطبيق.
$ ./mvnw -DskipTests package
- فعِّل Container Registry لتخزين صورة الحاوية التي ستنشئها.
$ gcloud services enable containerregistry.googleapis.com
- استخدِم Jib لإنشاء صورة الحاوية ونقلها إلى Container Registry.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- إذا سارت الأمور على ما يرام، من المفترض أن تتمكّن من رؤية صورة الحاوية مُدرَجة في وحدة التحكّم من خلال الانتقال إلى Container Registry > الصور. يتوفّر لديك الآن صورة Docker على مستوى المشروع، ويمكن أن يصل إليها Kubernetes وينسّقها كما سترى في غضون بضع دقائق.
- بعد اكتمال ذلك (سيستغرق تنزيل كل شيء واستخراجه بعض الوقت)، يمكنك اختبار الصورة محليًا باستخدام الأمر التالي، الذي سيشغّل حاوية Docker كبرنامج خفي على المنفذ 8080 من صورة الحاوية التي تم إنشاؤها حديثًا:
$ docker run -ti --rm -p 8080:8080 \ gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- مرة أخرى، يمكنك الاستفادة من ميزة معاينة الويب في Cloud Shell.
- من المفترض أن تظهر الصفحة التلقائية في علامة تبويب جديدة. بعد التأكّد من أنّ التطبيق يعمل محليًا في حاوية Docker، يمكنك إيقاف الحاوية التي تعمل بالضغط على
Control+C
.
أنت الآن جاهز لإنشاء مجموعة 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). تتطلّب بقية الخطوات في هذا الدرس البرمجي توفّر الإصدار 1.2 أو إصدار أحدث من برنامج Kubernetes الخادم والعميل. سيعرض لك kubectl version
الإصدار الحالي للأمر.
- يمكن أن ينشئ نشر 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، ولكن لا يزال عليك إتاحته للجمهور.
لا يمكن الوصول إلى Pod تلقائيًا إلا من خلال عنوان IP الداخلي الخاص به داخل المجموعة. لكي تتمكّن من الوصول إلى حاوية hello-java
من خارج شبكة Kubernetes الافتراضية، عليك إتاحة Pod كخدمة Kubernetes.
- في Cloud Shell، يمكنك إتاحة الوصول إلى Pod من خلال الإنترنت المتاح للجميع باستخدام الأمر
kubectl expose
مع العلامة--type=LoadBalancer
. يجب توفُّر العلامة لإنشاء عنوان IP يمكن الوصول إليه خارجيًا.
$ 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
- لاحظ أنّ هناك عنوانَي 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 في نشر إصدار جديد في مرحلة الإنتاج بدون التأثير في المستخدمين.
- افتح محرِّر الرموز من خلال النقر على تشغيل المحرِّر
في قائمة 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
لطلب نشر الإصدار الجديد من تطبيقك على مستوى المجموعة بأكملها، وذلك بمعدّل مثيل واحد في كل مرة مع التحديثات المتتالية.
$ 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 مرة أخرى للتأكّد من أنّه يعرض الردّ الجديد.
عفوًا. هل حدث خطأ في إصدار جديد من التطبيق؟ ربما كان الإصدار الجديد يتضمّن خطأ وعليك التراجع عنه بسرعة. باستخدام Kubernetes، يمكنك إعادة التطبيق إلى حالته السابقة بسهولة. يمكنك التراجع عن التحديث من خلال تنفيذ الأمر التالي:
$ kubectl rollout undo deployment/hello-java
تعرّفت على كيفية إنشاء تطبيق ويب جديد يستند إلى Java ونشره على Kubernetes في GKE.