Kubernetes به زبان ساده: راهنمای جامع معماری و پیاده‌سازی پیشرفته

Kubernetes

فهرست مطالب

Kubernetes به زبان ساده: از معماری تا استقرار در محیط تولید

 راهنمای جامع Kubernetes برای حرفه‌ای‌ها: مفاهیم، معماری و پیاده‌سازی پیشرفته

چکیده (Abstract)

Kubernetes یا به اختصار K8s، امروزه به استانداردی طلایی برای orchestration کانتینرها تبدیل شده است. این پلتفرم متن‌باز که توسط گوگل طراحی و به Cloud Native Computing Foundation اهدا شد، امکان مدیریت، مقیاس‌دهی و استقرار خودکار برنامه‌های کانتینری را فراهم می‌کند. در این مقاله جامع و پیشرفته، سفری خواهیم داشت از مفاهیم پایه‌ای معماری Kubernetes تا چالش‌های پیاده‌سازی در محیط تولید (Production). با تشریح دقیق مؤلفه‌های کنترل پلین (Control Plane) مانند kube-apiserver، etcd، kube-scheduler و kube-controller-manager آشنا می‌شویم و سپس به سراغ مؤلفه‌های nodeها مانند kubelet، kube-proxy و container runtime می‌رویم. در ادامه، اشیاء مهم Kubernetes مانند Podها، Deploymentها، Serviceها، ConfigMapها و Secrets را بررسی کرده و تکنیک‌های پیشرفته‌ای مانند Pod Disruption Budgets (PDB)، Horizontal Pod Autoscaler (HPA)، توپولوژی اسپرید کانسترینت‌ها (Topology Spread Constraints) و graceful termination را با مثال‌های عملی کد YAML آموزش می‌دهیم. همچنین به مقایسه Kubernetes با Docker Swarm، راهکارهای امنیتی مانند RBAC و network policies، و چالش‌های ذخیره‌سازی با CSI می‌پردازیم. در پایان، پرسش‌های متداول شما پاسخ داده شده است.

کلمات کلیدی: Kubernetes, K8s, orchestration کانتینر, معماری Kubernetes, کنترل پلین, kube-apiserver, etcd, kube-scheduler, kubelet, Pod, Deployment, Service, Horizontal Pod Autoscaler, HPA, Pod Disruption Budget, PDB, RBAC, container runtime, kubectl, Production Kubernetes, سرویس اورکستراسیون, مدیریت کانتینر

مقدمه: چرا Kubernetes؟

در دنیای امروز توسعه نرم‌افزار، معماری‌های یکپارچه (Monolithic) جای خود را به میکروسرویس‌ها (Microservices) داده‌اند. اپلیکیشن‌های مدرن به مجموعه‌ای از سرویس‌های کوچک و مستقل تبدیل شده‌اند که هر کدام در کانتینرهای جداگانه اجرا می‌شوند . داکر (Docker) انقلابی در بسته‌بندی و اجرای برنامه‌ها ایجاد کرد، اما با افزایش تعداد کانتینرها، مدیریت دستی آن‌ها غیرممکن شد. اینجاست که ابزارهای orchestration یا هم‌آرای‌کننده کانتینر وارد میدان می‌شوند.

Kubernetes (که اغلب به صورت K8s هم نوشته می‌شود، چرا که ۸ حرف بین K و s وجود دارد) قدرتمندترین و محبوب‌ترین پلتفرم orchestration کانتینر در سال ۲۰۲۶ است . اما Kubernetes دقیقاً چه کاری انجام می‌دهد؟ به زبان ساده، Kubernetes مانند یک رهبر ارکستر عمل می‌کند. در یک ارکستر، نوازندگان مختلف سازهای متفاوتی می‌نوازند، اما رهressor است که با حرکات خود همه را هماهنگ کرده و قطعه را به بهترین شکل اجرا می‌کند. در دنیای فناوری، کانتینرهای شما همان نوازندگان هستند و Kubernetes رهبری است که مطمئن می‌شود همه چیز درست و هماهنگ پیش می‌رود .

مزایای کلیدی Kubernetes

