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

پیش‌نیازهای استفاده از Deployment در سکوی ابری آروان

تنها پیش نیاز این سیستم، داشتن یک حساب کاربری ابر آروان و دسترسی به سکوی ابری است.

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

برای انجام مراحل بیان شده در این مقاله نیاز به command line ابر آروان است. آن را دانلود (در صورت نیاز آن را در PATH خود قرار داده) و با کمک دستور زیر لاگین کنید.

arvan login

سپس API KEY که از سایت دریافت کردید در اینجا کپی کنید.

Deployment چیست؟

deployment یکی از اجزای اصلی و پرکاربرد در سکوی ابری آروان است. Deployment، یا به اختصار Deploy، ماهیتی است که کنترل وضعیت Pod(ها) را بر عهده دارد.

می‌توان podها را به‌شکل مستقل از Deployment تعریف، و روی سکوی ابری آروان اجرا کرد. با این حال، تعریف Pod مستقل از Deployment، قابل استفاده در سیستم‌های Production نیست چرا که اگر مشکلی رخ دهد و Pod حذف شود، به‌شکل خودکار به حالت اجرایی باز نمی‌گردد. بنابراین، نیاز به ماهیتی مانند Deployment است تا همواره از اجرایی بودن Podهای تعریف شده و تعداد مورد نیاز، مطمین شود.

ساخت deployment

برای ساخت Deployment، باید اطلاعات مورد نیاز را در قالب yaml در یک فایل وارد و سپس با CLI، آن را به سکوی ابری آروان ارایه کرد. در ادامه نمونه‌ای ساده از یک deployment برای یک سرویس nginx بیان و هریک از بخش‌های آن توضیح داده شده است.

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
        resources:
          limits:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G
          requests:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G

نکته: توجه کنید که Indentation در فایل‌های yaml مهم است و کوچک‌ترین جابه‌جایی می‌تواند سبب برگرداندن خطا و یا تنظیمات ناخواسته شود.

در ادامه فیلدهای مربوطه توضیح داده می‌شود.

  • kind: مشخص‌کننده نوع ماهیت است. این فیلد می‌تواند مقادیری مانند:‌ Pod، Service، Deployment، StatefulSet و… داشته باشد. این ماهیت‌ها مشابه ماهیت‌هایی هستند که در kubernetes  وجود دارد. در این نمونه، هدف تعریف Deployment است بنابراین، این مقدار مشخص شده است.
  • metadata.name: مشخص‌کننده‌ی نام Deployment است.
  • spec.replica: مشخص‌کننده‌ی تعداد Podهایی است که Deployment اجرا و مدیریت می‌کند. Pod در قسمت spec.template.spec تعریف می‌شود و فیلد spec.replica تعیین می‌کند چه تعداد Pod (کاملن مشابه) مطابق تعریف در حال اجرا باشد.
  • spec.selector.matchLabels: از مقدار مشخص شده در این فیلد، Deployment متوجه می‌شود که کدام Podها را باید کنترل کند. مقداری که برای این فیلد تعیین می‌شود باید به‌شکل key:value معادل فیلد spec.template.metadata.labels باشد. در این نمونه، این مقدار معادل app: nginx قرار گرفته شده است.
  • spec.template.metadata.labels: این فیلد labelهایی را به شکل key: value به Podهای ساخته شده اختصاص می‌دهد. در حالت کلی ارتباطات بین ماهیت‌های سکوی ابری آروان، با Labelها و Selectorها انجام می‌شود. بنابراین در انتخاب و تعیین این مقادیر باید دقت کافی به خرج داد.
  • spec.template.spec: این بخش مشخص‌کننده‌ی مشخصات Podای است که Deployment باید کنترل کند. در این بخش، زیرمجموعه‌ی spec.template.spec.containers مشخص‌کننده‌ی Containerهایی است که قرار است درون هر Pod اجرا شوند.
  • spec.template.spec.containers.image: مشخص‌کننده‌ی آدرس Docker Image است که قرار است Pod آن را اجرا کند.
  • spec.template.spec.containers.name: مشخص‌کننده‌ی نام Containerای است که قرار است درون Pod اجرا شود.
  • spec.template.spec.containers.imagePullPolicy: تعیین می‌کند در چه شرایطی Docker Image مجدد Pull شود. در این نمونه، این فیلد برابر IfNotPresent قرار گرفته، که مقدار پیش‌فرض این فیلد است، تا در هربار اجرا اگر Image روی نود اجرا شده یافت نشد، این image دریافت شود. سایر مقادیر ممکن برای این فیلد برابر با Always و Never هستند. اگر Always انتخاب شود، همواره هنگام اجرای مجدد برنامه، ( Pod) سکوی ابری image را مجدد دریافت می‌کند. توصیه می‌شود به هیچ وجه حالت Never را انتخاب نکنید، چرا که در این حالت، سکوی ابری فرض می‌کند همواره image روی نود‌‌ها موجود است و تلاشی برای pull کردن image نمی‌کند.
  • spec.template.spec.containers.ports: مشخص‌کننده‌ی فهرست Portهایی است که از خارج Container قابل دیدن هستند.
  • spec.template.spec.containers.resources: این بخش مشخص‌کننده‌ی میزان منابعی است که Container برای اجرا نیاز دارد. مشخص کردن این منابع در سکوی ابری آروان اجباری است. هنگام تعیین این منابع باید دقت کافی را به خرج داد تا هنگام اجرا، Container با کمبود منابع مواجه نشده و اجرای آن دچار اختلال نشود. این بخش از دو زیر بخش Limits و Requests تشکیل شده که هر زیر بخش شامل CPU، Memory و Ephemeral-storage است. در سکوی ابری آروان مقادیر هر کدام را برای Limits و Requests باید مساوی قرار داد.

