این یک پست مهمان از Docker Captain التون استونمن ، فارغ التحصیلان داکر است که هم اکنون مشاور و مربی آزاد است و به سازمان ها در همه مراحل سفر خود در کانتینر کمک می کند. التون نویسنده کتاب Learn Docker در یک ماه ناهار ، و تعداد زیادی Pluralsight دوره های آموزش تصویری – از جمله مدیریت برنامه ها در Kubernetes با Istio و [19659004] نظارت بر بهداشت برنامه کاربردی Containerized with Docker .
Istio یک مش سرویس است – یک جزء نرم افزاری است که در ظروف همراه با ظروف کاربردی شما اجرا می شود و کنترل ترافیک شبکه بین اجزا را کنترل می کند. این یک معماری قدرتمند است که به شما امکان می دهد ارتباط بین مؤلفه ها را به طور مستقل از خود اجزاء مدیریت کنید. این مفید است زیرا کد و پیکربندی موجود در برنامه شما را ساده می کند ، و تمام نگرانی های زیرساخت سطح شبکه مانند مسیریابی ، توازن بار ، مجوز و نظارت را از بین می برد – که همه در Istio به صورت مرکزی اداره می شوند.
مطالب خوبی برای حفاری وجود دارد. به اتیو همکار من Docker Captain Le Calcote نویسنده مؤسسه Istio: Up and Running است ، و من فقط دوره Pluralsight خود را که مدیریت برنامه ها در Kubernetes با Istio است منتشر کرده ام. اما می توان این یک فناوری دشوار را برای شروع کار دانست زیرا شما واقعاً قبل از اینکه خیلی دور شوید ، به یک زمینه مستحکم در کوبننتس احتیاج دارید. در این پست ، سعی خواهم کرد آنرا ساده نگه دارم. من بر روی سه سناریو که Istio را فعال می کند ، تمرکز می کنم و تنها کاری که باید دنبال کنید ، Docker Desktop است.
تنظیم
Docker Desktop یک محیط کامل Kubernetes را در لپ تاپ شما فراهم می کند. فقط نسخه Mac یا Windows را نصب کنید – اگر از Windows استفاده می کنید به ظروف Linux بروید – سپس تنظیمات را از نماد نهنگ Docker باز کنید ، و Enable Kubernetes را در بخش Kubernetes انتخاب کنید. همچنین باید مقدار حافظه Docker را افزایش دهید ، زیرا Istio و برنامه نسخه ی نمایشی از مقدار کمی استفاده می کنند – در بخش Resources کشویی حافظه را به حداقل 6 گیگابایت افزایش می دهد.
اکنون گرفتن. کد نمونه این پست وبلاگ ، که در repo GitHub من است:
git clone https://github.com/sixeyed/istio-samples.git
نمونه های cd istio
این repo مجموعه ای از مظاهر Kubernetes را دارد که Istio و برنامه نسخه ی نمایشی را مستقر می کند ، که یک وب سایت کتابفروشی ساده است (این برنامه نسخه ی نمایشی تیم Istio است ، اما من از روش های مختلفی استفاده می کنم بنابراین حتما از repo من استفاده کنید. برای دنبال کردن) همه چیز را با استفاده از ابزار کنترل کوبرنت (Kubernetes) ، که به عنوان بخشی از دکر دسک تاپ نصب شده است ، مستقر کنید:
kubectl اعمال --f ./setup/roulette19659018ihen شما می توانید ده ها خط خروجی را مشاهده کنید زیرا Kubernetes تمام مؤلفه های Istio را به همراه ایجاد می کند. برنامه نسخه ی نمایشی - که همه در ظروف داکر اجرا می شود. چند بار طول می کشد تا تمام تصاویر از داکر هاب بارگیری شود ، و می توانید وضعیت را با استفاده از kubectl بررسی کنید:
# Istio - هنگام اجرای کامل "1" در ستون "READY" خواهد داشت:
kubectl get مستقر در istio-system
# برنامه نسخه ی نمایشی - هنگام اجرای کامل "2/2" در ستون "آماده" خواهد داشت:
kubectl غلاف دریافت کنید
پس از آماده شدن همه بیت ها ، به http: // localhost / pagepage بروید و این نسخه آزمایشی بسیار ساده را خواهید دید:
و شما خوب هستید که بروید. اگر خوشحال هستید که با پرونده های YAML Kubernetes کار می کنید ، می توانید به گزینه استقرار برنامه نمایشی نگاه کنید ، و همه منابع استاندارد Kubernetes را مشاهده خواهید کرد - خدمات ، حساب های خدمات و استقرار. Istio در حال مدیریت ارتباطات برای برنامه است ، اما ما هنوز پیکربندی های Istio را مستقر نکرده ایم ، بنابراین هنوز کارهای زیادی انجام نمی شود.
برنامه نسخه ی نمایشی یک برنامه توزیع شده است. صفحه اصلی در یک ظرف اجرا می شود و از داده های REST API که در ظروف دیگر اجرا می شود ، استفاده می کند. جزئیات کتاب و بررسی کتاب که در صفحه مشاهده می کنید از سایر ظروف گرفته شده است. Istio مدیریت ترافیک شبکه بین این مؤلفه ها را کنترل می کند ، و همچنین ترافیک خارجی را که وارد Kubernetes می شود و به صفحه اصلی مدیریت می کند.
ما برای کشف ویژگی های اصلی Istio از این برنامه نمایشی استفاده خواهیم کرد: مدیریت ترافیک ، امنیت و مشاهده پذیری.
مدیریت ترافیک - استقرار قناری با Istio
صفحه اصلی خسته کننده است ، بنابراین بیایید آن را با یک نسخه جدید زنده کنیم. ما می خواهیم نسخه ای مرحله ای را انجام دهیم تا بتوانیم نحوه دریافت به روزرسانی را بررسی کنیم و Istio هم از استقرار آبی و سبز و قناری پشتیبانی می کند. استقرار قناری عموماً مفیدتر است و این همان چیزی است که ما استفاده خواهیم کرد. ما دو نسخه از صفحه اصلی در حال اجرا خواهیم داشت ، و Istio بخشی از ترافیک را به نسخه 1 و مابقی آن را به نسخه 2 ارسال می کند:
ما برای کشف خدمات و مسیریابی در اینجا از Istio استفاده می کنیم: همه ترافیک های ورودی می آیند. ما وارد Istio می شویم و می خواهیم قوانینی را برای چگونگی انتقال این ترافیک به مؤلفه صفحه محصول تنظیم کنیم. ما این کار را با استفاده از یک VirtualService که یک منبع سفارشی Istio است انجام می دهیم. حاوی این قانون مسیریابی برای ترافیک HTTP:
دروازه جزء Istio است که ترافیک خارجی را دریافت می کند. هدف bookinfo-gateway برای گوش دادن به کلیه ترافیک های HTTP تنظیم شده است ، اما می توان آن را به درگاهها و نامهای میزبان خاص محدود کرد ؛
مقصد هدف واقعی که در آن مسیر عبور و مرور خواهد شد (که می تواند باشد متفاوت از نام دامنه درخواستی). در این حالت ، دو زیر مجموعه وجود دارد ، v1 که 70٪ از ترافیک و v2 را دریافت می کنند که 30٪ دریافت می کند ؛
آن زیرمجموعه های در یک موضوع DestinationRule تعریف شده اند ، که از برچسب های Kubernetes برای شناسایی غلاف درون استفاده می کند. یک خدمت. در این حالت ، زیر مجموعه v1 غلافهایی با نسخه label = v1 پیدا می کند ، و زیر مجموعه v2 غلاف هایی با نسخه label = v2 پیدا می کند.
به نظر می رسد پیچیده است ، اما تمام آنچه که در واقع انجام می دهد تعیین قوانین برای تغییر ترافیک بین غلاف های مختلف است. این تعاریف در Kubernetes فایل های YAML را نشان می دهد ، که شما به همان روشی که برنامه های شما در آن قرار دارید ، استفاده می کنید. بنابراین می توانیم با استفاده از قایق قاری نسخه 2 را با یک دستور واحد انجام دهیم - این غلاف جدید v2 را به همراه قوانین مسیریابی Istio ایجاد می کند:
# مستقر:
kubectl اعمال -f ./canary-deployment
# استقرار را بررسی کنید - خوب است وقتی همه غلاف ها "2/2" را در "READY" نشان دهند:
kubectl get غلاف
اکنون اگر چند بار نسخه ی نمایشی کتاب فروشی را تازه کنید ، خواهید دید که بیشترین پاسخ ها همان صفحه V1 خسته کننده هستند ، اما چند بار خوش شانس صفحه v2 را مشاهده خواهید کرد که نتیجه آن است از آزمایش تجربه کاربر بسیار زیاد:
با توجه به اینکه بازخورد مثبت در شما چرخیده می شود ، می توانید با تغییر وزن در تعریف VirtualService و استفاده مجدد ، میزان ترافیک به v2 را افزایش دهید. هر دو نسخه برنامه شما در مرحله قناری اجرا می شوند ، بنابراین وقتی ترافیک را تغییر می دهید ، آنرا به مؤلفه هایی که از قبل آماده هستند و برای ترافیک آماده هستند ، ارسال می کنید ، بنابراین تأخیر اضافی از غلاف های جدید وجود نخواهد داشت. [19659013] استقرار قناری ها فقط یكی از جنبه های مدیریت ترافیک است که Istio ساده می کند. شما می توانید کارهای دیگری انجام دهید ، از جمله اضافه کردن تحمل خطا با استفاده مجدد از مدارها و قطع کننده های مدار ، همه با مؤلفه های Istio و بدون هیچ گونه تغییری در برنامه های خود.
امنیت ترافیک - احراز هویت و مجوز با mTLS
Istio همه ترافیک شبکه را بین اجزای شما با شفافیت بدون اینکه خود مؤلفه ها بدانند که این دخالت می کند. این کار را با اجرای کلیه ترافیک ظرف برنامه از طریق یک پروکسی شبکه انجام می دهد ، که قوانین Istio را اعمال می کند. ما دیدیم که چگونه می توانید از آن برای مدیریت ترافیک استفاده کنید ، همچنین برای امنیت نیز کار می کند.
اگر به ترانزیت بین اجزای برنامه نیاز دارید رمزگذاری کنید ، و می خواهید قوانین دسترسی را اعمال کنید تا فقط برخی از مصرف کنندگان بتوانند از خدمات تماس بگیرند ، می توانید از طریق ISI این کار را برای شما هم انجام دهید می توانید کد برنامه و پیکربندی خود را ساده نگه دارید ، از HTTP اولیه غیرمستقیم استفاده کنید و سپس امنیت را در سطح شبکه اعمال کنید.
احراز هویت و مجوز ویژگی های امنیتی Istio است که بسیار آسان تر از آنچه توضیح می دهد استفاده می شود. نمودار نحوه چگونگی قرارگیری قطعات در کنار هم آورده شده است:
در اینجا قسمت صفحه محصول در سمت چپ از API REST از مؤلفه بررسی در سمت راست استفاده می کند. این اجزاء در غلاف های Kubernetes اجرا می شوند ، و می بینید که هر غلاف دارای یک ظرف Docker برای برنامه و یک ظرف Docker دوم است که پروکسی Istio را اجرا می کند ، که ترافیک شبکه را برای برنامه به عهده دارد.
این مجموعه از رمزگذاری های متقابل TLS استفاده می کند. ترافیک HTTP و تأیید اعتبار و مجوز تماس گیرنده:
هدف خط مشی تأیید اعتبار اعمال شده در سرویس ، TLS متقابل را می طلبد ، به این معنی که پروکسی سرویس در پورت 443 برای ترافیک HTTPS گوش می کند ، حتی اگر این سرویس فقط برای گوش دادن به درگاه تنظیم شده است. 80 برای ترافیک HTTP ؛
هدف AutizationPolicy که برای سرویس اعمال می شود ، به سایر مؤلفه ها اجازه دسترسی را مشخص می کند. در این حالت ، همه چیز از دسترسی محروم می شود ، به جز مؤلفه صفحه محصول که دسترسی به HTTP GET مجاز است ؛
هدف DestinationRule برای متقابل TLS پیکربندی شده است ، به این معنی که پروکسی برای مؤلفه صفحه محصول ، تماسهای HTTP را به HTTPS ارتقا می دهد ، بنابراین هنگامی که برنامه به مؤلفه بررسی مراجعه کند ، این یک مکالمه متقابل TLS خواهد بود.
Mutual-TLS بدان معنی است که مشتری برای شناسایی خود یک گواهی ارائه می دهد ، همچنین سرویس ارائه گواهی رمزگذاری (فقط گواهی سرور استاندارد است. رفتار HTTPS). Istio می تواند تمام آن گواهینامه ها را تولید و مدیریت کند ، که بار سنگینی را از استقرار نرمال mTLS برداشته است.
چیزهای زیادی در آنجا وجود دارد ، اما استقرار و مدیریت همه چیز بسیار ساده است ، این فقط روند kubectl است:
kubectl اعمال -f ./service-authorization/
Istio از حساب سرویس Kubernetes برای شناسایی استفاده می کند ، و می بینید وقتی برنامه را امتحان می کنید که هیچ چیز تغییر نکرده است ، همه مانند گذشته کار می کند. تفاوت این است که هیچکدام از مؤلفه های دیگر که در این خوشه فعال هستند اکنون نمی توانند به بخش بررسی دسترسی پیدا کنند ، API قفل شده است ، بنابراین فقط صفحه محصول می تواند آن را مصرف کند.
شما می توانید با اتصال به یک ظرف دیگر تأیید کنید - جزء جزئیات در حال اجرا است. در همان خوشه سعی کنید API را از محتویات جزئیات استفاده کنید:
docker enet -it $ exec (docker konten ls - name name = k8s_details - format '{{.ID}}' sh)
حلقه http: // بررسی ها: 9080/1
خطایی مشاهده خواهید کرد - RBAC: دسترسی رد شد ، که Istio است که سیاست مجاز را اجرا می کند. این چیزهای قدرتمندی است ، به خصوص داشتن Istio برای مدیریت گواهینامه ها برای شما. دارای گواهینامه هایی با طول عمر کوتاه است ، بنابراین حتی اگر آنها به خطر بیفتند ، مدت طولانی قابل استفاده نیستند. همه اینها بدون پیچیده کردن کد برنامه شما یا برخورد با گواهینامه های خود امضا شده.
مشاهده: مشاهده تصویر سرویس مش با کالی
کلیه ترافیک شبکه از طریق Istio انجام می شود ، به این معنی که می تواند تمام ارتباطات را کنترل و ضبط کند. Istio از یک معماری قابل اتصال برای ذخیره سازی telemetry استفاده می کند ، که از سیستم های استاندارد مانند Prometheus و Elasticsearch پشتیبانی می کند.
جمع آوری و ذخیره تلفن از راه دور برای هر تماس تلفنی می تواند گران باشد ، بنابراین این همه قابل تنظیم است. استقرار Istio که ما از آن استفاده می کنیم پیکربندی نسخه ی نمایشی است ، که از راه دور تنظیم شده است و بنابراین می توانیم آن را امتحان کنیم. داده های Telemetry از پروکسی های سرویس به مؤلفه Istio به نام Mixer ارسال می شود ، که می تواند آن را به فروشگاه های مختلف back-end ارسال کند ، در این حالت Prometheus:
(این نمودار یک ساده سازی است - Prometheus در واقع داده ها را از Istio می کشد. ، و می توانید برای نمونه گیری از Istio و برنامه های کاربردی خود ، از یک نمونه Prometheus استفاده کنید.)
داده ها در Prometheus شامل کدهای پاسخ و مدت زمان پاسخگویی است ، و Istio با مجموعه ای از داشبورد Grafana شما می توانید از آن استفاده کنید تا در معیارها قرار بگیرید. . و همچنین از ابزاری عالی به نام Kiali پشتیبانی می کند ، که تجسم بسیار خوبی از کلیه خدمات شما و ترافیک شبکه بین آنها می دهد.
Kiali در حال حاضر در استقرار نسخه ی نمایشی در حال اجرا است ، اما به طور پیش فرض منتشر نمی شود. با استفاده از یک دروازه و یک VirtualService می توانید دسترسی پیدا کنید:
kubectl اعمال -f ./visualization-kiali/
اکنون برنامه را چند بار در http: // localhost / pagepage محصولات تازه کنید و سپس تجسم مش سرویس در Kiali را در آدرس http: // localhost: 15029 بررسی کنید. با نام کاربری admin و رمز عبور admin وارد شوید ، سپس در نمای Graph مرور کنید و ترافیک زنده را برای برنامه کتابفروشی مشاهده کنید:
من در اینجا برچسب های "درصد درخواست" را روشن کرده ام ، و می بینم تقسیم ترافیک بین نسخه های صفحه محصولات من 67٪ تا 34٪ است ، که تقریباً به وزن 70-30 من نزدیک است (هرچه تعداد ترافیک بیشتری داشته باشید ،
Kiali تنها یکی از ابزارهای مشاهده ای است که Istio از آن پشتیبانی می کند. استقرار نسخه ی نمایشی همچنین Grafana را با چند داشبورد و Jaeger برای ردیابی توزیع شده اجرا می کند - که ابزاری بسیار قدرتمند برای تشخیص مشکلات مربوط به تأخیر در برنامه های توزیع شده است. تمام داده ها برای تأمین انرژی این تجسم ها به طور خودکار توسط Istio جمع آوری می شود.
Wrap-Up
یک مش سرویس باعث می شود تا لایه ارتباطی برنامه برای برنامه شما به یک نهاد جداگانه تبدیل شود ، که شما می توانید بصورت مرکزی و مستقل از خود برنامه کنترل کنید. Istio کاملاً پرمصرف ترین سرویس خدماتی است که در حال حاضر وجود دارد ، اگرچه Linkerd نیز وجود دارد (که تمایل به عملکرد پایه بهتر دارد) ، و پروژه Service Mesh Interface (که هدف آن استاندارد سازی ویژگی های مش است) است.
استفاده از مش سرویس با هزینه ای همراه است - هزینه میزبانی برای میزبانی محاسبات اضافی برای پراکسی ها و هزینه های سازمانی برای به دست آوردن تیم های ماهر در Istio وجود دارد. اما سناریوهایی که آن را فعال می کند از قیمت بسیاری از افراد بیشتر است و شما می توانید خیلی سریع تست کنید که آیا Istio برای شما مناسب است ، با استفاده از آن با برنامه های خود در Docker Desktop.