چرا باید سازمان‌ها و تیم‌های فنی به سراغ Kubernetes بروند؟ دلایل متعددی وجود دارد:

  1. اتوماسیون و خودترمیمی (Self-Healing): Kubernetes به طور مداوم وضعیت کلاستر را با وضعیت مطلوبی که شما تعریف کرده‌اید مقایسه می‌کند. اگر یک کانتینر از کار بیفتد، Kubernetes بلافاصله آن را مجدداً راه‌اندازی می‌کند. اگر یک node از دسترس خارج شود، Podها را روی nodeهای سالم دیگر برنامه‌ریزی (Schedule) می‌کند .
  2. مقیاس‌پذیری (Scalability): با افزایش بار ترافیک، می‌توانید به راحتی تعداد نمونه‌های برنامه خود را افزایش دهید (Scale up) و با کاهش بار، آن‌ها را کاهش دهید (Scale down). این کار هم به صورت دستی و هم خودکار با استفاده از Horizontal Pod Autoscaler (HPA) امکان‌پذیر است .
  3. به‌روزرسانی بدون توقف (Rolling Updates): برای نسخه‌برداری جدید از برنامه، نیازی به قطع سرویس نیست. Kubernetes به تدریج نمونه‌های قدیمی را با نمونه‌های جدید جایگزین می‌کند. اگر مشکلی پیش بیاید، قابلیت بازگشت به نسخه قبلی (Rollback) نیز به سادگی فراهم است .
  4. قابلیت حمل (Portability): Kubernetes یک لایه انتزاعی بین برنامه و زیرساخت ایجاد می‌کند. به همین دلیل، برنامه‌ای که روی یک کلاستر Kubernetes در دیتاسنتر داخلی اجرا می‌شود، به راحتی می‌تواند به ابر (Cloud) یا محیط ترکیبی (Hybrid) منتقل شود .
  5. مدیریت کارآمد منابع: Kubernetes با بسته‌بندی هوشمندانه کانتینرها روی nodeها، از منابع سخت‌افزاری مانند CPU و RAM به بهترین شکل استفاده می‌کند و از هدررفت منابع جلوگیری می‌نماید .

با این حال، نباید از پیچیدگی Kubernetes غافل شد. راه‌اندازی و مدیریت یک کلاستر Kubernetes، به ویژه در محیط تولید، نیازمند دانش فنی عمیق و تجربه کافی است . در ادامه این مقاله، تمام جوانب این سیستم قدرتمند را با زبانی شیوا و مثال‌های کاربردی بررسی خواهیم کرد.

معماری Kubernetes: بررسی عمیق مؤلفه‌ها

برای تسلط بر Kubernetes، ابتدا باید معماری آن را به خوبی بشناسیم. یک کلاستر Kubernetes از دو بخش اصلی تشکیل شده است: صفحه کنترل (Control Plane) و نودهای کارگر (Worker Nodes) .

۱. صفحه کنترل (Control Plane)

صفحه کنترل مغز متفکر کلاستر است. تصمیم‌گیری‌های جهانی در مورد کلاستر (مانند زمان‌بندی Podها) و پاسخ‌دهی به رویدادها (مانند راه‌اندازی مجدد Podهای خراب) بر عهده این بخش است . مؤلفه‌های اصلی صفحه کنترل عبارتند از:

kube-apiserver

این مؤلفه، دروازه ورودی به کلاستر Kubernetes است. تمام درخواست‌ها، چه از طرف کاربر با ابزار kubectl و چه از طرف سایر مؤلفه‌ها، باید از طریق API Server عبور کنند . وظیفه اصلی آن اعتبارسنجی و پردازش درخواست‌ها و به‌روزرسانی وضعیت etcd است. kube-apiserver به گونه‌ای طراحی شده که قابلیت مقیاس‌دهی افقی (Horizontal Scaling) را دارد، یعنی می‌توانید چندین نمونه از آن را اجرا کرده و ترافیک را بین آن‌ها متوازن کنید .

etcd

etcd یک مخزن کلید-مقدار (Key-Value Store) قوی، با ثبات و با کارایی بالا است که به عنوان پایگاه داده پشتیبان Kubernetes عمل می‌کند . تمام اطلاعات مربوط به وضعیت کلاستر، کانفیگ‌ها، سکرت‌ها و … در اینجا ذخیره می‌شود. از آنجایی که etcd قلب داده‌های کلاستر است، باید برای آن برنامه پشتیبان‌گیری (Backup) منظم داشته باشید . در محیط‌های تولیدی، معمولاً etcd روی چندین node به صورت یک کلاستر جداگانه نصب می‌شود تا هم‌زمانی و دسترس‌پذیری بالا (High Availability) تضمین شود .

