Istio هي أداة ملائمة للاتصال بالتطبيقات الموزعة وتأمينها ومراقبتها. تستخدم Istio مجموعة متنوعة من التقنيات لتشغيل البرامج وإدارتها على نطاق واسع، بما في ذلك الحاويات لحزم تعليمات التطبيق البرمجية والتبعيات للنشر، وKubernetes لإدارة تلك الحاويات. لذلك، للعمل مع Istio، يجب أن تعرف كيفية عمل تطبيق يحتوي على خدمات متعددة يعتمد على هذه التقنيات بدون إستيو. إذا كانت هذه الأدوات والمفاهيم مألوفة لك بالفعل، فلا تتردد في تخطي هذا البرنامج التعليمي والانتقال مباشرة إلى القسم تثبيت Istio على Google Kubernetes Engine (GKE) أو تثبيت ملحق إستيو على GKE.
هذا دليل خطوة بخطوة حيث سنتعرف على العملية بأكملها بدءًا من الكود المصدري وحتى حاوية GKE لنمنحك فهمًا أساسيًا لهذه التقنيات من خلال مثال. سترى أيضًا كيف يستفيد Istio من قوة هذه التقنيات. يفترض هذا أنك لا تعرف أي شيء عن الحاويات أو Kubernetes أو شبكات الخدمة أو Istio.
المهام
في هذا البرنامج التعليمي، سوف تقوم بإكمال المهام التالية:
في هذا البرنامج التعليمي، يمكنك استخدام Cloud Shell، الذي يقوم بإعداد الجهاز الظاهري g1-small في Google Compute Engine مع Linux المستند إلى Debian، أو كمبيوتر Linux أو macOS.
الخيار أ: استخدام Cloud Shell
فوائد استخدام Cloud Shell:
بيئات تطوير Python 2 وPython 3 (بما في ذلك virtualenv) تم تكوينها بالكامل.
أدوات سطر الأوامر com.gcloud, عامل ميناء, طائرة نفاثة и kubectlوالتي سوف نستخدمها مثبتة بالفعل.
من منظور الشبكات، يعمل التطبيق بأكمله على مضيف واحد (كمبيوتر محلي أو جهاز Cloud Shell الظاهري). لذلك يمكنك استخدام مؤسسة الكوثرلإرسال الطلبات إلى الخادم.
10) التوقف تحميل и الخادم، أدخل السيطرة- ج في كل نافذة طرفية.
11) في النافذة الطرفية تحميل إلغاء تنشيط البيئة الافتراضية:
deactivate
تعبئة الطلب في حاويات
لتشغيل التطبيق على GKE، تحتاج إلى حزم نموذج التطبيق − الخادم и تحميل - في حاويات. الحاوية هي طريقة لحزم تطبيق ما لعزله عن بيئته.
لحزم تطبيق ما في حاوية، تحتاج إلى Dockerfile. Dockerfile هو ملف نصي يحدد الأوامر لبناء الكود المصدري للتطبيق وتبعياته فيه صورة عامل الميناء. بمجرد الإنشاء، يمكنك تحميل الصورة إلى سجل حاوية مثل Docker Hub أو سجل الحاويات.
المثال لديه بالفعل Dockerfile إلى الخادم и تحميل مع كافة الأوامر اللازمة لجمع الصور. أقل - Dockerfile إلى الخادم:
FROM python:3-slim as base
FROM base as builder
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
g++
&& rm -rf /var/lib/apt/lists/*
# Enable unbuffered logging
FROM base as final
ENV PYTHONUNBUFFERED=1
RUN apt-get -qq update
&& apt-get install -y --no-install-recommends
wget
WORKDIR /helloserver
# Grab packages from builder
COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/
# Add the application
COPY . .
EXPOSE 8080
ENTRYPOINT [ "python", "server.py" ]
فريق من بايثون:3-slim كقاعدة يخبر Docker باستخدام الأحدث صورة بايثون 3 كقاعدة.
فريق ينسخ. . نسخ الملفات المصدر إلى دليل العمل الحالي (في حالتنا فقط server.py) إلى نظام ملفات الحاوية.
نقطة الدخول يحدد الأمر المستخدم لبدء الحاوية. في حالتنا، هذا الأمر هو تقريبًا نفس الأمر الذي استخدمته للتشغيل server.py من كود المصدر.
فريق تعرض يدل علي الخادم ينتظر البيانات من خلال المنفذ 8080. هذا الفريق ليس كذلك يوفر المنافذ. هذا نوع من الوثائق المطلوبة لفتح المنفذ 8080 عند بدء الحاوية.
التحضير لحاويات التطبيق الخاص بك
1) قم بتعيين متغيرات البيئة التالية. يستبدل معرف المشروع إلى معرف مشروع Google Cloud Platform الخاص بك.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
باستخدام القيم معرف المشروع и GCR_REPO يمكنك وضع علامة على صورة Docker عند إنشائها ودفعها إلى سجل حاوية خاص.
2) قم بتعيين مشروع GCP الافتراضي لأداة سطر الأوامر com.gcloud.
gcloud config set project $PROJECT_ID
3) قم بتعيين المنطقة الافتراضية لأداة سطر الأوامر com.gcloud.
قم بمراجعة قائمة الصور الموجودة في المستودع وتأكد من تحميل الصور:
gcloud container images list --repository gcr.io/$PROJECT_ID/preparing-istio
يعرض الأمر أسماء الصور التي تم تحميلها حديثًا:
NAME
gcr.io/PROJECT_ID/preparing-istio/helloserver
gcr.io/PROJECT_ID/preparing-istio/loadgen
إنشاء مجموعة GKE.
يمكن تشغيل هذه الحاويات على جهاز ظاهري Cloud Shell أو على جهاز كمبيوتر به الأمر تشغيل عامل ميناء. ولكن في بيئة الإنتاج، تحتاج إلى طريقة لتنسيق الحاويات مركزيًا. على سبيل المثال، تحتاج إلى نظام يتأكد من تشغيل الحاويات دائمًا، وتحتاج إلى طريقة لتوسيع نطاق مثيلات الحاوية الإضافية وتدويرها في حالة زيادة حركة المرور.
لتشغيل التطبيقات الحاوية يمكنك استخدامها حارس مرمى. GKE عبارة عن منصة لتنسيق الحاويات تعمل على تجميع الأجهزة الافتراضية في مجموعة. يُطلق على كل جهاز افتراضي اسم العقدة. تعتمد مجموعات GKE على نظام إدارة مجموعة Kubernetes مفتوح المصدر. يوفر Kubernetes آليات للتفاعل مع المجموعة.
3) الآن يمكنك التواصل مع Kubernetes عبر kubectl. على سبيل المثال، يمكن للأمر التالي معرفة حالة العقد:
kubectl get nodes
ينتج الأمر قائمة بالعقد:
NAME STATUS ROLES AGE VERSION
gke-istoready-default-pool-dbeb23dc-1vg0 Ready <none> 99s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-36z5 Ready <none> 100s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-fj7s Ready <none> 99s v1.13.6-gke.13
gke-istoready-default-pool-dbeb23dc-wbjw Ready <none> 99s v1.13.6-gke.13
المفاهيم الرئيسية لـ Kubernetes
يوضح الرسم البياني تطبيقًا على GKE:
قبل نشر الحاويات في GKE، تعرف على المفاهيم الأساسية لـ Kubernetes. هناك روابط في النهاية إذا كنت تريد معرفة المزيد.
العقد والمجموعات. في GKE، العقدة هي جهاز افتراضي. على منصات Kubernetes الأخرى، يمكن أن تكون العقدة عبارة عن جهاز كمبيوتر أو جهاز افتراضي. المجموعة عبارة عن مجموعة من العقد التي يمكن اعتبارها وحدة واحدة حيث تقوم بنشر تطبيق في حاوية.
القرون. في Kubernetes، تعمل الحاويات في القرون. الكبسولة في Kubernetes هي وحدة غير قابلة للتجزئة. تحتوي الكبسولة على حاوية واحدة أو أكثر. يمكنك نشر حاويات الخادم و تحميل في قرون منفصلة. عندما تكون هناك عدة حاويات في الكبسولة (على سبيل المثال، خادم التطبيق و مخدم بروكسي)، تتم إدارة الحاويات ككيان واحد ومشاركة موارد الكبسولة.
عمليات النشر. في Kubernetes، النشر هو كائن عبارة عن مجموعة من القرون المتطابقة. يقوم النشر بتشغيل نسخ متماثلة متعددة من القرون الموزعة عبر عقد المجموعة. يؤدي النشر تلقائيًا إلى استبدال البودات التي فشلت أو التي لا تستجيب.
خدمة كوبرنيتيس. عند تشغيل كود التطبيق في GKE، يتم الاتصال بين تحميل и الخادم. عندما بدأت الخدمات على جهاز ظاهري أو سطح مكتب Cloud Shell، قمت بإرسال الطلبات إلى الخادم по адресу المضيف المحلي: 8080. بمجرد نشرها في GKE، يتم تنفيذ البودات على العقد المتاحة. بشكل افتراضي، ليس لديك أي سيطرة على العقدة التي تعمل عليها الكبسولة، لذلك أنت القرون لا توجد عناوين IP دائمة.
للحصول على عنوان IP ل الخادم، فأنت بحاجة إلى تحديد تجريد الشبكة أعلى القرون. هذا ما هو عليه خدمة كوبرنيتيس. توفر خدمة Kubernetes نقطة نهاية ثابتة لمجموعة من القرون. هناك عدد قليل أنواع الخدمات. الخادم الاستخدامات LoadBalancer، والذي يوفر عنوان IP خارجي للاتصال الخادم من خارج الكتلة.
يحتوي Kubernetes أيضًا على نظام DNS مدمج يقوم بتعيين أسماء DNS (على سبيل المثال، helloserver.default.cluster.local) خدمات. بفضل هذا، تتواصل القرون الموجودة داخل المجموعة مع القرون الأخرى في المجموعة على عنوان دائم. لا يمكن استخدام اسم DNS خارج المجموعة، كما هو الحال في Cloud Shell أو على جهاز كمبيوتر.
يظهر Kubernetes
عندما قمت بتشغيل التطبيق من المصدر، استخدمت الأمر الحتمي python3
server.py
والأمر يتضمن الفعل: "افعل هذا".
يستخدم كوبيرنيتيس نموذج تصريحي. هذا يعني أننا لا نخبر Kubernetes بما يجب فعله بالضبط، بل نصف الحالة المرغوبة. على سبيل المثال، يقوم Kubernetes بتشغيل وإيقاف البودات حسب الحاجة للحفاظ على الحالة الفعلية للنظام متسقة مع الحالة المطلوبة.
تشير إلى الحالة المطلوبة في البيانات أو الملفات YAML. يحتوي ملف YAML على مواصفات لكائن واحد أو أكثر من كائنات Kubernetes.
يحتوي المثال على ملف YAML لـ الخادم и تحميل. يحدد كل ملف YAML الحالة المطلوبة لكائن النشر وخدمة Kubernetes.
LoadBalancer: يرسل العملاء طلبات إلى عنوان IP الخاص بموازن التحميل، الذي يحتوي على عنوان IP ثابت ويمكن الوصول إليه من خارج المجموعة.
الهدف: كما تتذكرون، الفريق كشف 8080 в Dockerfile لم توفر الموانئ. قمت بتوفير المنفذ 8080حتى تتمكن من الاتصال بالحاوية الخادم خارج الكتلة. في حالتنا هذه hellosvc.default.cluster.local:80 (اسم قصير: hellosvc) يتوافق مع المنفذ 8080 عناوين IP قرنة com.helloserver.
ميناء: هذا هو رقم المنفذ حيث سترسل الخدمات الأخرى في المجموعة الطلبات.
Loadgen.yaml
كائن النشر إلى Loadgen.yaml يبدو مثل server.yaml. الفرق هو أن كائن النشر يحتوي على قسم الحياة الفطرية. فهو يحدد متغيرات البيئة المطلوبة تحميل والتي قمت بتثبيتها عند تشغيل التطبيق من المصدر.
وقت تحميل لا يقبل الطلبات الواردة لهذا المجال نوع غير معروف ClusterIP. يوفر هذا النوع عنوان IP ثابتًا يمكن للخدمات الموجودة في المجموعة استخدامه، لكن عنوان IP هذا لا يتم عرضه للعملاء الخارجيين.
يحل محل معرف المشروع إلى معرف مشروع Google Cloud Platform الخاص بك.
9) حفظ وإغلاق Loadgen.yaml، أغلق محرر النصوص.
10) انشر ملف YAML إلى Kubernetes:
kubectl apply -f loadgen.yaml
عند الانتهاء بنجاح، ينتج الأمر الكود التالي:
deployment.apps/loadgenerator created
service/loadgensvc created
11) التحقق من حالة القرون:
kubectl get pods
يوضح الأمر الحالة:
NAME READY STATUS RESTARTS AGE
helloserver-69b9576d96-mwtcj 1/1 Running 0 58s
loadgenerator-774dbc46fb-gpbrz 1/1 Running 0 57s
12) استخراج سجلات التطبيق من الجراب تحميل. يحل محل POD_ID إلى المعرف من الإجابة السابقة.
kubectl logs loadgenerator-POD_ID
13) الحصول على عناوين IP الخارجية hellosvc:
kubectl get service
تبدو استجابة الأمر كما يلي:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hellosvc LoadBalancer 10.81.15.158 192.0.2.1 80:31127/TCP 33m
kubernetes ClusterIP 10.81.0.1 <none> 443/TCP 93m
loadgensvc ClusterIP 10.81.15.155 <none> 80/TCP 4m52s
14) أرسل طلبًا إلى hellosvc: يستبدل EXTERNAL_IP إلى عنوان IP الخارجي hellosvc.
curl http://EXTERNAL_IP
دعونا نتعامل مع Istio
لديك بالفعل تطبيق منشور على GKE. تحميل يمكن استخدام Kubernetes DNS (هيلوسفك:80) لإرسال الطلبات إلى الخادمويمكنك إرسال الطلبات إلى الخادم عن طريق عنوان IP الخارجي. على الرغم من أن Kubernetes يحتوي على العديد من الميزات، إلا أن هناك بعض المعلومات المفقودة حول الخدمات:
كيف تتفاعل الخدمات؟ ما هي العلاقات بين الخدمات؟ كيف تتدفق حركة المرور بين الخدمات؟ هل أنت على علم بذلك تحميل يرسل الطلبات إلى الخادملكن تخيل أنك لا تعرف أي شيء عن التطبيق. للإجابة على هذه الأسئلة، دعونا نلقي نظرة على قائمة البودات قيد التشغيل في GKE.
المقاييس. حتى متى الخادم يستجيب لطلب وارد؟ كم عدد الطلبات التي يستقبلها الخادم في الثانية؟ هل يعطي رسائل خطأ؟
حماية المعلومات. حركة المرور بين تحميل и الخادم يمر فقط من خلال HTTP او بواسطة mTLS?
يجيب Istio على كل هذه الأسئلة. للقيام بذلك، يضع Istio وكيلًا جانبيًا مبعوث في كل جراب. يعترض وكيل Envoy كافة حركة المرور الواردة والصادرة إلى حاويات التطبيق. هذا يعني انه الخادم и تحميل تلقي عبر وكيل السيارة الجانبية Envoy، وجميع حركة المرور من تحميل к الخادم يمر عبر الوكيل المبعوث.
تشكل الاتصالات بين وكلاء المبعوثين شبكة خدمة. توفر بنية شبكة الخدمة طبقة من التحكم أعلى Kubernetes.
نظرًا لأن وكلاء Envoy يعملون في حاوياتهم الخاصة، يمكن تثبيت Istio أعلى مجموعة GKE دون أي تغييرات تقريبًا على رمز التطبيق. لكنك قمت ببعض الأعمال لتجهيز تطبيقك لتتم إدارته بواسطة Istio:
خدمات لجميع الحاويات. إلى عمليات النشر الخادم и تحميل مرتبطة بخدمة Kubernetes. حتى تحميلوالتي لا تتلقى الطلبات الواردة، هناك خدمة.
يجب أن يكون للمنافذ الموجودة في الخدمات أسماء. على الرغم من إمكانية ترك منافذ الخدمة بدون تسمية في GKE، إلا أن Istio يتطلب منك التحديد اسم المنفذ وفقا للبروتوكول الخاص به. في ملف YAML، المنفذ لـ الخادم ودعا HTTPلأن الخادم يستخدم البروتوكول HTTP... إذا الخدمة مستعمل جي آر بي سي، يمكنك تسمية المنفذ grpc.
تم وضع علامة على عمليات النشر. ولذلك، يمكنك استخدام ميزات إدارة حركة المرور في Istio، مثل تقسيم حركة المرور بين إصدارات نفس الخدمة.
تثبيت
هناك طريقتان لتثبيت Istio. يستطيع تمكين Istio على امتداد GKE أو قم بتثبيت الإصدار المفتوح المصدر من Istio على الكتلة. باستخدام Istio on GKE، يمكنك بسهولة إدارة عمليات تثبيت Istio وترقياتها طوال دورة حياة مجموعة GKE. إذا كنت تريد أحدث إصدار من Istio أو المزيد من التحكم في تكوين لوحة تحكم Istio، فقم بتثبيت الإصدار مفتوح المصدر بدلاً من Istio على ملحق GKE. لاتخاذ قرار بشأن النهج، اقرأ المقال هل أحتاج إلى Istio على GKE؟.
حدد خيارًا، وراجع الدليل المناسب، واتبع الإرشادات لتثبيت Istio على مجموعتك. إذا كنت تريد استخدام Istio مع التطبيق الذي تم نشره حديثًا، تمكين تنفيذ Sidecar لمساحة الاسم الافتراضي.
تنظيف
لتجنب تحصيل رسوم من حساب Google Cloud Platform الخاص بك مقابل الموارد التي استخدمتها في هذا البرنامج التعليمي، احذف مجموعة الحاويات بمجرد تثبيت Istio وتشغيل نموذج التطبيق. سيؤدي هذا إلى إزالة كافة موارد المجموعة، مثل مثيلات الحساب والأقراص وموارد الشبكة.