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

پیش‌نیازها

تنها پیش نیاز این سیستم، داشتن اکانت ابر آروان و دسترسی به سکوی ابری آروان است. ابتدا وارد حساب کاربری خود شوید. سپس به بخش پروفایل رفته و در سربرگ API KEYS برای خود یک API KEY جدید ساخته و آن را در جایی ذخیره کنید.

برای انجام مراحل این مقاله نیاز است که از کامند لاین ابر آروان استفاده کنید، در صورت نیاز آن را در PATH خود قرار داده و دسترسی اجرایی به آن بدهید و از طریق خط فرمان لاگین کنید:

arvan login

سپس API KEY که از سایت دریافت کرده‌اید را در ادامه خط فرمان بالا پیست کنید.

HPA چیست؟

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

افزایش تعداد اپلیکیشن‌ها در سکوی ابری آروان به وسیله افزایش پارامتر replicas در deployment انجام می‌پذیرد.
حال در صورتی که این افزایش لود موقت بوده، و یا در ساعات متفاوتی در روز انجام می‌پذیرد و سپس به حالت عادی بازمی‌گردد، تغییر تعداد اپلیکیشن‌ها به صورت دستی می‌تواند کار طاقت فرسایی باشد و یا در صورت فراموشی، موجب بروز خطا در پاسخ‌دهی سرویس شود. از طرفی، در صورتی که مقدار زیادی منابع را به اپلیکیشن به صورت دایمی اختصاص دهید، در زمان‌هایی که لود پایینی وجود دارد، برخی از منابع بلا استفاده مانده و هزینه اضافی برای شما محاسبه می‌شود.

HPA یا HorizontalPodAutoscaler با دریافت یک‌ سری تنظیمات اولیه، اطمینان حاصل می‌کند که در صورتی که لود بر روی اپلیکیشن شما از مقدار مشخصی بیشتر شد، با اضافه کردن خودکار تعداد replicaها، سرویس شما با محدودیت منابع برای پاسخ‌گویی به درخواست‌ها مواجه نشود. از طرفی در صورت کاهش لود، با کم کردن خودکار تعداد replicaها از هدر رفتن منابع و هزینه‌های اضافی جلوگیری می‌کند.

نکته: HPA در سکوی ابری آروان تنها روی deploymentهایی که دیسک دایمی ندارند ( به اصطلاح سرویس‌های stateless) قابل اعمال است.

Readiness Probe چیست؟

پیش از بیان نحوه استفاده از HPA می‌بایست با مفهوم Readiness Probe آشنا شویم. یک برنامه در حال اجرا به دلایل مختلقی ممکن است دچار خطا شده و اجرای آن با مشکل مواجه شود. در سکوی ابری آروان، در صورتی که برنامه دچار برخی خطا‌ها شود، در صورتی که از deployment استفاده شده باشد، Pod مورد نظر به صورت خودکار ری‌ستارت می‌شود. با این حال، برخی حالات خطا ممکن است توسط سکوی ابری آروان تشخیص داده نشود و کانتینر مورد نظر همچنان بالا باشد ولی نمی‌تواند سرویس‌دهی به درخواست‌ها را به درستی انجام دهد. برای حل این مساله می‌توان از Readiness Probe استفاده کرد.

نکته: در کنار مفهوم Readiness Probe مفهوم دیگری به نام Liveness Probe وجود دارد که هر دوی این مفاهیم در مقاله دیگری به تفصیل بررسی خواهد شد و در اینجا صرفن اشاره مختصری به Readiness Probe می‌شود.

با تعریف Readiness Probe می‌توان شرایطی را مشخص کرد که سکوی ابری آروان به صورت خودکار برقراری این شرایط را بررسی و در صورت عدم برقراری این شرایط، با حذف IP مربوط به Pod از Endpoint تمام Serviceها، از ورود ترافیک به Pod جلوگیری می‌کند.

نکته: برای استفاده از HPA، تعریف Readiness Probe در Deployment اجباری است.

استفاده از HPA

چنانچه گفته شد، جهت استفاده از HPA، ابتدا می‌بایست Readiness Probe برای Deployment تعریف کرد. فایل زیر شامل تعریف Deployment یک Nginx همراه با Readiness Probe است.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 2368
          protocol: TCP
        readinessProbe:
          exec:
            command:
            - nginx
            - -v
          initialDelaySeconds: 15
          timeoutSeconds: 1
        resources:
          limits:
            cpu: '1'
            ephemeral-storage: 0.5G
            memory: 1G
          requests:
            cpu: '1'
            ephemeral-storage: 0.5G
            memory: 1G