kube-scheduler

وظیفه این مؤلفه، نظارت بر Podهای تازه ایجاد شده‌ای است که هنوز به هیچ nodeای متصل نیستند و انتخاب بهترین node برای اجرای آن‌هاست . تصمیمات scheduler بر اساس فاکتورهای متعددی گرفته می‌شود، از جمله:

  • محدودیت‌های منابع سخت‌افزاری و نرم‌افزاری.
  • محدودیت‌های خط‌مشی (Policy Constraints) مانند قوانین امنیتی.
  • الزامات affinity و anti-affinity (تمایل یا عدم تمایل به اجرا در کنار Podهای دیگر).
  • موقعیت داده‌ها (Data Locality).
  • محدودیت‌های زمانی (Deadlines) .

kube-controller-manager

این مؤلفه، مسئول اجرای کنترل‌ر (Controller)ها است. کنترلرها فرآیندهای مستقلی هستند که به طور مداوم وضعیت فعلی کلاستر را با وضعیت مطلوب تعریف شده در etcd مقایسه کرده و در صورت مغایرت، اقدام به رفع آن می‌کنند . هر کنترلر یک وظیفه مشخص دارد، به عنوان مثال:

  • Node Controller: وقتی یک node از کار می‌افتد، این کنترلر متوجه شده و واکنش نشان می‌دهد.
  • Job Controller: Podهای مربوط به Jobها را برای انجام وظایف یک‌بار مصرف ایجاد می‌کند.
  • EndpointSlice Controller: ارتباط بین Serviceها و Podها را برقرار می‌کند.
  • ServiceAccount Controller: برای namespaceهای جدید، یک ServiceAccount پیش‌فرض ایجاد می‌کند .

cloud-controller-manager (اختیاری)

این مؤلفه به شما امکان می‌دهد کلاستر خود را به APIهای یک ارائه‌دهنده ابری متصل کنید . برای مثال، اگر روی سرویس مدیریت‌شده Azure Kubernetes Service (AKS) کار می‌کنید، این مؤلفه به شما اجازه می‌دهد از منابع ابری مانند Load Balancerها یا ذخیره‌سازی ابری مستقیماً از طریق Kubernetes استفاده کنید . در محیط‌های داخلی (On-Premise) نیازی به این مؤلفه نیست.

۲. نودهای کارگر (Worker Nodes)

Nodeها ماشین‌هایی (مجازی یا فیزیکی) هستند که برنامه‌های شما (یعنی Podها) روی آن‌ها اجرا می‌شوند . هر node شامل چند مؤلفه ضروری است:

kubelet

مهم‌ترین مؤلفه روی هر node است. kubelet یک عامل (Agent) است که مطمئن می‌شود کانتینرهای تعریف شده در PodSpecها سالم و در حال اجرا هستند . این مؤلفه با API Server در ارتباط است و دستورات را دریافت کرده و وضعیت node و Podها را گزارش می‌دهد.

kube-proxy

یک پراکسی شبکه است که روی هر node اجرا می‌شود و قوانین شبکه را پیاده‌سازی می‌کند . این قوانین امکان ارتباط شبکه‌ای با Podها را از داخل یا خارج کلاستر فراهم می‌کنند. kube-proxy معمولاً با استفاده از لایه packet filtering سیستم‌عامل (مثل iptables یا IPVS در لینوکس) این قوانین را اعمال می‌کند .

Container Runtime

نرم‌افزاری است که وظیفه اجرای کانتینرها را بر عهده دارد. Kubernetes از طریق رابطی به نام Container Runtime Interface (CRI) با runtimeهای مختلف ارتباط برقرار می‌کند . محبوب‌ترین runtimeها شامل containerd (که خود زیرمجموعه‌ای از Docker است) و CRI-O هستند.

اشیاء اصلی در Kubernetes (Kubernetes Objects)

