در این مقاله به بررسی مفهوم و شیوهی استفاده از Service در سکوی ابری آروان و همچنین اجزای سازندهی یک service و تعریف هریک از آنها پرداخته میشود. مفهوم Service در سکوی ابری آروان با مفهوم Service در Kubernetes کاملن سازگار است.
پیشنیازهای استفاده از Service در سکوی ابری آروان
تنها پیش نیاز استفاده از این سیستم، داشتن حساب کاربری ابر آروان و دسترسی به سکوی ابری آروان است. برای این کار نخست وارد حساب کاربری خود شوید. سپس به بخش پروفایل بروید و در سربرگ API KEYS برای خود یک API KEY جدید بسازید و آن را در جایی ذخیره کنید.
برای انجام مراحل این مقاله نیاز به استفاده از command line ابر آروان است. پس از دانلود آن (در صورت نیاز آن را در PATH خود قرار داده) با کمک دستور زیر login کنید.
arvan login
سپس API KEY که از سایت دریافت کردید در اینجا کپی کنید.
Service چیست؟
Service یکی از اجزای اصلی و پرکاربرد در سکوی ابری آروان است. Service، یا به اختصار svc، ماهیتی است که وظایفی از قبیل Load Balancing ترافیک بین podهای مشابه، اختصاص یک دامنه و شناسایی Podهای فعال و Expose کردن Portهای Podها را برعهده دارد.
هنگامی که از Deployment در سکوی ابری آروان استفاده میشود، Podها درون Deployment در مواقعی کشته و بازسازی میشوند و Pod جدیدی با IP جدید ایجاد میشود. با اختصاص Service به Deployment، وظیفهی یافتن Podهای درحال اجرا و هدایت ترافیک به سمت این Podها و همچنین Load Balancing این ترافیک بهشکل خودکار، برعهدهی این Service است. از سوی دیگر، هنگام ایجاد Service میتوانید Portهایی از Pod که لازم است بهوسیلهی سایر Applicationهای درون پروژه دیده شوند و به سمت آنها درخواست ارسال شود، تعیین کنید تا این Portها در اصطلاح Expose شوند.
ساخت Service
برای ساخت Service، باید اطلاعات مورد نیاز را در قالب yaml در یک فایل وارد و سپس با command line، آن را به سکوی ابری آروان ارایه کنید. در ادامه نمونهای ساده از یک Service برای یک سرویس nginx (که پیشتر در مقالهی استفاده از Deployment در سکوی ابری آروان، یک عدد Deployment برای آن ایجاد شد) آورده و هر یک از بخشهای آن توضیح داده شده است.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 443
نکته: توجه کنید که Indentation در فایلهای YAMLمهم است و کوچکترین جابهجایی میتواند سبب برگرداندن خطا و یا تنظیمات ناخواسته شود.
در ادامه هریک از فیلدهای مربوطه توضیح داده شده است.
- kind: مشخصکنندهی نوع ماهیت است. این فیلد میتواند مقادیری مانند: Pod، Service، StatefulSet و … داشته باشد. این ماهیتها مشابه ماهیتهایی هستند که در Kubernetes وجود دارد. در این نمونه، هدف تعریف service است بنابراین، این مقدار مشخص شده است.
- name: مشخصکنندهی نام service و همچنین نام دامنهی آن است.
- selector: از مقدار مشخص شده در این فیلد، service متوجه میشود که ترافیک را به کدام podها هدایت کند. مقداری که برای این فیلد تعیین میشود باید بهشکل key:value معادل فیلد spec.template.metadata.labels مربوط به Deployment باشد (این مقدار در واقع، مقداری است که Label مربوط به Podها را مشخص میکند و با آن Service میتواند Podهای مربوط را پیدا کند). در این نمونه، این مقدار معادل app: nginx قرار گرفته شده است.
- ports: در این بخش Portهایی که لازم است از سایر سرویسهای درون پروژه دیده شوند، مشخص میشود. این Portها در Deployment در بخش spec.template.spec.containers.ports مشخص شدهاند.
spec.ports.name: نامی است که به Port اختصاص داده میشود. - ports.protocol: مشخصکنندهی Protocol ای است که Port مربوطه میپذیرد.
- ports.port: این فیلد مشخصکنندهی پورتی است که سایر سرویسها به آن درخواست ارسال میکنند و بهوسیلهی Service تعریف شده، Expose میشود.
- ports.targetPort: این فیلد پورتی است که Container درون Pod روی آن Listen میکند و سرویس درخواستهای ورودی به spec.ports.port را به سمت این Port هدایت میکند.
لازم به ذکر است که اگر نیاز باشد درخواستها به بیش از یک Pod ارسال شوند، Service با الگوریتم Round Robin درخواستها را به Podها ارسال میکند و به این ترتیب، عمل Load Balancing را روی Podها انجام میدهد.
خطهای بالا را در یک فایل به نام nginx-service.yaml وارد و ذخیره کنید. سپس در command line با دستور زیر، Service خود را به سکوی ابری آروان ارایه کنید.
arvan paas apply -f nginx-service.yaml
با دستور زیر میتوانید از وضعیت Service خود و اجرای آن روی سکوی ابری آروان آگاه شوید.
arvan paas get svc
خروجی مشابه زیر خواهد بود.
$ arvan paas get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service ClusterIP 172.30.27.176 <none> 80/TCP,443/TCP 16s
در خروجی بالا، NAME مشخصکنندهی نام Service و TYPE مشخصکنندهی نوع Service و بهشکل پیشفرض، مقدار آن ClusterIP است. CLUSTER-IP آدرس IP خود Service است. PORT نشاندهندهی Portهایی است که Service آنها را Expose کرده است. همچنین AGE مشخصکنندهی مدت زمان اجرای Service است.
نام دامنهی service
یکی از مهمترین ویژگیهای Service، ایجاد یک نام دامنه برای خود است. به این معنی که، برای ارسال درخواست به این Service درون پروژه، نیازی به استفاده از IP آن (مقدار CLUSTER-IP) نیست. نام دامنهای که Service به خود میگیرید، برابر با مقدار metadata.nameای است که درون تنظیمات Service تعریف میشود.
برای نمونه، اگر سرویس دیگری بخواهد به این Service و به پورت ۸۰ آن درخواست بزند، کافی است درخواست خود را برای آدرس nginx-service:80 ارسال کند. این نام دامنه درون پروژهی شما قابل شناسایی بهوسیلهی سایر سرویسها است.
برای کسب اطلاعات بیشتر میتوانید به مستندات Kubernetes مراجعه کنید.