نکته: توجه کنید که دندانه‌گذاری (indentation) در فایل‌های yaml مهم است و کوچک‌ترین جابه‌جایی می‌تواند باعث برگرداندن خطا و یا تنظیمات ناخواسته شود.

  • spec.template.spec.containers.readinessProbe: این بخش تعریف Readiness Probe را شامل می‌شود. Readiness Probe را به سه روش می‌توان استفاده کرد. Execute یک دستور همانند مثال بالا، بررسی یک endpoint HTTP و بررسی یک سوکت TCP. توضیح هر یک از این روش‌ها در مقاله دیگری شرح داده شده است. در این مثال، سکوی ابری آروان با بررسی منظم دستور nginx -v درون container و بررسی exit code این دستور، از سلامت اجرای container مطمئن می‌شود.
  • spec.template.spec.containers.readinessProbe.initialDelaySeconds: گاهی مدت زمانی طول می‌کشد تا container به حالت اجرایی کامل برسد و در این بازه ممکن است در پاسخ به بررسی مشخص شده، خروجی مطلوبی ارایه نشود. با مقدار دهی مناسب این فیلد، سکوی ابری آروان پیش از بررسی شرایط مشخص شده، پس از بالا آمدن container مدتی صبر می‌کند.
  • spec.template.spec.containers.readinessProbe.timeoutSeconds: مدت زمانی‌ است که سکوی ابری آروان منتظر پاسخ بررسی شرایط می‌ماند تا قبل از آن که آن را failed در نظر بگیرد.

خطوط بالا را در یک فایل به نام nginx-deployment.yaml وارد کرده و ذخیره کنید. سپس از طریق کامند لاین با دستور زیر، Deployment خود را به سکوی ابری آروان ارایه کنید.

$ arvan paas apply -f nginx-deployment.yaml

سپس با دستور زیر می‌توانید از وضعیت Deployment خود و اجرای آن بر روی سکوی ابری آروان آگاه شوید.

$ arvan paas get deployment nginx-deployment

تعریف HPA

در حال حاضر در سکوی ابری آروان، برای تعریف HPA می‌بایست میزان مصرف CPU را به عنوان شاخص Autoscale قرار داد. این بدین معنی است که با مشخص کردن یک حد مشخص برای میزان مصرف CPU یک Pod، در صورت عبور از میزان تعیین شده، سکوی ابری آروان اقدام به افزایش تعداد Pod های Deployment می‌کند.
برای تعریف HPA برای یک Deployment کافیست دستور زیر را وارد کنید.

$ arvan paas autoscale deploy nginx-deployment --max 10 --min=1 --cpu-percent=50

دستور بالا HPA را برای deployment ای که در بالا تعریف کردیم فعال می‌کند.
در این دستور با مقدار دهی –max مشخص می‌کنیم حداکثر تعداد replica برای Pod در صورت افزایش لود چقدر می‌تواند باشد.
–min حداقل تعداد replica برای Pod در صورت کاهش لود را مشخص می‌کند.
–cpu-percent مشخص می‌کند که در صورتی که میانگین cpu مصرف شده Podهای فعلی از عدد مشخص شده بیشتر شود، تعداد Pod ها می‌بایست توسط سکوی ابری آروان به صورت خودکار افزایش یابد تا میانگین مصرف CPU از حد مشخص شده کمتر شود و یا تعداد Podها به عدد –max برسد. از طرفی در صورتی که لود کاهش یابد، تعداد Pod ها به‌شکل خودکار کمتر شده تا زمانی که میانگین CPU مصرفی هم‌چنان کمتر از حد مشخص شده باشد و یا تعداد Podها به مقدار –min رسیده باشد.

با اجرای دستور بالا HPA برای deployment مورد نظر فعال می‌شود. با دستور پایین می‌توانید وضعیت HPA تعریف شده را مشاهده کنید.

$ arvan paas get hpa
NAME               REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-deployment   Deployment/nginx-deployment   1%/50%   1         10        1          1h

حال در صورتی که میزان لود (مصرف CPU) بر روی Pod بالا برود، مانند زیر تعداد replica به صورت خودکار افزایش می‌یابد.

$ arvan paas get hpa
NAME               REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-deployment   Deployment/nginx-deployment   50%/50%   1         10        2          1h

با کاهش لود تعداد replica به مقدار پیشین بازمی‌گردد.
همچنین با دستور زیر می‌توانید از جزییات عملکرد HPA مورد نظر مطلع شوید.

$ arvan paas describe hpa nginx-deployment
Name:                                                  nginx-deployment
Namespace:                                             example-project
Labels:                                                
Annotations:                                           
CreationTimestamp:                                     Sat, 30 May 2020 11:08:21 +0430
Reference:                                             Deployment/nginx-deployment
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  50% (251m) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       2 current / 2 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:
  Type     Reason                        Age                From                       Message
  ----     ------                        ----               ----                       -------
  Normal   SuccessfulRescale             1h (x3 over 1h)    horizontal-pod-autoscaler  New size: 4; reason: cpu resource utilization (percentage of request) above target
  Normal   SuccessfulRescale             57m (x4 over 58m)  horizontal-pod-autoscaler  New size: 2; reason: Current number of replicas below Spec.MinReplicas
  Normal   SuccessfulRescale             52m                horizontal-pod-autoscaler  New size: 1; reason: All metrics below target
  Warning  FailedGetResourceMetric       51m (x2 over 51m)  horizontal-pod-autoscaler  did not receive metrics for any ready pods
  Warning  FailedComputeMetricsReplicas  51m (x2 over 51m)  horizontal-pod-autoscaler  failed to get cpu utilization: did not receive metrics for any ready pods
  Normal   SuccessfulRescale             46m (x2 over 1h)   horizontal-pod-autoscaler  New size: 2; reason: cpu resource utilization (percentage of request) above target

جهت اطلاعات بیش‌تر می‌توانید به مستندات OKD و k8s مراجعه کنید.