Kubernetes برای مدیریت برنامه‌ها و زیرساخت، از یک سری آبجکت (شیء) استفاده می‌کند. شما با تعریف این اشیاء در فایل‌های YAML و ارسال آن‌ها به API Server، وضعیت مطلوب خود را به کلاستر اعلام می‌کنید.

Pod

کوچک‌ترین و پایه‌ترین واحد قابل استقرار در Kubernetes است . یک Pod نماینده یک یا چند کانتینر است که با هم روی یک node اجرا می‌شوند و منابعی مانند شبکه (IP مشترک) و فضای ذخیره‌سازی را به اشتراک می‌گذارند . هر کانتینر داخل یک Pod به صورت منطقی با دیگر کانتینرها هم‌مکان (Co-located) شده و چرخه حیات یکسانی دارند. اگرچه مدل رایج، یک Pod برای هر کانتینر است، اما در مواردی مانند یک وب‌سرور و یک پروکسی کمکی (Sidecar) که نیاز به ارتباط نزدیک دارند، می‌توان آن‌ها را در یک Pod قرار داد .

مثال YAML برای یک Pod ساده:

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

Deployment

به ندرت پیش می‌آید که مستقیماً یک Pod ایجاد کنید. معمولاً از Deployment برای مدیریت Podها استفاده می‌شود . یک Deployment یک تعریف اعلانی (Declarative) از یک مجموعه Pod و ReplicaSet است که وضعیت مطلوب شما را توصیف می‌کند. Deployment به شما امکان می‌دهد:

  • مقیاس‌دهی: تعداد replicas (نمونه‌های یکسان از Pod) را تعیین کنید.
  • به‌روزرسانی چرخشی (Rolling Update): نسخه جدید image را با کمترین downtime اعمال کنید.
  • بازگشت به نسخه قبل (Rollback): در صورت بروز مشکل، به نسخه پایدار قبلی بازگردید .

Service

Podها در Kubernetes فناناپذیر (Ephemeral) هستند. ممکن است هر لحظه خراب شوند و جابجا شوند و در نتیجه IP آن‌ها تغییر کند. Service یک لایه انتزاعی است که یک IP و DNS پایدار را برای مجموعه‌ای از Podها فراهم می‌کند و ترافیک را بین آن‌ها Load Balance می‌کند . انواع مختلف Service عبارتند از:

  • ClusterIP (پیش‌فرض): یک IP داخلی در کلاستر به Service اختصاص می‌دهد. فقط در داخل کلاستر قابل دسترسی است .
  • NodePort: یک پورت مشخص را روی هر node باز می‌کند و ترافیک آن پورت را به Service هدایت می‌کند. مناسب برای محیط‌های آزمایشی .
  • LoadBalancer: از زیرساخت ابری درخواست یک Load Balancer خارجی می‌دهد و ترافیک را به Service هدایت می‌کند. استاندارد محیط‌های تولید روی ابر .

Ingress

در حالی که Service در لایه ۴ (Transport Layer) کار می‌کند، Ingress در لایه ۷ (Application Layer) عمل می‌کند . Ingress مسیریابی ترافیک HTTP/HTTPS را بر اساس hostname یا مسیر (path) به Serviceهای مختلف مدیریت می‌کند. به عبارت ساده، Ingress مانند یک Reverse Proxy هوشمند (مثل Nginx) عمل می‌کند.

ConfigMap و Secret

برای جداسازی کد برنامه از کانفیگ، از این دو شیء استفاده می‌شود .

  • ConfigMap: برای ذخیره اطلاعات پیکربندی غیرمحرمانه مانند متغیرهای محیطی، آدرس پایگاه داده یا فایل‌های کانفیگ استفاده می‌شود.
  • Secret: مشابه ConfigMap است، اما برای ذخیره اطلاعات حساس مانند رمز عبور، توکن‌های API و کلیدهای SSH طراحی شده است. محتویات Secret به صورت base64 encoded ذخیره می‌شوند (و قابل رمزنگاری هستند) .

Namespace

Namespaceها راهی برای تقسیم یک کلاستر فیزیکی به چند کلاستر مجازی هستند . آن‌ها برای جداسازی محیط‌ها (مثل توسعه، تست، تولید) یا جداسازی تیم‌ها در یک سازمان بسیار مفیدند.

Kubernetes در مقابل Docker Swarm: چرا K8s استاندارد شده است؟

