استقرار قناری با استفاده از Jenkins-X Istio Flagger
ما استقرار Canary را به صورت دستی از طریق GitOps و ایجاد/تغییر منابع اصلی Kubernetes انجام خواهیم داد. این مقاله در درجه اول برای معرفی در نظر گرفته شده است با نحوه استقرار در Kubernetes Canary، زیرا روشهای مؤثرتری برای اتوماسیون وجود دارد که در مقالات بعدی به بررسی آنها خواهیم پرداخت.
با استراتژی قناری، بهروزرسانیها ابتدا فقط برای زیرمجموعهای از کاربران اعمال میشوند. از طریق نظارت، دادههای گزارش، آزمایش دستی یا سایر کانالهای بازخورد، نسخه قبل از انتشار برای همه کاربران آزمایش میشود.
استقرار Kubernetes (به روز رسانی در حال چرخش)
استراتژی پیشفرض برای Kubernetes Deployment، بهروزرسانی رولینگ است، که در آن تعداد مشخصی از پادها با نسخههای جدید تصاویر راهاندازی میشوند. اگر آنها بدون مشکل ایجاد شده باشند، غلاف هایی با نسخه های قدیمی تصاویر خاتمه می یابند و غلاف های جدید به صورت موازی ایجاد می شوند.
GitOps
ما در این مثال از GitOps استفاده می کنیم زیرا:
استفاده از Git به عنوان منبعی واحد از حقیقت
ما از Git Operations برای ساخت و استقرار استفاده می کنیم (هیچ دستوری به جز git tag/merge مورد نیاز نیست)
مثال
بیایید یک تمرین خوب داشته باشیم - یک مخزن برای کد برنامه و یکی برای زیرساخت داشته باشیم.
مخزن برنامه
این یک API بسیار ساده Python+Flask است که پاسخی را به صورت JSON برمیگرداند. ما بسته را از طریق GitlabCI می سازیم و نتیجه را به رجیستری Gitlab منتقل می کنیم. در رجیستری ما دو نسخه انتشار متفاوت داریم:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
تنها تفاوت بین آنها تغییر در فایل JSON برگشتی است. ما از این برنامه برای تجسم به آسان ترین شکل ممکن استفاده می کنیم که با کدام نسخه در حال ارتباط هستیم.
مخزن زیرساخت
در این شلغم ما از طریق GitlabCI به Kubernetes مستقر خواهیم شد، .gitlab-ci.yml به نظر می رسد این:
توجه داشته باشید که app-deploy هنوز هیچ کپی تعریف نشده است.
انجام استقرار اولیه
برای شروع استقرار اولیه، می توانید خط لوله GitlabCI را به صورت دستی در شاخه اصلی راه اندازی کنید. بعد از آن kubectl باید خروجی زیر باشد:
می بینیم app استقرار با 10 replica و app-canary با 0. همچنین یک LoadBalancer وجود دارد که می توانیم از طریق آن دسترسی داشته باشیم. curl از طریق IP خارجی:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
می بینیم که برنامه آزمایشی ما فقط "v1" را برمی گرداند.
اجرای استقرار قناری
مرحله 1: نسخه جدیدی را برای برخی از کاربران منتشر کنید
تعداد کپی ها را در فایل deploy-canary.yaml و تصویر نسخه جدید 1 قرار دادیم:
ما این تغییرات را به مخزنی که استقرار از آن شروع می شود (از طریق GitlabCI) فشار می دهیم و نتیجه را می بینیم:
سرویس ما به هر دو استقرار اشاره خواهد کرد، زیرا هر دو دارای انتخابگر برنامه هستند. به دلیل تصادفیسازی پیشفرض Kubernetes، باید پاسخهای متفاوتی را برای 10% درخواستها ببینیم:
وضعیت فعلی برنامه ما (GitOps، برگرفته از Git به عنوان منبع منفرد حقیقت) وجود دو استقرار با ماکت فعال است، یکی برای هر نسخه.
10% از کاربران با نسخه جدید آشنا می شوند و ناخواسته آن را تست می کنند. اکنون زمان بررسی خطاها در گزارش ها و داده های نظارتی برای یافتن مشکلات است.
مرحله 2: نسخه جدید را برای همه کاربران منتشر کنید
ما تصمیم گرفتیم که همه چیز خوب پیش رفت و اکنون باید نسخه جدید را برای همه کاربران عرضه کنیم. برای انجام این کار ما به سادگی به روز رسانی می کنیم deploy.yaml نصب نسخه جدید تصویر و تعداد ماکت برابر با 10. در deploy-canary.yaml ما تعداد Replica ها را به 0 برمی گردیم. پس از استقرار، نتیجه به شرح زیر خواهد بود:
مجموع
برای من، اجرای دستی Deployment به این روش کمک می کند تا بفهمم چگونه می توان آن را با استفاده از k8s پیکربندی کرد. از آنجایی که Kubernetes به شما امکان می دهد همه چیز را از طریق یک API به روز کنید، این مراحل را می توان از طریق اسکریپت ها خودکار کرد.
مورد دیگری که باید پیاده سازی شود یک نقطه ورود تستر (LoadBalancer یا از طریق Ingress) است که از طریق آن فقط می توان به نسخه جدید دسترسی داشت. می توان از آن برای مرور دستی استفاده کرد.
در مقالههای آینده، راهحلهای خودکار دیگری را بررسی خواهیم کرد که بیشتر کارهایی که انجام دادهایم را اجرا میکنند.