یک راهنمای جامع برای مدیریت زیرساخت های در مقیاس بزرگ با GITOPS

Gitops بیشتر و بیشتر به تصویب می رسد. با این حال ، به نظر می رسد هنوز هم برخی از سردرگمی ها در مورد GitOps وجود دارد ، تفاوت آن با خطوط لوله معمولی CI/CD و چگونگی بهترین اتخاذ آن متفاوت است. در این پست ما
به سرعت آنچه Gitops را پوشش می دهد ، و سه درس اصلی که از استفاده از GITOPS برای مدیریت زیرساخت ها در مقیاس هم به فرض و هم در ابر آموخته شده است.
نمای کلی گیتوپ ها
GITOPS مجموعه ای از اصول است که امکان عملکرد یک سیستم را از طریق پیکربندی کنترل شده ، اعلامی کنترل شده ، امکان پذیر می کند. به طور خاص ، پروژه OpenGitOps چهار اصل را تعریف می کند که تعریف می کند که آیا سیستم یا مجموعه ای از سیستم ها از طریق GITOPS مدیریت می شود:
- اعلان کننده: سیستمی که توسط GITOPS اداره می شود باید وضعیت دلخواه خود را به صورت اعلامیه بیان کند.
- نسخه و تغییر ناپذیر: حالت مورد نظر به گونه ای ذخیره می شود که تغییر ناپذیری ، نسخه سازی را تقویت می کند و تاریخچه نسخه کاملی را حفظ می کند.
- به طور خودکار کشیده می شود: نمایندگان نرم افزار به طور خودکار اعلامیه های دولت مورد نظر را از منبع بیرون می کشند.
- به طور مداوم آشتی: عوامل نرم افزاری به طور مداوم وضعیت سیستم واقعی را رعایت می کنند و سعی در اعمال وضعیت مورد نظر دارند.
توجه داشته باشید که git
در هیچ کجا ارجاع نمی شود ، زیرا GITOPS به هیچ ابزاری محدود نمی شود. با این حال ، از نظر لیمن ، بسیاری سیستمی را که از طریق آن کار می کنند ، در نظر می گیرند git
برای اینکه یک سیستم GITOPS باشد. این کاملاً درست نیست.
Gitops بیش از خطوط لوله CI/CD است
با در نظر گرفتن “تعریف غیرمستقیم” از بالا ، هر سیستمی که دارای CI/CD از طریق خطوط لوله است که بر تغییرات مخزن ایجاد می شود ، یک سیستم GITOPS است. این دقیق نیست خط لوله IAC را در نظر بگیرید که از زیرساخت های تعریف شده تعریف شده استفاده می کند (مانند یک استاندارد opentofu apply
در یک خط لوله ، یا یک docker ساخت و به دنبال آن kubectl apply
). در حالی که چنین سیستمی به دو اصل اول پایبند است ، اما به دو مورد دوم پایبند نیست. این بدان معنی است که تغییرات ایجاد شده در سیستم هدف تا زمانی که خط لوله بار دیگر اجرا شود اصلاح نمی شود (آشتی). به همین ترتیب ، اگر خط لوله به هر دلیلی شکست بخورد ، حالت مورد نظر خط لوله را تغییر نمی دهد: یک رانش پیکربندی شناسایی نمی شود ، حتی اگر آشتی نشود.
این یک تمایز مهم هنگام در نظر گرفتن “CI/CD استاندارد” و GITOPS است. به سادگی داشتن چیزی که به عنوان کد اعلام شده است باعث نمی شود که گیتوپ ها باشد.
مزایای Gitops
GITOPS نسبت به روشهای استاندارد مدیریت سیستم ها مزایای بسیاری دارد. مزایای داشتن یک حالت مطلوب اعلامیه ، نسخه کنترل آن و تعامل فقط با سیستم git
(یا هر سیستم کنترل نسخه ای که استفاده می کنید) فوق العاده است. از امنیت بهبود یافته و راندمان بالاتر تا تغییر بهتر دید. اینها برای اکثر مردم به خوبی شناخته شده است و از این رو در اینجا تحت پوشش قرار نمی گیرند.
تشخیص رانش و آشتی خودکار دو جنبه دیگر است که Gitops را کاملاً شگفت انگیز می کند. این امر به ویژه در روز و سن فعلی صادق است ، با گسترش سیستم های پیچیده توسط بسیاری از افراد به طور همزمان انجام می شود. قادر به مشاهده اینکه سیستم در حالت مورد نظر نیست ، مزایای گسترده ای دارد ، مانند عملیات استاندارد SRE. آشتی مداوم تضمین می کند که کارهای عملیاتی دستی به حداقل می رسد ، و این که سیستم ها با گذشت زمان نمی توانند با گذشت زمان کاهش یابد ، زیرا تغییرات ناخواسته کوچک در آن خزنده می شوند.
ابزار
در این پست ما بیشتر به استفاده از GITOP ها برای مدیریت منابع اداره شده از طریق Kubernetes API خواهیم پرداخت ، اما لازم به ذکر است که GITOPS به عنوان یک مفهوم به هیچ وجه محدود به Kubernetes نیست. در فضای Kubernetes دو بازیکن اصلی برای GITOPS وجود دارد: ARGOCD و FLUXCD. ما به جزئیات مربوط به مزایای هر ابزار نمی پردازیم ، به غیر از گفتن اینكه طبق تجربه خودمان ، ARGOCD ممكن است توسعه دهنده تر باشد ، در حالی كه FluxCD ممكن است مهندسین پلتفرم را با تجربه كوبرته بیشتری كه می خواهند انعطاف پذیری بیشتری داشته باشند ، متناسب باشد.
بقیه این پست ابزار Agnostic است و هر کاری که ما در مورد آن صحبت می کنیم می تواند با هر ابزار انجام شود (اما برخی از جنبه ها ممکن است با یک یا دیگری راحت تر باشد).
زیرساخت: تفسیر
قبل از اینکه به نحوه ساختار پیکربندی Gitops خود بپردازیم ، ممکن است منطقی باشد که خطی را که زیرساخت ها شروع می شود و از کجا به پایان می رسد ، ترسیم کنیم. ما هر آنچه را که بخشی از سکوی ارائه شده به تیم برنامه است ، زیرساخت ها را در نظر می گیریم. از این رو این خط بسته به بلوغ سکو که تیم های خود را ارائه می دهید ممکن است متفاوت باشد. اگر ما یک بستر ساده Kubernetes را با کمی انتزاع اضافی برای کاربران خود در نظر بگیریم ، زیرساخت ها شامل خود پلت فرم Kubernetes و همچنین تمام مؤلفه های سیستم که بین تیم ها به اشتراک گذاشته می شود ، مانند یک پشته نظارت مرکزی ، یک راه حل اصلی مدیریت اعتبار ، اجرای سیاست متمرکز منابع خاص Kubernetes و موارد مشابه است.
انتهای پایین طیف به احتمال زیاد توسط GITOPS مدیریت نمی شود. این فقط به این دلیل است که ابزار GitOps که خود به طور معمول باید در جایی اجرا شود ، و همچنین باید به نوعی راه اندازی شود. برخی از ابزارها مانند FLUXCD به کنترل کننده GITOPS اجازه می دهند تا خود را مدیریت کند ، اما حتی در این موارد ، زمان اجرا برای کنترل کننده هنگام نصب کنترلر باید وجود داشته باشد و بنابراین به طور معمول جزئی از پیکربندی GITOPS نیست.
اکنون که این مسئله پاکسازی شده است ، اجازه دهید در نظر بگیریم که چگونه پیکربندی باید مدیریت شود.
برنامه برنامه
یک الگوی بسیار محبوب برای مدیریت پیکربندی از طریق GITOPS ، الگوی “برنامه برنامه ها” است. این توسط ARGOCD محبوب شد ، اما برای سایر ابزارها نیز کاربرد دارد. ما در مثال زیر از ArgoCD استفاده خواهیم کرد ، اما همین کار را می توان با استفاده از kustomizations fluxcd اجرا کرد.
بگذارید مؤلفه ای را از زیرساخت های خود در نظر بگیریم که می خواهیم از طریق GITOPS مدیریت کنیم. به طور معمول ، ما باید به کنترل کننده GITOPS بگوییم که چگونه می توان این مؤلفه را مدیریت کرد. به عنوان مثال ، بگذارید فرض کنیم این مؤلفه از طریق مانیفست های خام Kubernetes نصب شده است. سپس ما به کنترل کننده GitOps می گفتیم که مخزن شامل این مانیفست ها است و در آن فضای نام برای نصب آنها وجود دارد. بسته به کنترل کننده ای که از آن استفاده می کنید ، ممکن است پارامترهای اضافی مانند چند بار آشتی نیز پیکربندی کنید ، خواه به سایر مؤلفه ها و غیره بستگی داشته باشد. در argocd jargon این یک “برنامه” (ریشه نامگذاری برنامه “برنامه های برنامه”) است و به شرح زیر است:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sealed-secrets
namespace: argocd
spec:
project: default
source:
chart: sealed-secrets
repoURL: https://bitnami-labs.github.io/sealed-secrets
targetRevision: 1.16.1
helm:
releaseName: sealed-secrets
destination:
server: "https://kubernetes.default.svc"
namespace: kubeseal
سپس این را اعمال می کنید Application
منبع به Kubernetes. سپس مؤلفه شما توسط GITOPS اداره می شود ، زیرا هر تغییری که به مخزن مانیفست فشار می دهید ، در خوشه Kubernetes منعکس می شود.
سپس یک مؤلفه زیرساخت دوم باید نصب شود و روند کار را تکرار می کنید. نتیجه یک ثانیه خواهد بود Application
که یک مؤلفه را نصب و مدیریت می کند. همچنین ممکن است بخواهید استقرار خود را نسخه (مانند استفاده از نسخه 1.16.1
نمودار کلاه ایمنی). این بدان معنی است که چرخه عمر نیاز به تغییر در این امر دارد Application
آشکار ، و در نتیجه تماس علیه API Kubernetes برای ویرایش آن.
نتیجه نهایی مجموعه ای از است Application
منابع ، که برخی از آنها به طور دوره ای هنگام زندگی یک مؤلفه اصلاح می کنید. حال تصور کنید که باید زیرساخت های خود را در جای دیگر مستقر کنید (به عنوان مثال یک خوشه دوم Kubernetes در مثال ما) ، یا شاید حتی دوازده بار. سپس شما باید کل این مجموعه را مدیریت کنید Application
منابع در هر بستر. یک رویکرد بهتر اضافه کردن یک لایه انتزاع است که خود را مستقر می کند Application
منابع از طریق GITOPS. از این رو همه خود را قرار داده اید Application
منابع را به یک مخزن و تعریف دیگری ، “سطح بالاتر” Application
که این مخزن را مستقر می کند. این بدان معنی است که هنگام اعزام به سیستم عامل های جدید ، شما فقط باید آن “سطح بالاتر” را مستقر کنید Application
، و هرگونه تغییر در مؤلفه Application
منابع را می توان از طریق GIT ، مطابق با رویکرد GitOps ما انجام داد. این “سطح بالاتر” Application
فقط برای استقرار مؤلفه وجود دارد Application
S بنابراین نام “برنامه برنامه ها” است. از لحاظ بصری ، شما ساختار زیر را دارید:
لازم به ذکر است که این امر به طور گسترده ای هنگام شخصی سازی سیستم عامل ها نیز کمک می کند. به طور معمول ، مؤلفه ها نمی توانند در چندین مکان واقعاً یک به یک مستقر شوند ، اما نیاز به تفاوت های کمی پیکربندی دارند. به عنوان مثال نام های میزبان را برای UI های اجزای خود در نظر بگیرید. دو مورد از این مؤلفه های مستقر در مکان های مختلف نمی توانند نام میزبان و مسیریابی را به اشتراک بگذارند. استفاده از یک رویکرد “برنامه برنامه” به شما امکان می دهد متغیرهایی را در برنامه سطح بالا تعریف کنید و این موارد را به برنامه های پایین دست تزریق کنید به گونه ای که می توانند کمی روش نصب را تطبیق دهند. ما به نحوه انجام این کار عمیق تر نخواهیم شد زیرا به ابزاری که استفاده می کنید بسیار وابسته است (ArgoCD از آن استفاده می کند ApplicationSet
، FluxCD از تعویض متغیر استفاده می کند) ، اما بدانید که این امر با چنین رویکردی فعال می شود.
تثبیت پیکربندی شما
در سازمان من برای اولین بار از Gitops در مقیاس استفاده کردم ، ما تمام اجزای خود را به عنوان نمودارهای کلاه ایمنی به یک خوشه Kubernetes مستقر کردیم. هر مؤلفه اساساً در دو مخزن مختلف در سیستم کنترل نسخه ما موجود بود:
- مخزن کد منبع که به طور معمول یک تصویر Docker را به عنوان یک مصنوعات ساخته است
- تعریف نمودار Helm که به تصویر Docker از بالا اشاره داشت
وقتی در آن زمان GITOPS را معرفی کردیم ، تصمیم گرفتیم یک مخزن سوم را اضافه کنیم که حاوی تعریف دقیق استقرار باشد (در مورد ما Application
اعلامیه ها) برای مؤلفه. با استفاده از الگوی برنامه App-APPS از بالا ، ما می توانیم به هر یک از این “مخازن GITOPS” مراجعه کنیم و پوشش های خاص (سفارشی سازی) را مستقر کنیم Application
به سیستم عامل های خاص. این کار برای مدتی خوب کار کرد. با این حال ، با گذشت زمان تعداد مؤلفه هایی که ما مدیریت کردیم افزایش یافته است ، و همچنین تعداد سیستم عامل های هدف که این مؤلفه ها برای استقرار لازم بودند ، نیز انجام شد. این منجر به چند مسئله می شود.
هنگامی که یک پلت فرم هدف جدید معرفی شد ، تمام “مخازن GitOps” لازم بود که به روز شوند تا حاوی یک پوشش جدید تنظیم شده باشد Application
به سکوی خاص. این بسیار خسته کننده است وقتی که چندین ده مخزن از این دست دارید.
علاوه بر این ، مؤلفه ها به سایر مؤلفه ها وابستگی داشتند. این بدان معناست که ما در یک مخزن که در مخزن دیگری تعریف شده بود ، به مؤلفه های مراجعه کننده ای مراجعه می کردیم. در حالی که به خودی خود مشکل ساز نیست ، وقتی یک مؤلفه به مقدار پیکربندی مؤلفه دیگر وابستگی داشته باشد ، این مسئله بسیار مشکل است. مقدار پیکربندی سپس در هر دو مخزن کپی می شود و نگهداری آن دشوار می شود. در حالی که این به نظر می رسد که ما اجزای آن را به درستی از هم جدا نکردیم ، دیدن چنین مواردی در تنظیمات زیرساختی بسیار معمول است. به عنوان مثال ، استقرار یک کنترلر Ingress را در نظر بگیرید که یک پسوند نام میزبان را برای مسیرهای خود تعریف می کند. تمام مؤلفه های مستقر در همان سکوی Kubernetes که یک مسیر/ورود را مستقر می کنند ، برای داشتن مسیریابی معتبر ، باید دقیقاً از آن پسوند نام میزبان استفاده کنند.
مسئله فوق همچنین منجر به شرایط پیچیده می شود که نیاز به تنظیمات برای مؤلفه هایی که به یکدیگر وابسته هستند تغییر می یابد. اگر پیکربندی استقرار به مخازن مختلف جدا شود ، برای اطمینان از وقوع استقرار در همان زمان ، باید PRS به این مخازن هماهنگ شوند.
سرانجام ، توزیع پیکربندی استقرار بر روی بسیاری از مخازن به این معنی بود که داشتن یک مرور کلی از آنچه در یک بستر هدف مستقر شده است ، به طور فزاینده ای دشوار می شود. برای بررسی صحیح این کار ، باید از طریق ده ها مخزن حرکت کرد.
پس از شناسایی این مسائل ، تصمیم گرفتیم تمام پیکربندی های خود را به یک مخزن واحد منتقل کنیم. این مخزن سپس شامل تعریف الگو از کل مجموعه مؤلفه هایی است که نیاز به استقرار دارند. مجموعه ای از تعاریف پلتفرم در همان مخزن ، سپس مقادیر را به قالب ها تغذیه می کند تا از پیکربندی مداوم اطمینان حاصل شود. این به ما کمک کرد تا موضوعات ذکر شده در بالا را برطرف کنیم. در بالای آن ، این امکان را به شما می دهد تا “الگوی” را نسخه کنید و در نتیجه امکان استفاده از یک لایه زیرساخت نسخه ای را فراهم می کند.
شما می توانید یک مخزن نمونه از چنین ساختاری پیدا کنید
طراحی شده با fluxcd در اینجا:
این مخزن نمونه ای را نشان می دهد که چگونه می توان از یک مونوپرسیون منفرد برای مدیریت زیرساخت های چندین خوشه به صورت کنترل شده استفاده کرد.
این مخزن نمونه ای را نشان می دهد که چگونه می توان از یک مونوپرسیون منفرد برای مدیریت زیرساخت های چندین خوشه به صورت کنترل شده استفاده کرد.
راه اندازی
یک پت github ایجاد کنید
به مستندات مراجعه کنید: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
برای کنترل جریمه دانه ، مجوزهای مدیر و محتوا را در مخزن اعطا کنید.
یک خوشه با شار تنظیم کنید
ابزار مورد نیاز را با تنظیم کنید devbox shell
، پس
# install a cluster
kind create cluster -n demo
# set the token
export GITHUB_TOKEN=''
# onboard flux
flux bootstrap github \
--token-auth \
--owner=f4z3r \
--repository=flux-demo \
--branch=main \
--path=clusters/demo \
--personal
خروجی نمونه از نصب شار
پل گیتوپ
آخرین چالشی که می خواهیم در این پست وبلاگ به آن بپردازیم مفهومی به نام “پل Gitops” است. در محیط های ابری عمومی ، به طور معمول یک کاهش نسبتاً قوی بین زیرساخت های مستقر از طریق Terraform (یا هر ابزار مشابه) و زیرساخت های مستقر از طریق GITOPS وجود دارد. به عنوان مثال ، ممکن است یک سرویس Azure Kubernetes و برخی از خدمات اطراف آن (مانند شبکه مورد نیاز ، ثبت کانتینر و غیره) از طریق Terraform مستقر شود و آنها را با استفاده از GITOPS در AK ها و برنامه های کاربردی در داخل AK ها مستقر کنند. مسئله ای که در اینجا با آن روبرو هستیم این است که پیکربندی Gitops اغلب به پیکربندی Terraform بستگی دارد. به عنوان مثال رجیستری کانتینر را در نظر بگیرید. آدرس آن توسط Terraform تنظیم شده است ، اما در هر اعلامیه تصویر در پیکربندی GITOPS استفاده می شود. یک گزینه کپی کردن چنین مقادیر در تنظیمات مربوطه است ، در حالی که گزینه دیگر استفاده از یک پل GitOps است.
Bridge Gitops یک مفهوم انتزاعی در مورد چگونگی عبور مقادیر پیکربندی از ابزار مانند Terraform به عنوان ورودی به پیکربندی GITOPS است. نحوه انجام این کار در عمل بسیار بستگی به این دارد که از چه ابزارهایی استفاده می کنید. به عنوان مثال ، اگر به Terraform و FluxCD نگاه کنید ، یک روش مشترک برای دستیابی به این هدف این است که Terraform یک پیکربندی را روی AKS بنویسید که در آن کنترل کننده FLUXCD حاوی کلیه متغیرها (و مقادیر آنها) باشد که توسط پیکربندی Gitops مورد نیاز است. کنترل کننده FLUXCD سپس از متغیرهای تزریق شده از یک پیکربندی از طریق تعویض متغیر پشتیبانی می کند.
استفاده از یک پل GITOPS این مزیت را دارد که تغییر در تنظیمات Terraform بسیار کمتر از پیکربندی Gitops که در بالای آن ایجاد می شود ، کمتر است. علاوه بر این ، به Terraform اجازه می دهد تا هنگام ایجاد سیستم عامل های جدید بدون نیاز به تعریف مجدد متغیرهای مورد نیاز در مخزن GITOPS ، کل تنظیمات GITOPS را بطور مستقیم بوت کند.
خلاصه
بنابراین ، برای یادآوری ، ما نگاه کرده ایم که Gitops واقعاً چیست (و نیست). درک این اصول برای اجرای صحیح GITOP ها در پروژه های شما بسیار مهم است. مهمتر از آن ، ما به سه بهترین روش نگاه کردیم:
- برای بهبود مقاومت در هنگام نیاز به بازآفرینی سیستم عامل از یک الگوی برنامه برنامه استفاده کنید.
- با افزایش تنظیمات خود ، از یک بازپرداخت تک برای تمام پیکربندی Gitops خود استفاده کنید.
- برای بهبود اتوماسیون هنگام تنظیم سیستم عامل ها و اطمینان از سازگاری Terraform و Gitops ، به پل های Gitops نگاهی بیندازید.
من امیدوارم که این به شما کمک کند کمی بهتر از نحوه استفاده از Gitops در مقیاس درک کنید. اگر سؤال یا نظر دارید ، در زیر به من اطلاع دهید.