وقتی صحبت از orchestration کانتینر می‌شود، نام دو ابزار بیشتر از همه شنیده می‌شود: Docker Swarm و Kubernetes. Docker Swarm ابزار orchestration بومی داکر است که به دلیل سادگی و یکپارچگی با Docker CLI معروف است . اما در سال ۲۰۲۶، Kubernetes به استانداردی بی‌رقبا تبدیل شده است . بیایید دلایل آن را بررسی کنیم:

ویژگیDocker SwarmKubernetes (K8s)
هدفسادگی و راه‌اندازی سریع برای کلاسترهای کوچکانعطاف‌پذیری و قدرت بالا برای بارهای کاری پیچیده و بزرگ 
مقیاس‌پذیریمناسب برای کلاسترهای کوچک تا متوسطمقیاس‌دهی تا هزاران node و Pod با ابزارهایی مثل HPA 
شبکه‌سازیساده و built-inپیشرفته، با قابلیت تعریف Network Policy و پشتیبانی از CNIهای متنوع (Calico, Flannel و …) 
اکوسیستم و ابزارهامحدوداکوسیستم عظیم با ابزارهای فراوان برای مانیتورینگ (Prometheus)، logging (ELK)، امنیت و … 
بازیابی و High Availabilityقابلیت‌های پایهخودترمیمی پیشرفته، Pod Disruption Budgets و Topology Spread Constraints 
پشتیبانی Cloudمحدودپشتیبانی کامل توسط همه ارائه‌دهندگان ابری (EKS، AKS، GKE) 
جامعه و توسعهرو به decline و محدودبسیار پویا و گسترده با به‌روزرسانی‌های منظم 

به زبان ساده، اگر به دنبال راه‌اندازی یک برنامه ساده روی چند سرور محدود هستید و تیم فنی کوچکی دارید، Docker Swarm ممکن است انتخاب آسان‌تری باشد. اما اگر به دنبال مقیاس‌پذیری، انعطاف‌پذیری، خودترمیمی و استفاده از ابزارهای مدرن DevOps در سطح سازمانی هستید، Kubernetes تنها انتخاب منطقی است. همان‌طور که در مقاله معتبر Travis CI اشاره شده، “توانایی Kubernetes در مدیریت هزاران node و ارائه ویژگی‌های پیشرفته‌ای مانند Custom Resource Definitions (CRDs) و شبکه‌سازی پیچیده، آن را به گزینه‌ای برتر برای اپلیکیشن‌های سطح سازمانی تبدیل کرده است” .

پیاده‌سازی پیشرفته: آماده‌سازی برای محیط تولید (Production-Ready)

اجرای یک برنامه روی کلاستر توسعه شخصی با یک کلاستر تولیدی که ترافیک واقعی کاربران را دریافت می‌کند، تفاوت اساسی دارد. “این که برنامه‌ای اجرا شود، به معنای آماده بودن آن برای تولید نیست” . در این بخش، پیکربندی‌های حیاتی را که هر workload تولیدی باید داشته باشد، بررسی می‌کنیم.

۱. Pod Disruption Budget (PDB)

هنگامی که نیاز به تخلیه (Drain) یک node برای تعمیرات یا به‌روزرسانی داشته باشید، Kubernetes ممکن است Podها را جابجا کند. بدون محدودیت، ممکن است همه Podهای یک سرویس حیاتی هم‌زمان از دسترس خارج شوند. PDB مشخص می‌کند که در طول این اختلالات داوطلبانه (Voluntary Disruptions)، حداقل چه تعداد Pod باید در دسترس بمانند .

مثال: فرض کنید یک Deployment با ۵ replica دارید. با یک PDB مشخص می‌کنید که همیشه حداقل ۳ Pod باید در دسترس باشند.

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: api-pdb
spec:
  minAvailable: 3
  selector:
    matchLabels:
      app: my-api

با این تنظیم، در هنگام تخلیه node، Kubernetes مطمئن می‌شود که بیش از ۲ Pod از سرویس خارج نشوند .

۲. Startup و Readiness Probes

