Kubernetes توضیح داد: درک مؤلفههای کلیدی که زیرساختهای مدرن را هدایت میکنند ⚙️

📖 مقدمه
سلام به همه، در قسمت امروز ما اجزای کلیدی Kubernetes را بررسی خواهیم کرد. در آخرین قسمت متوجه شدیم که چرا Kubernetes برای مهندسی نرم افزار بسیار مهم است و چرا تقریباً هر شرکت بزرگی به آن متکی است. سفر ما با مثالها و تصاویر پشتیبانی میشود تا به همه کمک کنیم تا عملکردهای ضروری Kubernetes را درک کنند.
بیایید در آن شیرجه بزنیم! 🚢
📒 واژه نامه:
در اینجا لیستی از کلمات و اصطلاحات رایج مورد استفاده در این مقاله آمده است. این به شما کمک می کند تا قبل از خواندن مقاله کامل، یک درک اساسی داشته باشید.
ظرف:
کانتینر یک واحد استاندارد نرم افزار است که کد برنامه را به همراه تمام وابستگی ها، کتابخانه ها و فایل های پیکربندی مورد نیاز برای اجرا بسته بندی می کند. کانتینرها اطمینان حاصل می کنند که نرم افزار بدون توجه به محیط به طور مداوم رفتار می کند. فناوری های رایج کانتینر شامل Docker و Kubernetes هستند.
سیستم توزیع شده:
یک سیستم توزیع شده مجموعه ای از کامپیوترها یا گره های مستقل است که با هم کار می کنند تا به عنوان یک سیستم منسجم برای کاربر نهایی ظاهر شوند. این سیستم ها از طریق یک شبکه با یکدیگر ارتباط برقرار می کنند تا وظایف را هماهنگ کنند، منابع را به اشتراک بگذارند و به اهداف مشترک دست یابند.
دیمون:
در زمینه ارکستراسیون کانتینر، دیمون به یک سرویس یا فرآیند پس زمینه اشاره دارد که به طور مداوم بدون دخالت کاربر، وظایف را اجرا و مدیریت می کند.
محیط تولید:
محیط تولید محیطی است که در آن یک برنامه یا سرویس در دسترس کاربران نهایی قرار می گیرد. در این محیط، انتظار می رود که برنامه به طور پایدار، کارآمد و ایمن، اغلب تحت شرایط ترافیکی دنیای واقعی و با تنظیمات بهینه شده برای عملکرد، کار کند.
API:
API (Application Programming Interface) مجموعه ای از قوانین و تعاریف است که به نرم افزارهای مختلف اجازه می دهد تا با یکدیگر ارتباط برقرار کنند. API ها نحوه ارسال درخواست ها، ساختار داده ها و دریافت پاسخ ها را تعریف می کنند. APIها معمولاً برای خدمات وب (مانند REST، GraphQL)، سخت افزار، سیستم عامل ها و غیره استفاده می شوند.
YAML:
YAML (YAML Ain't Markup Language) یک فرمت سریالسازی دادههای قابل خواندن برای انسان است که اغلب برای فایلهای پیکربندی استفاده میشود. YAML از تورفتگی سلسله مراتبی برای نمایش ساختارهای داده مانند نقشه ها، لیست ها و مقادیر اسکالر استفاده می کند. خواندن و نوشتن آن آسان است و آن را در پیکربندی کانتینر و ارکستراسیون منابع محبوب می کند.
🏗️ معماری
خوشه Kubernetes چیست؟
خوشه Kubernetes مجموعه ای از ماشین ها به نام گره ها است که می توانند برنامه های کاربردی را اجرا کنند. Kubernetes یک معماری توزیع شده بر اساس مدل مشتری-سرور برای هماهنگ کردن کانتینرها اتخاذ می کند. معماری Kubernetes از دو جزء اصلی تشکیل شده است:
👨🏻⚖️ گره اصلی
🧠 هواپیمای کنترل
مغز خوشه. مسئول مدیریت وضعیت خوشه است. در محیطهای تولید، صفحه کنترل معمولاً روی چندین گره اجرا میشود که در چندین منطقه مرکز داده قرار دارند. دوم مجموعه ای از گره های کارگر است. این گره ها بارهای کاری برنامه های کاربردی را اجرا می کنند. برنامه های کاربردی کانتینری در یک Pod اجرا می شوند.
پاد چیست؟
Pods کوچکترین واحدهای قابل استقرار در Kubernetes هستند. یک پاد یک یا چند کانتینر را میزبانی می کند و فضای ذخیره سازی و شبکه مشترک را برای آن کانتینرها فراهم می کند. Pods توسط هواپیمای کنترل Kubernetes ایجاد و مدیریت می شود. آنها بلوک های اصلی برنامه های Kubernetes هستند.
حالا بیایید کمی عمیق تر در صفحه کنترل شیرجه بزنیم. این شامل چندین مؤلفه اصلی مانند سرور API و غیره، زمانبندی و مدیر کنترلر است.
🤖 سرور API:
این رابط اولیه بین صفحه کنترل و بقیه خوشه است. این یک API RESTful را نشان می دهد که به مشتریان اجازه می دهد با صفحه کنترل تعامل داشته باشند و درخواست هایی برای مدیریت خوشه ارسال کنند. سرور API دروازه ای برای kubectl است که یک ابزار خط فرمان برای برقراری ارتباط با صفحه کنترل با استفاده از API است.
به عنوان مثال دستور
kubectl run "pod-name" --image="image-name"
برای ایجاد یک Pod با دلخواه استفاده می شود نام غلاف و با خواسته تصویر-نام
💾 و غیره
Etcd یک فروشگاه ارزش کلیدی توزیع شده منبع باز است و نقش اساسی در صفحه کنترل Kubernetes ایفا می کند. حالت پایدار خوشه را ذخیره می کند. در Kubernetes etcd بهعنوان دادههای اولیه عمل میکند و تمام دادههای خوشهای از جمله پیکربندی، وضعیت و ابرداده را ذخیره میکند. توسط سرور API برای بازیابی و بهروزرسانی وضعیت خوشه استفاده میشود و اطمینان حاصل میکند که وضعیت واقعی خوشه با وضعیت مطلوب تعریف شده توسط کاربران و مدیر مطابقت دارد.
واقعیت جالب: ETCD از کلمات “etc” و “d” تشکیل شده است. “etc” از دایرکتوری یونیکس “/etc” مشتق شده است که فایل های پیکربندی را در خود جای داده است و “d” مخفف “distributed” است.
📓 زمانبندی:
زمانبند مسئول زمانبندی پادها بر روی گرههای کارگر در خوشه است. از اطلاعات مربوط به منابع مورد نیاز غلاف ها و منابع موجود در گره های کارگر برای تصمیم گیری در مورد مکان استفاده می کند.
در یک خوشه، گره هایی که الزامات زمان بندی برای یک Pod را برآورده می کنند، گره های امکان پذیر نامیده می شوند. اگر هیچ یک از گره ها مناسب نباشند، غلاف بدون برنامه باقی می ماند تا زمانی که زمان بندی قادر به قرار دادن آن باشد.
Kube-scheduler یک گره را برای pod در یک عملیات 2 مرحله ای انتخاب می کند:
-
فیلتر کردن:
مرحله فیلترینگ گره هایی را که می توان Pod را در آنها برنامه ریزی کرد شناسایی می کند. پس از این مرحله، لیست گره ها حاوی گره های مناسب (معمولا بیش از یک) می باشد. اگر لیست خالی باشد، Pod (هنوز) قابل برنامه ریزی نیست. -
امتیاز دهی:
در مرحله امتیازدهی، زمانبندی گرههای باقیمانده را رتبهبندی میکند تا بهترین مکان را برای Pod انتخاب کند. به هر گره ای که فیلتر را پشت سر گذاشته باشد، بر اساس قوانین امتیازدهی فعال، امتیازی داده می شود.
در نهایت، kube-scheduler Pod را به Node با بالاترین رتبه اختصاص می دهد. اگر بیش از یک گره با امتیازهای مساوی وجود داشته باشد، kube-scheduler یکی از آنها را به طور تصادفی انتخاب می کند.
🧑🏻💼 مدیر کنترل:
مدیر کنترلر مسئول اجرای کنترلرهایی است که وضعیت خوشه را مدیریت می کنند. کنترلکننده تکرار تضمین میکند که تعداد مورد نظر از کپیهای یک پاد در حال اجرا است، کنترلکننده استقرار بهروزرسانیهای چرخشی و بازگرداندن استقرارها را مدیریت میکند، و کنترلکننده نقطه پایانی نقطه پایانی سرویسها را مدیریت میکند.
تصویر 1: خلاصه ای از اجزای اصلی گره اصلی
👷🏻 گره های کارگری
اجزای اصلی Kubernetes که روی گرههای کارگر اجرا میشوند عبارتند از kubelet، کانتینر زمان اجرا و kube-proxy.
📦 Kubelet
Kubelet یک دیمون است که روی هر گره کارگر اجرا می شود. این عامل اصلی گره است که روی هر گره اجرا می شود. وظیفه ارتباط با هواپیمای کنترل را بر عهده دارد. می تواند گره را با apiserver با استفاده از یکی از: نام میزبان ثبت کند. یک پرچم برای لغو نام میزبان؛ یا منطق خاص برای یک ارائه دهنده ابر. دستورالعملهایی را از صفحه کنترل دریافت میکند که کدام غلاف روی گره اجرا شود، و از حفظ وضعیت مطلوب غلافها اطمینان میدهد.
Kubelet بر حسب PodSpec کار می کند. مجموعهای از PodSpecs را میگیرد و تضمین میکند که ظروف، که در آن PodSpecs توضیح داده شده، در حال اجرا و سالم هستند.
Kubelet کانتینرهایی را که توسط Kubernetes ایجاد نشده اند را مدیریت نمی کند.
در اینجا یک نمونه از PodSpec آورده شده است:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d
volumes:
- name: nginx-config
configMap:
name: nginx-config-map
restartPolicy: Always
در این زمینه Kubelet PodSpec را میخواند و به زمان اجرای کانتینر میگوید که تصویر کانتینر “nginx:latest” را دانلود کند، سپس کانتینرها را اجرا میکند و حجم تعریفشده در spec.volumes را نصب میکند. Kubelet منبع تعریف شده در spec.resources را اختصاص می دهد و سلامت کانتینر را نظارت می کند.
⚙️ زمان اجرای کانتینر
Container Runtime کانتینرها را روی گره های کارگر اجرا می کند. این مسئول بیرون کشیدن تصاویر کانتینر از یک رجیستری است. کانتینرها را شروع و متوقف کنید و منابع کانتینرها را مدیریت کنید. Kubernetes از زمانهای اجرا کانتینر مانند Containered، CRI-O و هر پیادهسازی دیگر از Kubernetes CRI (رابط زمان اجرای کانتینر) پشتیبانی میکند. 2 نوع زمان اجرا کانتینر وجود دارد: زمان اجرا کانتینر سطح پایین و زمان اجرا کانتینر سطح بالا. از آنجایی که این یک موضوع گسترده است، در مقاله آینده مفهوم کانتینرهای زمان اجرا را گسترش خواهم داد.
💻 پروکسی
kube-proxy یک پروکسی شبکه است که روی هر گره کارگر اجرا می شود. این مسئول مسیریابی ترافیک به پادهای صحیح است. همچنین تعادل بار را برای غلاف ها فراهم می کند و اطمینان می دهد که ترافیک به طور مساوی در بین آنها توزیع می شود. پس از نصب kube-proxy، با سرور API احراز هویت می شود و هنگامی که سرویس ها یا نقاط پایانی جدید اضافه یا حذف می شوند، سرور API این تغییرات را به kube-proxy منتقل می کند، سپس kube-proxy این تغییرات را به عنوان قوانین NAT اعمال می کند. هنگامی که ترافیک به یک سرویس ارسال می شود، بر اساس این قوانین به یک Pod باطن هدایت می شود. در مورد Container Runtimes، این یک مقدمه کوچک در مورد اینکه kube-proxy چیست و عملکردهای اصلی آن چیست و من در یک مقاله اختصاصی همه این مفاهیم را گسترش خواهم داد.
Image2: خلاصه ای از اجزای اصلی یک خوشه kubernetes که شامل گره اصلی و دو گره کارگر است. در گره کارگر اول 5 پاد میکروسرویس و گره کارگر دوم 3 غلاف میکروسرویس را اجرا می کند.
🚀 نتیجه گیری
اجزای Kubernetes نمونه ای زیبا از فناوری و زیرساخت های پیچیده هستند. امروز نحوه کار و تعامل اجزای اصلی برای فعال کردن استقرار و مقیاسبندی کارآمد برنامه را بررسی کردیم. در قسمت بعدی، من به شما نشان خواهم داد که چگونه اولین خوشه Kubernetes خود را شروع کنید و چگونه یک برنامه را گسترش دهید!
با تشکر از شما برای خواندن! 🙏