هم‌چنین Ephemeral-storage مشخص‌کننده‌ی میزان دیسک مورد استفاده Container است و داده‌های ذخیره شده در آن پایدار نیستند؛ این امر به این معنی است که، اگر pod، ریستارت شود، داده‌های موجود در آن به مقادیر پیش‌فرض Container  باز می‌گردند و تغییرات از بین می‌روند. اگر نیاز به دیسک پایدار باشد، می‌توان از persistentVolumeClaim استفاده کرد.

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

arvan paas apply -f nginx-‎deployment.yaml

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

arvan paas get ‎deploy

خروجی مشابه زیر خواهد بود:

$ arvan paas get deploy ‎
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 1 1 1 1 2h‎

در خروجی بالا، NAME مشخص‌کننده‌ی نام Deployment است. DESIRED تعیین‌کننده‌ی تعداد Podهایی است که باید به‌وسیله‌ی این Deployment اجرا شوند و به‌وسیله‌ی فیلد spec.replica درون Deployment تعیین می‌شود. مقدار CURRENT بیان‌کننده‌ی آن است که در این لحظه چه تعداد POD در حال اجرا است. UP-TO-DATE مشخص می‌کند در حال حاضر چه تعداد از Podها جهت رسیدن به تعداد DESIRED، به‌روزرسانی شده‌اند. AVAILABLE تعیین‌کننده‌ی تعداد Podهایی است که در حال سرویس‌دهی هستند. هم‌چنین AGE مشخص‌کننده‌ی مدت زمانی است که Deployment اجرا شده است.

افزایش Replica

از جمله مزایای استفاده از سکوی ابری، توانایی Scale کردن Application است. برای نمونه، فرض کنید تعداد درخواست‌های موجود روی nginx در حال اضافه شدن است و یک nginx جهت پاسخ‌دهی به تمام درخواست‌ها کافی نیست. در این حالت به سادگی می‌توانید روی سکوی ابری آروان، تعداد nginxهای خود را اضافه کنید.

برای این هدف راه‌های متفاوتی وجود دارد. ساده‌ترین راه استفاده از دستور زیر است.

arvan paas scale deploy nginx-deployment --replicas ‎‎2‎

پس از اعمال دستور بالا مشاهده خواهید کرد که تعداد Podهای nginx به دو عدد افزایش یافته و خروجی دستور get deploy مشابه است.

$ arvan paas get deploy ‎
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment 2 2 2 2 2h‎

نکته: deploymentهایی که دارای persistentVolumeClaim هستند قابلیت Scale را ندارند و تنها می‌توان یک Replica از آن‌ها در حال اجرا داشت. اگر نیاز به Scale کردن Pod با persistentVolumeClaim باشد، از stateFulSets استفاده کنید.