این دو پروب برای مدیریت چرخه حیات Pod ضروری هستند .

  • Startup Probe: به برنامه‌هایی که زمان راه‌اندازی طولانی دارند، فرصت کافی می‌دهد. تا زمانی که این پروب موفق نشود، Liveness و Readiness پروب‌ها فعال نمی‌شوند.
  • Readiness Probe: مشخص می‌کند که آیا یک Pod آماده دریافت ترافیک است یا خیر. اگر این پروب با شکست مواجه شود، Pod از لیست Endpoints Service مربوطه حذف می‌شود و ترافیکی به آن ارسال نمی‌گردد. این برای جلوگیری از ارسال درخواست به Podهایی که هنوز در حال بارگذاری اولیه هستند یا موقتاً مشکل دارند، حیاتی است.

مثال:

readinessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 2

startupProbe:
  httpGet:
    path: /startup
    port: 8080
  failureThreshold: 30
  periodSeconds: 2

این تنظیم به کانتینر تا ۵ دقیقه (۳۰ بار با فاصله ۲ ثانیه) فرصت می‌دهد تا بالا بیاید و پس از آن، هر ۲ ثانیه یکبار آمادگی آن را بررسی می‌کند .

۳. Horizontal Pod Autoscaler (HPA)

مقیاس‌دهی دستی در محیط‌های پویا کارآمد نیست. HPA به طور خودکار تعداد replicaهای یک Deployment را بر اساس معیارهایی مانند مصرف CPU، RAM یا معیارهای سفارشی (Custom Metrics) تنظیم می‌کند .

مثال: اگر میانگین مصرف CPU Podها از ۷۰٪ بیشتر شود، HPA به طور خودکار تعداد replicaها را تا سقف ۱۰ عدد افزایش می‌دهد.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-api
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

توجه داشته باشید که برای عملکرد صحیح HPA، باید برای Podهای خود resource request تعریف کرده باشید .

۴. Topology Spread Constraints

این ویژگی تضمین می‌کند که Podهای یک workload به طور متوازن بین دامنه‌های توپولوژی مختلف (مانند zoneها، regionها یا nodeها) توزیع شوند . هدف اصلی جلوگیری از قرار گرفتن همه تخم‌مرغ‌ها در یک سبد و افزایش تاب‌آوری در برابر خرابی یک منطقه است.

مثال: Podهای اپلیکیشن my-api باید تا حد امکان به طور یکنواخت بین zoneهای مختلف توزیع شوند.

spec:
  topologySpreadConstraints:
    - maxSkew: 1
      topologyKey: topology.kubernetes.io/zone
      whenUnsatisfiable: ScheduleAnyway
      labelSelector:
        matchLabels:
          app: my-api

مقدار maxSkew: 1 به این معناست که تفاوت تعداد Podها بین zoneها نمی‌تواند بیشتر از ۱ باشد .

۵. PriorityClass

همه Podها اهمیت یکسانی ندارند. PriorityClass به شما امکان می‌دهد برای workloadهای حیاتی اولویت بالاتری تعریف کنید . اگر منابع کافی در کلاستر وجود نداشته باشد، Scheduler Podهای با اولویت پایین‌تر را حذف (Evict) می‌کند تا جای خود را به Podهای با اولویت بالاتر بدهد.

مثال: تعریف یک PriorityClass با اولویت بسیار بالا.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 100000
preemptionPolicy: PreemptLowerPriority
globalDefault: false

سپس می‌توانید این priority class را در مشخصات Pod خود ارجاع دهید:

spec:
  priorityClassName: high-priority

۶. خاتمه‌دهی صحیح و با احترام (Graceful Termination)

وقتی Kubernetes تصمیم می‌گیرد یک Pod را خاتمه دهد (برای مثال، در هنگام مقیاس‌دهی به پایین)، یک سیگنال SIGTERM به کانتینر ارسال می‌کند و مدت زمان مشخصی (پیش‌فرض ۳۰ ثانیه) صبر می‌کند تا برنامه کار خود را تمام کند. اگر برنامه این سیگنال را به درستی مدیریت نکند، ممکن است درخواست‌های نیمه‌کاره از بین بروند .

برای پیاده‌سازی graceful termination:

  1. در کد برنامه: یک handler برای سیگنال SIGTERM بنویسید. در این handler، سرور HTTP را ببندید تا درخواست جدیدی دریافت نکند، و سپس درخواست‌های در حال پردازش را کامل کنید.
    مثال در Node.js:
process.on('SIGTERM', () => {
  server.close(() => {
    console.log('Server closed gracefully.');
    process.exit(0);
  });
});

در manifest Pod: مقدار terminationGracePeriodSeconds را متناسب با حداکثر زمانی که برنامه برای پایان کار نیاز دارد، تنظیم کنید 

spec:
  terminationGracePeriodSeconds: 30

تیم فنی وب‌سایت درفک‌آی‌تی (DorfakIT.ir) با سال‌ها تجربه در زمینه پیاده‌سازی و مدیریت کلاسترهای Kubernetes در محیط‌های تولیدی، می‌تواند شما را در این مسیر یاری کند. چه به دنبال مشاوره برای طراحی معماری، راه‌اندازی اولیه کلاستر، مهاجرت از Docker Swarm، یا بهینه‌سازی کلاستر موجود خود باشید، متخصصان ما در درفک‌آی‌تی آماده ارائه راهکارهای حرفه‌ای متناسب با نیاز کسب‌وکار شما هستند.

امنیت در Kubernetes (امنیت کوبرنتیز)

امنیت در Kubernetes یک موضوع چندلایه است و باید از زوایای مختلف به آن پرداخته شود.

۱. RBAC (Role-Based Access Control)

RBAC مکانیزم اصلی برای کنترل دسترسی به منابع API در Kubernetes است . با RBAC می‌توانید تعیین کنید که هر کاربر (یا ServiceAccount) چه عملیاتی (مثلاً get، list، create) را روی چه منابعی (مثلاً Podها، Deploymentها) در کدام namespaceها می‌تواند انجام دهد.

  • Role: مجموعه‌ای از قوانین دسترسی در یک namespace خاص.
  • ClusterRole: مشابه Role است، اما در سطح کلاستر اعمال می‌شود (برای منابع غیر namespaceدار مثل Nodeها).
  • RoleBinding: یک Role را به یک کاربر در یک namespace خاص متصل می‌کند.
  • ClusterRoleBinding: یک ClusterRole را به یک کاربر در سطح کلاستر متصل می‌کند.

۲. Network Policies

به طور پیش‌فرض، هر Pod می‌تواند با هر Pod دیگری در کلاستر ارتباط برقرار کند. Network Policy یک منبع (Resource) است که به شما امکان می‌دهد با استفاده از برچسب‌ها (Labels)، قوانین فایروال برای ترافیک ورودی (Ingress) و خروجی (Egress) Podها تعریف کنید . برای استفاده از Network Policy، به یک CNI پشتیبانی‌کننده مانند Calico نیاز دارید .

۳. Secret Management

همان‌طور که اشاره شد، Secrets برای ذخیره اطلاعات حساس به کار می‌روند. برای افزایش امنیت:

  • از رمزنگاری Secrets در etcd استفاده کنید.
  • از ابزارهای تخصصی‌تر مانند HashiCorp Vault در کنار Kubernetes بهره ببرید .

۴. Pod Security Standards

مجموعه‌ای از سیاست‌ها برای کنترل شرایط اجرای Podها. این سیاست‌ها در سه سطح تعریف می‌شوند: Privileged (بدون محدودیت)، Baseline (حداقل محدودیت‌ها)، و Restricted (پیروی از بهترین شیوه‌های امنیتی) .

ذخیره‌سازی پایدار با CSI

کانتینرها ذاتاً بی‌حالت (Stateless) هستند و داده‌های خود را با از بین رفتن Pod از دست می‌دهند. برای اجرای برنامه‌های حالت‌دار (Stateful) مانند پایگاه‌های داده، به ذخیره‌سازی پایدار (Persistent Storage) نیاز داریم .

Container Storage Interface (CSI) یک استاندارد برای اتصال سیستم‌های ذخیره‌سازی مختلف به Kubernetes است. مفاهیم کلیدی عبارتند از:

  • PersistentVolume (PV): یک قطعه ذخیره‌سازی در کلاستر که توسط administrator Provision شده است.
  • PersistentVolumeClaim (PVC): درخواست یک کاربر برای ذخیره‌سازی. یک PVC به یک PV متصل می‌شود.
  • StorageClass: به Kubernetes می‌گوید که چگونه یک PV را به صورت پویا (Dynamic) Provision کند.

عیب‌یابی (Troubleshooting) در Kubernetes

