ایستیو ابزاری مناسب برای اتصال، ایمن سازی و نظارت بر برنامه های کاربردی توزیع شده است. ایستیو از فناوریهای مختلفی برای اجرا و مدیریت نرمافزار در مقیاس استفاده میکند، از جمله کانتینرها برای بستهبندی کد برنامه و وابستگیها برای استقرار، و Kubernetes برای مدیریت آن کانتینرها. بنابراین، برای کار با ایستیو باید بدانید که یک اپلیکیشن با چندین سرویس مبتنی بر این فناوری ها چگونه کار می کند بدون ایستیو. اگر این ابزارها و مفاهیم قبلاً برای شما آشنا هستند، از این آموزش رد شوید و مستقیماً به بخش بروید. نصب Istio در Google Kubernetes Engine (GKE) یا نصب افزونه ایستیو در GKE.
این یک راهنمای گام به گام است که در آن کل فرآیند از کد منبع تا ظرف GKE را طی می کنیم تا از طریق یک مثال به شما درک اساسی از این فناوری ها را ارائه دهیم. همچنین خواهید دید که ایستیو چگونه از قدرت این فناوری ها بهره می برد. این فرض را بر این میگذارد که شما چیزی در مورد کانتینرها، Kubernetes، مشهای سرویس یا Istio نمیدانید.
وظایف
در این آموزش، شما وظایف زیر را انجام خواهید داد:
آموزش اپلیکیشن hello world ساده با چندین سرویس.
برنامه را از روی کد منبع اجرا کنید.
بسته بندی برنامه در ظروف.
ایجاد یک خوشه Kubernetes
استقرار کانتینرها در یک خوشه
قبل از اینکه تو شروع کنی
برای فعال کردن Kubernetes Engine API دستورالعمل ها را دنبال کنید:
در این آموزش می توانید از Cloud Shell که ماشین مجازی را آماده می کند استفاده کنید g1-small در موتور محاسباتی گوگل با لینوکس مبتنی بر دبیان یا رایانه لینوکس یا macOS.
گزینه A: استفاده از Cloud Shell
مزایای استفاده از Cloud Shell:
محیط های توسعه پایتون 2 و پایتون 3 (از جمله مجازی) به طور کامل پیکربندی شده اند.
ابزارهای خط فرمان gcloud, داکتر, دستگاه گوارش и کوبکتل، که ما استفاده خواهیم کرد قبلاً نصب شده اند.
برنامه نمونه به زبان پایتون نوشته شده است و از دو مؤلفه تشکیل شده است که با استفاده از آن تعامل دارند REST:
سرور: سرور ساده با یک نقطه پایانی گرفتن، /، که "سلام جهان" را روی کنسول چاپ می کند.
بارگذار: اسکریپتی که ترافیک را به سرور، با تعداد قابل تنظیم درخواست در ثانیه.
اجرای برنامه از روی کد منبع
برای کاوش نمونه برنامه، آن را در Cloud Shell یا در رایانه خود اجرا کنید.
1) در کاتالوگ istio-samples/sample-apps/helloserver اجرا کن سرور:
python3 server/server.py
در هنگام راه اندازی سرور زیر نمایش داده می شود:
INFO:root:Starting server...
2) پنجره ترمینال دیگری را برای ارسال درخواست باز کنید سرور. اگر از Cloud Shell استفاده می کنید، روی نماد افزودن کلیک کنید تا جلسه دیگری باز شود.
3) درخواست را به سرور:
curl http://localhost:8080
پاسخ سرور:
Hello World!
4) از دایرکتوری که نمونه کد را دانلود کرده اید، به دایرکتوری که حاوی آن است بروید بارگذار:
cd YOUR_WORKING_DIRECTORY/istio-samples/sample-apps/helloserver/loadgen
از دیدگاه شبکه، کل برنامه بر روی یک هاست (رایانه محلی یا ماشین مجازی Cloud Shell) اجرا می شود. بنابراین می توانید استفاده کنید localhost رابرای ارسال درخواست ها به سرور.
10) توقف کردن بارگذار и سرور، وارد Ctrl-c در هر پنجره ترمینال
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" ]
تیم FROM python: 3-slim به عنوان پایه به داکر می گوید که از جدیدترین ها استفاده کند تصویر پایتون 3 به عنوان پایه
تیم کپی 🀄. . فایل های منبع را در فهرست کاری فعلی کپی می کند (فقط در مورد ما server.py) به سیستم فایل کانتینر.
نقطه ورود دستوری را که برای راه اندازی کانتینر استفاده می شود را تعریف می کند. در مورد ما، این دستور تقریباً مشابه دستوری است که قبلاً اجرا می کردید server.py از کد منبع
تیم در معرض گذاشتن نشان میدهد که سرور منتظر اطلاعات از طریق پورت است 8080. این تیم نیست پورت ها را فراهم می کند. این نوعی از اسنادی است که برای باز کردن پورت مورد نیاز است 8080 هنگام راه اندازی ظرف
در حال آماده شدن برای کانتینری کردن برنامه شما
1) متغیرهای محیطی زیر را تنظیم کنید. جایگزین کردن PROJECT_ID به شناسه پروژه GCP شما.
export PROJECT_ID="PROJECT_ID"
export GCR_REPO="preparing-istio"
استفاده از ارزش ها PROJECT_ID и GCR_REPO هنگام ساختن تصویر داکر را تگ می کنید و آن را به یک رجیستری کانتینر خصوصی فشار می دهید.
2) پروژه پیش فرض GCP را برای ابزار خط فرمان تنظیم کنید gcloud.
gcloud config set project $PROJECT_ID
3) منطقه پیش فرض را برای ابزار خط فرمان تنظیم کنید gcloud.
gcloud config set compute/zone us-central1-b
4) مطمئن شوید که سرویس Container Registry در پروژه GCP فعال است.
لیست تصاویر موجود در مخزن را مرور کنید و بررسی کنید که تصاویر آپلود شده اند:
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 یا روی رایانه با دستور اجرا کرد دكتر اجرا كننده. اما در یک محیط تولید، شما به راهی برای هماهنگی مرکزی کانتینرها نیاز دارید. به عنوان مثال، شما به سیستمی نیاز دارید که اطمینان حاصل کند که کانتینرها همیشه در حال اجرا هستند، و به روشی نیاز دارید تا در صورت افزایش ترافیک، نمونههای کانتینر اضافی را افزایش دهید و بچرخانید.
برای اجرای برنامه های کانتینری می توانید از آن استفاده کنید G.K.E.. GKE یک پلت فرم ارکستراسیون کانتینری است که ماشین های مجازی را در یک خوشه جمع می کند. هر ماشین مجازی یک گره نامیده می شود. خوشه های GKE بر اساس سیستم مدیریت خوشه منبع باز Kubernetes هستند. Kubernetes مکانیسم هایی را برای تعامل با خوشه فراهم می کند.
تیم gcloud یک خوشه istioready در پروژه GCP و منطقه پیش فرضی که شما مشخص کرده اید ایجاد می کند. برای اجرای ایستیو توصیه می کنیم حداقل 4 نود و یک ماشین مجازی داشته باشید n1-استاندارد-2.
تیم در چند دقیقه خوشه را ایجاد می کند. وقتی خوشه آماده شد، فرمان چیزی شبیه به این را خروجی می دهد сообщение.
2) اعتبار را در ابزار خط فرمان ارائه کنید کوبکتلبرای استفاده از آن برای مدیریت خوشه:
3) اکنون می توانید با Kubernetes از طریق ارتباط برقرار کنید کوبکتل. به عنوان مثال، دستور زیر می تواند وضعیت گره ها را دریابد:
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، ظروف در غلاف اجرا می شوند. یک Pod در Kubernetes یک واحد تقسیم ناپذیر است. یک Pod یک یا چند ظرف را در خود جای می دهد. شما کانتینرهای سرور و بارگذار در غلاف های جداگانه هنگامی که چندین کانتینر در یک پاد وجود دارد (به عنوان مثال، یک سرور برنامه و سرور پروکسی، کانتینرها به عنوان یک موجودیت واحد مدیریت می شوند و منابع غلاف را به اشتراک می گذارند.
استقرارها. در Kubernetes، Deployment یک شی است که مجموعه ای از pods یکسان است. Deployment چندین کپی از غلاف ها را راه اندازی می کند که در گره های خوشه ای توزیع شده اند. استقرار به طور خودکار پادهایی را جایگزین میکند که از کار افتاده یا پاسخگو نیستند.
سرویس Kubernetes. هنگام اجرای کد برنامه در GKE، ارتباط بین بارگذار и سرور. هنگامی که خدمات را در ماشین مجازی یا دسکتاپ Cloud Shell شروع کردید، درخواستهایی را به آن ارسال کردید سرور توسط آدرس localhost: 8080. پس از استقرار در GKE، پادها بر روی گره های موجود اجرا می شوند. بهطور پیشفرض، هیچ کنترلی روی گرهای که غلاف روی کدام گره اجرا میشود، ندارید، بنابراین شما غلاف ها بدون آدرس IP دائمی
برای به دست آوردن آدرس IP برای سرور، باید یک انتزاع شبکه در بالای پادها تعریف کنید. همین است سرویس Kubernetes. سرویس Kubernetes یک نقطه پایانی پایدار برای مجموعهای از pods فراهم میکند. مقدار کمی وجود دارد انواع خدمات. سرور استفاده می کند متعادل کننده بار، که یک آدرس IP خارجی برای تماس فراهم می کند سرور از خارج از خوشه
Kubernetes همچنین دارای یک سیستم DNS داخلی است که نام های DNS را اختصاص می دهد (به عنوان مثال، helloserver.default.cluster.local) خدمات. به همین دلیل، غلافهای درون خوشه با سایر غلافهای خوشه در یک آدرس دائمی ارتباط برقرار میکنند. نام DNS را نمی توان در خارج از خوشه، مانند Cloud Shell یا رایانه استفاده کرد.
Kubernetes آشکار می شود
هنگامی که برنامه را از منبع اجرا می کردید، از دستور امری استفاده می کردید python3
server.py
امری مستلزم یک فعل است: "این را انجام بده".
Kubernetes استفاده می کند مدل اعلامی. این بدان معنی است که ما دقیقاً به کوبرنتیس نمی گوییم که چه کاری انجام دهد، بلکه وضعیت مطلوب را توصیف می کنیم. به عنوان مثال، Kubernetes در صورت نیاز، پادها را شروع و متوقف می کند تا مطمئن شود که وضعیت واقعی سیستم با وضعیت مطلوب مطابقت دارد.
شما وضعیت مورد نظر را در مانیفست ها یا فایل ها نشان می دهید یامل. یک فایل YAML حاوی مشخصات یک یا چند شی Kubernetes است.
مثال حاوی یک فایل YAML برای سرور и بارگذار. هر فایل YAML وضعیت مطلوب شیء استقرار و سرویس Kubernetes را مشخص می کند.
بخش spec.template قالب پاد را تعریف می کند. یک فیلد در مشخصات غلاف وجود دارد تصویر، که نام تصویری را که باید از Container Registry استخراج شود مشخص می کند.
متعادل کننده بار: مشتریان درخواستها را به آدرس IP متعادلکننده بار ارسال میکنند که آدرس IP ثابتی دارد و از خارج از خوشه قابل دسترسی است.
targetPort: همانطور که به یاد دارید، تیم EXPOSE 8080 в dockerfile پورت ها را ارائه نکرد. شما پورت را ارائه می دهید 8080تا بتوانید با ظرف تماس بگیرید سرور خارج از خوشه در مورد ما hellosvc.default.cluster.local:80 (نام کوتاه: hellosvc) مربوط به پورت است 8080 آدرس های IP پاد سلام سرور.
بندر: این شماره پورتی است که سایر خدمات در خوشه درخواست ها را در آنجا ارسال می کنند.
loadgen.yaml
هدف استقرار به loadgen.yaml شبیه server.yaml. تفاوت این است که شی استقرار شامل یک بخش است env. متغیرهای محیطی مورد نیاز را تعریف می کند بارگذار و هنگام اجرای برنامه از منبع آن را نصب کرده اید.
زمان بارگذار درخواست های ورودی را برای این زمینه نمی پذیرد نوع نشان داده شده است ClusterIP. این نوع یک آدرس IP دائمی را ارائه می دهد که خدمات در خوشه می توانند از آن استفاده کنند، اما این آدرس IP در معرض مشتریان خارجی قرار نمی گیرد.
جایگزین کردن PROJECT_ID به شناسه پروژه GCP شما.
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
بیایید به ایستیو بپردازیم
شما قبلاً یک برنامه کاربردی در GKE دارید. بارگذار می توانید از Kubernetes DNS استفاده کنید (hellosvc:80) برای ارسال درخواست به سرورو می توانید درخواست ها را به سرور توسط آدرس IP خارجی اگرچه Kubernetes دارای ویژگی های بسیاری است، اما برخی از اطلاعات در مورد خدمات گم شده است:
خدمات چگونه تعامل دارند؟ چه روابطی بین خدمات وجود دارد؟ چگونه ترافیک بین سرویس ها جریان دارد؟ آیا شما آگاه هستید که بارگذار درخواست ها را ارسال می کند سرور، اما تصور کنید که چیزی در مورد برنامه نمی دانید. برای پاسخ به این سؤالات، بیایید به لیست پادهای در حال اجرا در GKE نگاه کنیم.
معیارهای. چه مدت سرور به درخواست دریافتی پاسخ می دهد؟ در هر ثانیه چند درخواست توسط سرور دریافت می شود؟ پیغام خطا میده؟
اطلاعات امنیتی. ترافیک بین بارگذار и سرور فقط می گذرد HTTP یا توسط mTLS?
ایستیو به همه این سوالات پاسخ می دهد. برای انجام این کار، Istio یک پراکسی sidecar قرار می دهد فرستاده در هر غلاف پروکسی Envoy تمام ترافیک ورودی و خروجی به کانتینرهای برنامه را رهگیری می کند. این به آن معنا است سرور и بارگذار دریافت از طریق پراکسی sidecar Envoy، و تمام ترافیک از بارگذار к سرور از طریق پروکسی فرستاده می رود.
اتصالات بین پروکسی های Envoy یک شبکه خدماتی را تشکیل می دهند. معماری مش سرویس لایه ای از کنترل را در بالای Kubernetes فراهم می کند.
از آنجایی که پروکسیهای Envoy در کانتینرهای خود اجرا میشوند، ایستیو را میتوان در بالای یک خوشه GKE نصب کرد و تقریباً هیچ تغییری در کد برنامه ایجاد نشد. اما شما کارهایی را انجام داده اید تا برنامه خود را برای مدیریت ایستیو آماده کنید:
خدمات برای تمامی کانتینرها به استقرارها سرور и بارگذار به سرویس Kubernetes گره خورده است. زوج بارگذار، که درخواست های دریافتی را دریافت نمی کند، یک سرویس وجود دارد.
پورت های موجود در سرویس ها باید دارای نام باشند. اگرچه پورت های سرویس را می توان بدون نام در GKE رها کرد، ایستیو از شما می خواهد که مشخص کنید نام پورت مطابق پروتکل او در فایل YAML پورت برای سرور نامیده می شود HTTPزیرا سرور از پروتکل استفاده می کند HTTP... اگر سرویس استفاده شده gRPCپورت را نام ببرید grpc.
استقرارها پرچم گذاری شده اند. بنابراین، می توانید از ویژگی های مدیریت ترافیک ایستیو مانند تقسیم ترافیک بین نسخه های همان سرویس استفاده کنید.
نصب و راه اندازی
دو راه برای نصب ایستیو وجود دارد. می توان Istio را در پسوند GKE فعال کنید یا نسخه متن باز ایستیو را نصب کنید روی خوشه با Istio در GKE، می توانید به راحتی نصب و ارتقاء Istio را در طول چرخه عمر خوشه GKE مدیریت کنید. اگر میخواهید آخرین نسخه Istio یا کنترل بیشتری بر پیکربندی کنترل پنل Istio خود داشته باشید، نسخه منبع باز را به جای افزونه Istio در GKE نصب کنید. برای تصمیم گیری در مورد رویکرد، مقاله را بخوانید آیا به Istio در GKE نیاز دارم؟.
یک گزینه را انتخاب کنید، راهنمای مناسب را مرور کنید و دستورالعملهای نصب Istio را در کلاستر خود دنبال کنید. اگر می خواهید از Istio با برنامه جدید خود استفاده کنید، پیاده سازی sidecar را فعال کنید برای فضای نام به طور پیش فرض.
تمیز کردن
برای جلوگیری از کسر هزینه به حساب Google Cloud Platform شما بابت منابعی که در این آموزش استفاده کرده اید، پس از نصب Istio و بازی با برنامه نمونه، دسته کانتینر را حذف کنید. این همه منابع خوشه مانند نمونه های محاسباتی، دیسک ها و منابع شبکه را حذف می کند.