هم‌چنین با دستور زیر می‌توانید Podهای در حال اجرا را مشاهده کنید.

$ arvan paas get pods ‎
NAME READY STATUS RESTARTS AGE
nginx-deployment-7f66fbc5c6-nhn9x   1/1    Running 0    14m‎
nginx-deployment-7f66fbc5c6-vmvt4   1/1    Running 0    5m‎

روش دیگر تغییر تعداد podهای مشخص شده در فیلد spec.replica در فایل پیکربندی Deployment است. کافی است این مقدار را در فایل خود تغییر دهید و مجدد آن را به سکوی ابری آروان ارایه کنید.

هم‌چنین می‌توانید با دستور زیر تنظیمات Deployment را مستقیم روی سکوی ابری آروان تغییر دهید.

arvan paas edit deploy nginx-‎deployment

دستور بالا از Editor پیش‌فرض سکوی ابری آروان تنظیمات Deployment را در قالب yaml به شما نمایش می‌دهد و می‌توانید تغییرات خود را اعمال و سپس ذخیره کنید. پس از بستن Editor، تنظیمات به‌شکل خودکار اعمال می‌شوند و نیاز به انجام عمل دیگری نیست.

استراتژی‌‌های Update

پس از اعمال تغییرات در Deployment، تمامی Podهای پیشین از بین می‌روند و Podهای جدید به‌وسیله‌ی Deployment، با تنظیمات جدید، ایجاد و اجرا می‌شوند. این استراتژی تغییر به دو شکل Recreate  و RollingUpdate می‌تواند رخ دهد.

استراتژی Recreate

در استراتژی Recreate، تمامی Podهای پیشین از بین می‌روند و سپس Podهای جدید ایجاد می‌شوند. در سکوی ابری آروان اگر Deployment دارای persistentVolumeClaim باشد، حتمن باید از این استراتژی استفاده کرد. برای استفاده از این مدل کافی است فیلد spec.strategy.type را برابر Recreate قرار دهید.

استراتژی RollingUpdate

استراتژی دیگر RollingUpdate است که استراتژی پیش‌فرض مورد استفاده در Deployment محسوب می‌شود. در این استراتژی، تنظیماتی در اختیار کاربر قرار می‌گیرد تا به‌وسیله‌ی آن Podها به مرور Update شوند. به این شکل که Podهای جدید به مرور ایجاد می‌شوند و Podهای قدیمی با توجه به Podهای جدیدی که بالا آمده‌ و در حال اجرا هستند، به مرور از بین می‌روند. این تنظیمات شامل فیلدهای maxUnavailable و maxSurge است. که در ادامه هر یک توضیح داده شده است.

  • spec.strategy.RollingUpdate.maxUnavailable: این فیلد مشخص‌کننده‌ی حداکثر تعداد podهایی است که در فرایند update می‌توانند در حالت unavailable باشند و سرویس‌دهی نیز نداشته باشند. مقدار این فیلد می‌تواند به شکل عدد ثابت ( مثلا 2 ) و یا به‌شکل درصد ( مثلا %30 ) مقداردهی شود که در حالت درصد، براساس تعداد replicaها مشخص می‌شود.
  • spec.strategy.RollingUpdate.maxSurge: این فیلد مشخص‌کننده‌ی حداکثر تعداد podهایی است که در فرآیند update می‌توانند از تعداد replicaهای تعیین شده در deployment بیش‌تر باشند. مقدار این فیلد می‌تواند به شکل عدد ثابت ( برای نمونه 2 ) و یا به‌شکل درصد ( برای نمونه، %30 ) مقداردهی شود که در حالت درصد، این مقدار براساس تعداد replicaها مشخص می‌شود.

توجه داشته باشید که مقدار هر دو فیلد به‌شکل هم‌زمان نمی‌تواند برابر با صفر باشد.

در زیر نمونه‌ای از این استراتژی برای Deployment مربوط به nginx آمده است.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy:
    RollingUpdate:
      maxUnavailable: 0
      maxSurge: 1
    Type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:latest
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 2368
          protocol: TCP
        resources:
          limits:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G
          requests:
            cpu: '1'
            ephemeral-storage: 2G
            memory: 1G

ReplicaSet

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

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