مرا به خاطر بسپار

مدیریت پیشرفته منابع و مقیاس‌بندی در کوبرنتیز

بازدید: 496 آخرین به‌روزرسانی: 17 تیر 1404

مقدمه

در مقالات قبلی با مفاهیم پایه‌ای کوبرنتیز آشنا شدید و دانستید که این پلتفرم متن‌باز چگونه مدیریت، استقرار و اجرای برنامه‌های کانتینری را ساده‌تر می‌کند(می‌توانید مقالات را از این لینک بخوانید). همچنین، معماری کوبرنتیز، اجزای اصلی آن مانند گره‌ها، پادها، سرویس‌ها و دیپلوی‌ها، و نحوه راه‌اندازی یک خوشه محلی با استفاده از Minikube را بررسی کردیم. حالا که پایه‌ای محکم از مفاهیم اولیه کوبرنتیز دارید، زمان آن رسیده است که به مباحث پیشرفته‌تر بپردازیم.
در این مقاله، به شما نشان می‌دهیم که چگونه می‌توانید منابع خوشه کوبرنتیز خود را بهینه مدیریت کنید و برنامه‌های خود را به‌صورت پویا مقیاس‌بندی کنید تا با نیازهای متغیر بار کاری سازگار شوند. این موضوع برای اجرای برنامه‌های مقیاس‌پذیر و قابل‌اعتماد در محیط‌های واقعی بسیار حیاتی است. ما به مفاهیمی مانند تنظیم محدودیت‌های منابع (Resource Limits)، مقیاس‌بندی خودکار (Autoscaling)، مدیریت سیاست‌های پیشرفته، و بهینه‌سازی عملکرد خوشه خواهیم پرداخت. همچنین، با ابزارها و روش‌هایی آشنا می‌شوید که به شما کمک می‌کنند تا منابع محاسباتی را به‌طور کارآمد تخصیص دهید و از پایداری برنامه‌های خود اطمینان حاصل کنید.

چرا مدیریت منابع و مقیاس‌بندی مهم است؟

در محیط‌های تولیدی، برنامه‌ها با بارهای کاری متفاوتی مواجه می‌شوند. بدون مدیریت صحیح منابع، ممکن است با مشکلاتی مانند استفاده بیش‌ازحد از CPU یا حافظه، خرابی برنامه‌ها، یا هدررفت منابع مواجه شوید. کوبرنتیز، ابزارها و قابلیت‌های قدرتمندی برای مدیریت این چالش‌ها ارائه می‌دهد، از جمله:
تخصیص دقیق منابع: تعیین حداقل و حداکثر منابعی که هر پاد می‌تواند استفاده کند.
مقیاس‌بندی افقی و عمودی: افزایش یا کاهش تعداد پادها یا منابع تخصیص‌یافته به آن‌ها بر اساس نیاز.
مدیریت پیشرفته خوشه: استفاده از سیاست‌ها و ابزارهایی برای بهینه‌سازی عملکرد و پایداری.
در ادامه این مقاله، این موضوعات را با جزئیات بررسی می‌کنیم و مثال‌های عملی ارائه می‌دهیم تا بتوانید این مفاهیم را در خوشه‌های خود پیاده‌سازی کنید. هدف ما این است که شما را برای مدیریت حرفه‌ای خوشه‌های کوبرنتیز در محیط‌های پیچیده آماده کنیم.

فایل‌های YAML را کجا بنویسیم و اجرا کنیم؟

قبل از تنظیم درخواست و منابع، در این بخش، کار با فایل‌های YAML را یادآوری می‌کنیم.
کدهای Kubernetes معمولاً در فایل‌های YAML (با پسوند .yaml یا .yml) نوشته می‌شوند.

مثلاً:

pod.yaml (برای تعریف یک پاد)
deployment.yaml (برای تعریف دپلویمنت)
hpa.yaml (برای تنظیم Horizontal Pod Autoscaler)

چگونه یک فایل YAML ایجاد کنیم؟

با هر ادیتور متنی مثل VS Code, Notepad++, یا حتی nano/vim در لینوکس می‌توانید فایل YAML بسازید.

مثال:

nano pod.yaml

سپس کدهای موردنظر را Paste کرده و ذخیره کنید.
چگونه فایل YAML را اجرا کنیم؟
از دستور kubectl apply استفاده می‌کنیم:

kubectl apply -f pod.yaml

اگر فایل در مسیر دیگری است، مسیر کامل را می‌دهیم:

kubectl apply -f /path/to/your/file.yaml