برخی از دستورات پرکاربرد kubectl برای عیب‌یابی:

  • kubectl get pods: نمایش وضعیت Podها.
  • kubectl describe pod <pod-name>: نمایش اطلاعات دقیق و رویدادهای مرتبط با یک Pod .
  • kubectl logs <pod-name>: نمایش لاگ‌های یک Pod .
  • kubectl logs <pod-name> -c <container-name>: نمایش لاگ‌های یک کانتینر خاص در یک Pod چند کانتینره.
  • kubectl exec -it <pod-name> -- /bin/sh: دسترسی به شل یک کانتینر در حال اجرا.
  • kubectl get events --sort-by='.lastTimestamp': مشاهده رویدادهای کلاستر به ترتیب زمانی.

نتیجه‌گیری

Kubernetes به عنوان استاندارد طلایی orchestration کانتینر، انقلابی در نحوه توسعه، استقرار و مدیریت نرم‌افزارها ایجاد کرده است. یادگیری مفاهیم معماری، اشیاء اصلی و تکنیک‌های پیشرفته آن برای هر متخصص DevOps و توسعه‌دهنده‌ای ضروری است. اگرچه پیچیدگی‌های خاص خود را دارد، مزایای آن در مقیاس‌پذیری، خودترمیمی، و پورتابلیتی، آن را به انتخابی بی‌بدیل برای سازمان‌هایی تبدیل کرده که به دنبال ارائه سرویس‌های پایدار و قابل اعتماد هستند. با رعایت نکات و پیکربندی‌های مطرح شده در این مقاله، می‌توانید workloadهای خود را با اطمینان بیشتری در محیط‌های تولیدی روی Kubernetes اجرا کنید.

سوالات متداول (FAQ)

۱. س: تفاوت اصلی بین Docker Swarm و Kubernetes چیست؟
پ: Docker Swarm بر سادگی و راه‌اندازی سریع تمرکز دارد، در حالی که Kubernetes بر قدرت، انعطاف‌پذیری و مقیاس‌پذیری برای بارهای کاری پیچیده و بزرگ متمرکز است. Kubernetes ویژگی‌های پیشرفته‌تری مانند خودترمیمی، مقیاس‌دهی خودکار، شبکه‌سازی پیشرفته و اکوسیستم بسیار گسترده‌تری دارد .

۲. س: چگونه می‌توانم مشکل Crash کردن مداوم Pod را عیب‌یابی کنم؟
پ: ابتدا از دستور kubectl describe pod <pod-name> استفاده کنید تا رویدادها و دلیل شکست را ببینید. سپس با دستور kubectl logs <pod-name> لاگ‌های برنامه را بررسی کنید. اگر Pod در حال راه‌اندازی مجدد است، می‌توانید از گزینه kubectl logs --previous <pod-name> برای دیدن لاگ‌های اجرای قبلی استفاده کنید .

۳. س: بهترین روش برای ذخیره رمز عبور پایگاه داده در Kubernetes چیست؟
پ: از شیء Secret استفاده کنید. رمز عبور را با استفاده از kubectl create secret generic ایجاد کرده و سپس در فایل Deployment خود، این Secret را به عنوان متغیر محیطی (Environment Variable) یا Volume به Pod متصل کنید. از هاردکد کردن رمز عبور در فایل‌های YAML جدا خودداری کنید .

۴. س: Pod Disruption Budget (PDB) چه کاربردی دارد و چرا مهم است؟
پ: PDB تضمین می‌کند که در طول رویدادهای نگهداری (مثل تخلیه nodeها)، تعداد مشخصی از Podهای یک برنامه همیشه در دسترس باشند. این کار از قطع کامل سرویس در هنگام عملیات عادی و برنامه‌ریزی شده روی کلاستر جلوگیری می‌کند .

۵. س: چگونه می‌توانم مطمئن شوم که برنامه من بعد از راه‌اندازی، ترافیک را دریافت کند؟
پ: از Readiness Probe استفاده کنید. این پروب به Kubernetes می‌گوید که Pod چه زمانی آماده دریافت ترافیک است. تا زمانی که این پروب موفق نشود، IP آن Pod به Service مربوطه اضافه نخواهد شد و ترافیکی به آن ارسال نمی‌گردد .

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *