Docker Compose روی یک سرور دیگر جواب نمیدهد
هر دیپلوی قطعی کوتاه دارد، سرویسها به یک سرور گره خوردهاند و افزایش ظرفیت دستی است. Kubernetes با Rolling Update، Replica و زمانبندی خودکار روی چند نود این مشکل را حل میکند.
استقرار و مدیریت Kubernetes برای محیط عملیاتی یعنی کلاستر از روز اول Ingress، ذخیرهسازی پایدار، مانیتورینگ، بکاپ و برنامه بهروزرسانی داشته باشد. کانفیگ سرور کلاستر کوبرنتیز را روی سرورهای شما یا ابر اختصاصی با kubeadm، k3s یا RKE2 راهاندازی و نگهداری میکند.
هر دیپلوی قطعی کوتاه دارد، سرویسها به یک سرور گره خوردهاند و افزایش ظرفیت دستی است. Kubernetes با Rolling Update، Replica و زمانبندی خودکار روی چند نود این مشکل را حل میکند.
دسترسی به registry.k8s.io و برخی رجیستریهای دیگر از IPهای ایران ممکن است محدود یا ناپایدار باشد. با رجیستری داخلی، Mirror و نصب Air-gapped، کلاستر به دسترسی مستقیم به این مخازن وابسته نمیماند.
نسخههای قدیمی وصله امنیتی نمیگیرند، گواهیهای kubeadm بهصورت پیشفرض یکسالهاند و پروژه ingress-nginx از فروردین ۱۴۰۵ بازنشسته شده است. ارتقا و مهاجرت را مرحلهای و با امکان بازگشت انجام میدهیم.
از طراحی کلاستر تا عملیات روزمره، بخشهایی را پوشش میدهیم که در آموزشهای نصب کوبرنتیز معمولاً نادیده گرفته میشوند.
توزیع مناسب را بر اساس اندازه محیط، مهارت تیم و نیاز امنیتی انتخاب میکنیم و روی لینوکس نصب میکنیم.
سرویسها را روی سرورهای bare-metal که Load Balancer ابری ندارند، امن منتشر میکنیم.
داده دیتابیس و فایلهای کاربران نباید با جابهجایی یک Pod از بین برود.
در ایران، دسترسی پایدار به ایمیجها را از مرحله طراحی کلاستر در نظر میگیریم. جزئیات رجیستری در خدمات Docker آمده است.
دیپلوی باید از Git شروع شود و قابل بازگشت باشد. ساخت Pipeline در پیادهسازی CI/CD انجام میشود.
پایش و بکاپ را همزمان با خود کلاستر راهاندازی میکنیم. پایش پیشرفته در مانیتورینگ و Observability آمده است.
Kubernetes کانتینرها را روی چند سرور زمانبندی میکند، Podهای خراب را جایگزین میکند و نسخه جدید را با Rolling Update و بدون قطعی منتشر میکند. خود کلاستر هم سرویسی است که نگهداری میخواهد: etcd، گواهیها، شبکه CNI، ذخیرهسازی و ارتقای منظم نسخهها. بیشتر کلاسترهایی که ماهها بعد از نصب متوقف میشوند، به دیسک پر، گواهی منقضی یا نسخه قدیمی میخورند. نکتههای زیر به تصمیم درباره Kubernetes، طراحی کلاستر و نگهداری آن کمک میکند.
Kubernetes وقتی ارزش پیچیدگیاش را دارد که چند سرویس کانتینری روی چند سرور اجرا میشوند، قطعی هنگام دیپلوی پرهزینه است یا ظرفیت سرویسها باید با افزایش Replica تغییر کند. برای یک یا دو سرویس ساده روی یک سرور، Docker Compose سادهتر و کمهزینهتر است. سرویسها پیش از Kubernetes باید کانتینری شده باشند و Dockerfile و ایمیج قابل تکرار داشته باشند؛ این مرحله در خدمات Docker انجام میشود. Kubernetes مدیریتشده هم نگهداری Control Plane را به ارائهدهنده میسپارد، اما محل داده، نسخهها و تنظیمات را به او وابسته میکند.
kubeadm ابزار رسمی پروژه است و کنترل کامل میدهد، ولی CNI، Ingress و ارتقا را خودتان جداگانه مدیریت میکنید. k3s سبک است و به کار محیطهای کوچک، تست و Edge میآید و RKE2 با سختسازی پیشفرض برای محیط سازمانی و نصب آفلاین انتخاب رایجی است. در production، Control Plane روی سه نود اجرا میشود، چون etcd برای ادامه کار به اکثریت نودها نیاز دارد و با سه نود خرابی یکی را تحمل میکند. CNI را از روز اول با پشتیبانی NetworkPolicy انتخاب کنید؛ Calico و Cilium هر دو این قابلیت را دارند.
روی سرورهای bare-metal، Service از نوع LoadBalancer بدون MetalLB یا HAProxy بیرونی IP نمیگیرد. داده دیتابیس و فایلهای کاربران به StorageClass و Volume پایدار نیاز دارد: Longhorn برای کلاسترهای کوچک و متوسط مناسب است و در محیط بزرگتر Rook-Ceph یا اتصال به Ceph ابر اختصاصی به کار میرود. اجرای نودها بهصورت ماشین مجازی روی Proxmox، بکاپ و جایگزینی نود را برای بیشتر سازمانها سادهتر میکند.
دسترسی به registry.k8s.io و بعضی رجیستریهای دیگر از IPهای ایران ممکن است محدود یا ناپایدار باشد. نصب یا افزودن نودی که به دریافت مستقیم ایمیج از این مخازن وابسته باشد، ممکن است وسط کار متوقف شود. به همین دلیل Harbor را بهعنوان رجیستری داخلی و Proxy Cache راهاندازی میکنیم، Mirror را در containerd تنظیم میکنیم و برای RKE2 و k3s از نصب Air-gapped استفاده میکنیم. ترتیب کار این است:
فهرست ایمیجهای هر نسخه Kubernetes و افزونهها را با تگ دقیق در رجیستری داخلی نگه دارید. نصب را یک بار بدون دسترسی به رجیستریهای خارجی آزمایش کنید. اگر ایمیجی از قلم افتاده باشد، همین آزمایش آن را پیش از ارتقای بعدی نشان میدهد.
Kubernetes هر نسخه فرعی را مدت محدودی وصله میکند و kubeadm در هر مرحله فقط یک نسخه فرعی ارتقا میدهد، پس کلاستری که مدتها ارتقا نگرفته چند ارتقای پشتسرهم لازم دارد. گواهیهای kubeadm بهصورت پیشفرض یکسالهاند و اگر در ارتقا یا دستی تمدید نشوند، ارتباط با API Server قطع میشود. پروژه ingress-nginx هم بازنشسته شده و کلاسترهایی که از آن استفاده میکنند باید به Gateway API یا Ingress Controller پشتیبانیشده مهاجرت کنند. پیش از هر ارتقا از etcd بکاپ بگیرید و منابع و Volumeها را با Velero نگه دارید.
در امنیت، دسترسیها را با RBAC محدود کنید، ترافیک بین سرویسها را با NetworkPolicy ببندید و Pod Security Standards را برای Namespaceها فعال کنید. دیپلوی از Git شروع میشود: سرویسها با Helm بستهبندی میشوند و Argo CD یا Flux وضعیت کلاستر را با مخزن هماهنگ نگه میدارند؛ ساخت ایمیج و Pipeline در پیادهسازی CI/CD طراحی میشود. Prometheus، Grafana، Alertmanager و Loki پایه پایش کلاستر هستند و پایش گستردهتر در مانیتورینگ و Observability انجام میشود.
تعداد نودها و محیطها، نیاز به ذخیرهسازی پایدار، نصب آفلاین، تعداد سرویسهایی که منتقل میشوند و مدیریت مستمر پس از تحویل پایه برآورد هستند. اگر سرویسها هنوز کانتینری نشدهاند، آن مرحله هم پیش از کلاستر انجام میشود. مهاجرت از ingress-nginx یا ارتقای کلاستری که چند نسخه عقب است، کار جداگانهای است و زمان خودش را دارد. برای برآورد، فهرست سرویسها، سرورهای موجود، وضعیت فعلی کانتینرها و نسخه کلاستر فعلی را اگر دارید بفرستید تا پس از بررسی اولیه قیمت اعلام شود.
بکاپ etcd را بیرون از نودهای Control Plane نگه دارید و بازگرداندن آن را یک بار روی کلاستر آزمایشی امتحان کنید. Velero منابع و Volumeها را برمیگرداند، اما برای بازسازی Control Plane کلاستر kubeadm به بکاپ etcd نیاز دارید.
هر چهار گزینه Kubernetes استاندارد اجرا میکنند و تفاوتشان در سادگی نصب، سختسازی پیشفرض و میزان کنترل شماست.
| گزینه | ویژگی اصلی | مناسب برای | نکته مهم |
|---|---|---|---|
| kubeadm | ابزار رسمی پروژه با کمترین لایه اضافه | تیمهایی که کنترل کامل روی اجزا میخواهند | CNI، Ingress و ارتقا جداگانه مدیریت میشوند |
| k3s | توزیع سبک با اجزای پیشفرض آماده | محیطهای کوچک، Edge، تست و سرورهای کممنابع | برای کلاستر بزرگ، datastore و HA باید درست طراحی شود |
| RKE2 | توزیع سختشده با تمرکز بر امنیت | محیطهای سازمانی و نصب آفلاین | منابع بیشتری از k3s مصرف میکند |
| Kubernetes مدیریتشده | Control Plane در اختیار ارائهدهنده است | تیمهایی که نمیخواهند Control Plane نگهداری کنند | محل داده و تنظیمات به ارائهدهنده وابسته است |
سرویسها، وابستگیها، دادههای پایدار، سرورهای موجود و نیاز به دسترسی خارجی را بررسی میکنیم و آمادگی کانتینری شدن را میسنجیم.
توزیع، تعداد نودها، شبکه، استوریج، رجیستری، مدل دسترسی و روش دیپلوی را مکتوب میکنیم.
کلاستر را میسازیم، سرویسها را اول در محیط تست و بعد مرحلهای در production مستقر میکنیم و خاموشی نود را آزمایش میکنیم.
مستندات، داشبوردها و روش بکاپ و ارتقا را تحویل میدهیم و در صورت نیاز، مدیریت مستمر کلاستر را ادامه میدهیم.
بسیاری از کلاسترهایی که فقط از روی آموزش راهاندازی میشوند، در ماههای بعد با دیسک پر، گواهی منقضی یا نسخه قدیمی متوقف میشوند. طراحی را با در نظر گرفتن عملیات روزمره انجام میدهیم و بررسی اولیه از طریق تلگرام رایگان است.
Docker، CI/CD، Infrastructure as Code و مانیتورینگ هم بخشی از خدمات DevOps و امنیت ماست و کلاستر را همراه بقیه این زنجیره طراحی میکنیم.
رجیستری داخلی و نصب آفلاین را از ابتدا در طراحی لحاظ میکنیم تا ارتقای بعدی به دسترسی خارجی گره نخورد.
پایش را در آموزش Prometheus و Grafana و توزیع بار را در راهنمای HAProxy توضیح دادهایم.
پایه مانیتورینگ هر کلاستر Kubernetes.
آموزشتوزیع بار جلوی Control Plane و سرویسهای کلاستر.
آموزشبستر رایج برای اجرای نودهای کلاستر بهصورت ماشین مجازی.
Kubernetes پلتفرمی متنباز برای مدیریت کانتینرهاست که اجرای سرویسها روی چند سرور، مقیاسپذیری، جایگزینی Podهای خراب و دیپلوی بدون قطعی را خودکار میکند. اگر چند سرویس کانتینری روی چند سرور دارید و قطعی هنگام دیپلوی برایتان پرهزینه است، زمان بررسی آن رسیده؛ برای یک یا دو سرویس ساده، Docker Compose اغلب کافی است.
Docker ایمیج میسازد و کانتینر را روی یک سرور اجرا میکند، اما Kubernetes تصمیم میگیرد کانتینرها روی کدام نودها اجرا شوند، چند نسخه از هر کدام فعال باشد و در خرابی جایگزین شوند. کوبرنتیز از نسخه 1.24 با runtimeهای CRI مانند containerd کار میکند و ایمیجهای ساختهشده با Docker بدون تغییر روی آن اجرا میشوند.
برای production سه نود Control Plane پیشنهاد میشود تا etcd با خرابی یک نود از کار نیفتد و در کلاسترهای کوچک همین سه نود بار Worker را هم اجرا میکنند. برای محیط تست یک نود k3s کافی است.
بله، به شرط آنکه برای دسترسی به ایمیجها برنامه داشته باشید. ایمیجها را در رجیستری داخلی مانند Harbor نگهداری میکنیم، Mirror را در containerd تنظیم میکنیم یا از نصب Air-gapped استفاده میکنیم تا نصب و ارتقا به دسترسی مستقیم به رجیستریهای خارجی وابسته نباشد.
برای بیشتر سازمانها اجرای نودها بهصورت ماشین مجازی روی Proxmox، بکاپ و جایگزینی نودها را سادهتر میکند. اجرای bare-metal برای بارهای بسیار حساس به کارایی یا نیاز به GPU و شبکه خاص منطقیتر است.
کوبرنتیز مدیریتشده نگهداری Control Plane را از دوش شما برمیدارد، اما محل داده، نسخهها و تنظیمات به ارائهدهنده وابسته میشود. کلاستر اختصاصی کنترل کامل میدهد و نگهداری آن را میتوانیم برعهده بگیریم.
هزینه بر اساس تعداد نودها و محیطها، نیاز به ذخیرهسازی پایدار و نصب آفلاین، تعداد سرویسهایی که منتقل میشوند و نیاز به مدیریت مستمر محاسبه میشود. پس از بررسی رایگان اولیه، قیمت بهصورت استعلامی اعلام میشود.
سرویسها، سرورهای موجود و وضعیت فعلی کانتینرها را در تلگرام بنویسید تا کارشناس ما معماری مناسب کلاستر را پیشنهاد دهد.