چطور بررسی کنیم که اجرا شده یا نه؟
می‌توانید از دستورات زیر به ترتیب برای لیست کردن پادها، مشاهده جزئیات یک پاد و مشاهده لاگ‌های هر پاد استفاده کنید:
kubectl get pods
kubectl describe pod pod_name
kubectl logs pod_name

تنظیم درخواست‌ها و محدودیت‌های منابع

یکی از مهم‌ترین جنبه‌های مدیریت منابع در کوبرنتیز، تعریف درخواست‌های منابع (Resource Requests) و محدودیت‌های منابع (Resource Limits) برای پادها است. این تنظیمات به کوبرنتیز کمک می‌کنند تا منابع محاسباتی (CPU و حافظه) را به‌طور کارآمد بین پادها تخصیص دهد و از پایداری خوشه اطمینان حاصل کند.
درخواست‌ها (Requests): حداقل منابعی که یک پاد برای اجرا نیاز دارد. Scheduler یعنی زمان‌بند کوبرنتیز از این اطلاعات برای انتخاب گره‌ای مناسب برای اجرای پاد استفاده می‌کند. اگر منابع یک گره کافی نباشد، پاد روی آن زمان‌بندی نمی‌شود.
محدودیت‌ها (Limits): حداکثر منابعی که یک پاد می‌تواند مصرف کند. این تنظیم از مصرف بیش ‌از حد منابع توسط یک پاد جلوگیری می‌کند و از تأثیر منفی روی سایر پادها یا خوشه جلوگیری می‌کند.
چرا این تنظیمات مهم‌اند؟
بهینه‌سازی منابع: درخواست‌ها به کوبرنتیز کمک می‌کنند تا گره‌های مناسب را انتخاب کند و از تخصیص بیش‌ازحد منابع جلوگیری کند.
پایداری خوشه: محدودیت‌ها مانع از آن می‌شوند که یک پاد معیوب منابع کل گره را مصرف کند و باعث خرابی سایر برنامه‌ها شود.
مدیریت هزینه‌ها: در محیط‌های ابری، تخصیص دقیق منابع می‌تواند هزینه‌های زیرساخت را کاهش دهد.
بهتر است مثال‌هایی از تعریف درخواست‌ها و محدودیت‌ها ببینیم:
۱. تعریف Requests و Limits برای CPU و Memory
در فایل مانیفست پاد (pod.yaml):
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: nginx-container
    image: nginx
    resources:
      requests:
        cpu: "100m"    # 0.1 واحد CPU
        memory: "128Mi" # 128 مگابایت
      limits:
        cpu: "500m"    # 0.5 واحد CPU
        memory: "512Mi" # 512 مگابایت

CPU:

100m به معنی ۰.۱ هسته CPU است (۱ هسته کامل = 1000m).

اگر مقدار 1 باشد، یعنی یک هسته کامل CPU درخواست شده است.

Memory:

128Mi = ۱۲۸ مگابایت.

1Gi = ۱ گیگابایت.

۲. مثال با Deployment

در یک Deployment، می‌توانید منابع را برای تمام رپلیکاها تعریف کنید:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        resources:
          requests:
            cpu: "200m"
            memory: "256Mi"
          limits:
            cpu: "1"
            memory: "1Gi"
۳. محدودیت‌های Namespace (ResourceQuota)
می‌توانید در سطح Namespace محدودیت‌های کلی اعمال کنید تا تمام پادها از یک سقف مشخص فراتر نروند:
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-quota
spec:
  hard:
    requests.cpu: "2"      # مجموع درخواستهای CPU در Namespace
    requests.memory: "4Gi"  # مجموع درخواستهای Memory
    limits.cpu: "4"         # مجموع محدودیتهای CPU
    limits.memory: "8Gi"    # مجموع محدودیتهای Memory
نکات مهم
CPU یک منبع فشرده‌شونده (Compressible) است؛ اگر از Limit بگذرد، کوبرنتیز پردازش را کاهش می‌دهد.
Memory یک منبع غیرفشرده‌شونده (Incompressible) است؛ اگر از Limit بگذرد، پاد ممکن است قطع شود (OOMKilled).
اگر Requests را تعیین نکنید، پاد ممکن است در نودهایی با منابع کم قرار گیرد و دچار مشکل شود. ممکن است برنامه با خطای "Out of Memory" یا "CPU Throttling" مواجه شود.

مقیاس‌بندی خودکار پادها

مقیاس‌بندی خودکار پادها یا همان Horizontal Pod Autoscaler (HPA) به کوبرنتیز امکان می‌دهد تا تعداد پادهای یک دیپلوی یا ReplicaSet را بر اساس معیارهای مشخص (مثل استفاده از CPU، حافظه یا معیارهای سفارشی) به‌صورت خودکار افزایش یا کاهش دهد. این قابلیت برای مدیریت بارهای کاری پویا، مثل افزایش ترافیک وب در ساعات اوج، بسیار مفید است.
پیش‌نیازها
  • نصب Metrics Server برای جمع‌آوری معیارهای منابع:
  • دیپلوی یا ReplicaSet با درخواست‌ها و محدودیت‌های منابع تعریف‌شده.
 
مثال تنظیم HPA:
```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
در این کد:
scaleTargetRef: دیپلوی هدف (در اینجا nginx-deployment) را مشخص می‌کند.
minReplicas و maxReplicas: تعداد پادها را بین 2 تا 10 نگه می‌دارد.
metrics: برای مثال با تنظیم پارامتر averageUtilization، اگر میانگین استفاده CPU از 70٪ بیشتر شود، HPA تعداد پادها را افزایش می‌دهد.
سپس با استفاده از دستور زیر میتوانید فایل را اعمال کنید.
kubectl apply -f nginx-hpa.yaml
همچنین برای بررسی وضعیت HPA میتوانید از دستورات زیر استفاده کنید.
kubectl get hpa
kubectl describe hpa nginx-hpa
معیارهای سفارشی:
علاوه بر CPU و حافظه، می‌توانید از معیارهای سفارشی (مثل تعداد درخواست‌های HTTP در ثانیه) با ابزارهایی مثل Prometheus Adapter استفاده کنید.
نکات عملی:
برای جلوگیری از نوسانات غیرضروری، از پارامترهایی مثل stabilizationWindowSeconds در تنظیمات HPA استفاده کنید.
مطمئن شوید که Metrics Server به‌درستی کار می‌کند؛ بدون آن، HPA نمی‌تواند معیارها را بخواند.

مقیاس‌بندی خودکار خوشه

Cluster Autoscaler تعداد گره‌های خوشه را بر اساس نیازهای بار کاری تنظیم می‌کند. اگر پادها به دلیل کمبود منابع قابل زمان‌بندی نباشند، گره‌های جدیدی اضافه می‌شوند. اگر گره‌ها بدون استفاده باشند، حذف می‌شوند. این قابلیت به‌ویژه در محیط‌های ابری برای مدیریت هزینه‌ها و مقیاس‌پذیری بسیار مفید است.
پیش‌نیازها
  • خوشه‌ای که از ارائه‌دهندگان ابری (مثل AWS، GCP، یا Azure) پشتیبانی می‌کند.
  • نصب Cluster Autoscaler متناسب با ارائه‌دهنده ابر.
مثال: تنظیم Cluster Autoscaler (برای AWS):
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-autoscaler
  namespace: kube-system
data:
  config: |
    cloudProvider: aws
    awsRegion: us-west-2
    minNodes: 1
    maxNodes: 10
نکات عملی:
Cluster Autoscaler با HPA ترکیب می‌شود تا هم تعداد پادها و هم تعداد گره‌ها بهینه شوند.
برای جلوگیری از حذف زودهنگام گره‌ها، از تنظیماتی مثل scale-down-delay-after-add استفاده کنید.

مدیریت سیاست‌های پیشرفته

مدیریت سیاست‌های پیشرفته یعنی Taints و Tolerations برای کنترل اینکه کدام پادها روی کدام گره‌ها اجرا شوند استفاده می‌شوند. این ابزار در خوشه‌های ناهمگن (مثل گره‌های با GPU یا حافظه بالا) یا برای جداسازی بارهای کاری خاص (مثل برنامه‌های تولیدی و تستی) بسیار مفید است.
Taints
Taint به یک گره اعمال می‌شود و از زمان‌بندی پادها روی آن گره جلوگیری می‌کند، مگر اینکه پاد Toleration مناسب داشته باشد.
مثال اعمال Taint:
kubectl taint nodes node1 key1=value1:NoSchedule
NoSchedule: پادها بدون Toleration مناسب روی این گره زمان‌بندی نمی‌شوند.
Tolerations
Toleration به پاد اجازه می‌دهد روی گره‌ای با Taint خاص اجرا شود.
مثال تنظیم Toleration:
```yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoSchedule"
```
نکات عملی:
از Taints برای رزرو گره‌های خاص (مثل گره‌های با GPU) برای بارهای کاری خاص استفاده کنید.
می‌توانید از effect: PreferNoSchedule برای انعطاف‌پذیری بیشتر استفاده کنید (به‌جای مسدود کردن کامل زمان‌بندی).

مانیتورینگ و بهینه‌سازی منابع

برای مدیریت پیشرفته منابع، مانیتورینگ یا نظارت دقیق خوشه ضروری است. ابزارهای Prometheus (برای جمع‌آوری معیارها) و Grafana (برای تجسم داده‌ها) استانداردهای صنعتی برای این منظور هستند.
نصب Prometheus
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:latest
        ports:
        - containerPort: 9090
```
دستورات نصب:
 
kubectl create namespace monitoring
kubectl apply -f prometheus-deployment.yaml
دسترسی به Prometheus:
kubectl port-forward -n monitoring svc/prometheus 9090:9090
نصب Grafana
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      containers:
      - name: grafana
        image: grafana/grafana:latest
        ports:
        - containerPort: 3000
دستورات نصب:
kubectl apply -f grafana-deployment.yaml
kubectl port-forward -n monitoring svc/grafana 3000:3000
سپس در مرورگر به http://localhost:3000 بروید (نام کاربری و رمز پیش‌فرض: admin/admin).
نکات عملی:
  1. از داشبوردهای آماده Grafana برای کوبرنتیز (مثل داشبورد ID 3119) استفاده کنید.
  2. معیارهای کلیدی مثل استفاده CPU، حافظه، و تعداد درخواست‌های شبکه را مانیتور کنید.
  3. برای معیارهای سفارشی، از Prometheus Adapter برای ادغام با HPA استفاده کنید.
  4. همیشه تنظیمات جدید (مثل HPA یا محدودیت‌ها) را در محیط‌های تستی مثل Minikube امتحان کنید.
  5. به صورت مداوم از ابزارهای مانیتورینگ برای شناسایی گلوگاه‌ها و تنظیم دقیق منابع استفاده کنید.
  6. ظرفیت خوشه را بر اساس پیش‌بینی بار کاری تنظیم و مدیریت کنید و از Cluster Autoscaler برای مقیاس‌بندی خودکار استفاده کنید.
  7. اطمینان حاصل کنید که دسترسی به ابزارهای مانیتورینگ (مثل Prometheus) محدود شده و امنیت برقرار است.
  8. همیشه از فایل‌های YAML برای تعریف منابع استفاده کنید تا مدیریت و نسخه‌بندی آسان‌تر شود.

جمع‌بندی

در این مقاله، به جنبه‌های پیشرفته مدیریت منابع و مقیاس‌بندی در کوبرنتیز پرداختیم. با تنظیم درخواست‌ها و محدودیت‌های منابع، می‌توانید مصرف CPU و حافظه را بهینه کنید. مقیاس‌بندی خودکار پادها (HPA) و خوشه (Cluster Autoscaler) به شما امکان می‌دهد تا با بارهای کاری متغیر سازگار شوید. سیاست‌های پیشرفته مثل Taints و Tolerations کنترل دقیق‌تری بر زمان‌بندی پادها فراهم می‌کنند و ابزارهای مانیتورینگ مثل Prometheus و Grafana به شما کمک می‌کنند تا عملکرد خوشه را به‌طور مداوم بررسی کنید.

در بخش‌های بعدی، به موضوعات پیشرفته‌تری مانند مدیریت پیکربندی با Helm، پیاده‌سازی CI/CD در کوبرنتیز، و امنیت خوشه خواهیم پرداخت. این مقاله پایه‌ای محکم برای مدیریت حرفه‌ای خوشه‌های کوبرنتیز در اختیارتان قرار می‌دهد

سوالات متداول

  1. چگونه می‌توانم مصرف منابع خوشه را بهینه کنم؟
از درخواست‌ها و محدودیت‌های منابع استفاده کنید، معیارهای خوشه را با Prometheus مانیتور کنید، و از HPA و Cluster Autoscaler برای مقیاس‌بندی خودکار استفاده کنید.
  1. تفاوت HPA و Cluster Autoscaler چیست؟
HPA تعداد پادها را بر اساس معیارهای منابع تنظیم می‌کند، در حالی که Cluster Autoscaler تعداد گره‌های خوشه را بر اساس نیازهای زمان‌بندی تنظیم می‌کند.
  1. آیا یادگیری کوبرنتیز برای DevOps ضروری است؟
بله، کوبرنتیز استاندارد صنعتی برای مدیریت کانتینرهاست و برای نقش‌های DevOps، مهندسی ابر، و معماری سیستم‌ها بسیار مهم است.

منابع

https://simorgh.cloud/index.php/blog/resource-management-and-scaling-in-kubernetes
تا چه حد این مطلب برای شما مفید بود؟
بر اساس رای 0 نفر

اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

ثبت نظر

نظر دادن