سرویس‌ها

هر سرویس در فندق یک نسخه در حال اجرا از یک ورژن بخصوص از یکی از image های شماست. سرویس‌ها انواع مختلفی دارند و برای ساخت آن‌ها روش‌های متفاوتی در نظر گرفته شده است. در ادامه با انواع سرویس ها و نحوه ساخت و عملکرد آن‌ها بیشتر آشنا خواهید شد.

انواع سرویس ها

سرویس‌ها در فندق ۳ نوع و به شرح زیر هستند:

۱- سرویس‌های داخلی )Internal Service(
۲- سرویس‌های خارجی )External Service(
۳- سرویس‌های مدیریت شده )Managed Service(

۱- سرویس های داخلی یا Internal Service

این سرویس ها تنها از داخل namespace قابل دسترسی هستند و فقط سرویس‌هایی که داخل این فضانام باشند می‌توانند با سرویس های داخلی ارتباط برقرار کنند و هیچ راهی برای برقراری ارتباط با این سرویس ها از خارج از namespace وجود ندارد.

۲- سرویس های خارجی یا External Service

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

۳- سرویس های مدیریت شده یا Managed Service

برخی سرویس‌ها مانند MySQL یا PostgreSQL و خیلی موارد دیگر که بسیار پر‌کاربرد هستند، به صورت پیش‌فرض داخل هسته سکوی ابری فندق وجود دارند تا در صورت نیاز کاربر، این سرویس‌ها در کوتاه‌ترین زمان و با فشردن چند کلیک ساخته شوند.
با این اوصاف شما دیگر درگیر تنظیمات و پیچیدگی‌های این سرویس‌ها نشده و روند توسعه شما بهبود پیدا می‌کند؛ ما به این سرویس ها Managed Service یا سرویس مدیریت شده می‌گوییم.

راهنمایی

برای مطالعه بیشتر در مورد سرویس‌های مدیریت شده به این صفحه مراجعه نمایید.

ساخت سرویس‌ها

برای ساخت سرویس دو روش وجود دارد:

۱- استفاده از مانیفست
۲- استفاده از دستور deploy

۱- استفاده از مانیفست

دیپلوی کردن سرویس ها با استفاده از مانیفست بسیار راحت‌تر بوده و قابلیت‌هایی که در اختیار شما قرار می‌گیرد بیشتر از دستور deploy است. دیپلوی کردن سرویس‌ها بسته به تنظیماتی که حین دیپلوی سرویس مشخص می‌کنید می‌تواند پیچیده شود و انجام این کار با استفاده از fandogh service deploy برای تعداد زیادی سرویس کاملا خسته‌کننده شده و احتمال خطا در تنظیمات را هم بالا می‌برد.

به همین دلیل این امکان را فراهم کردیم تا شما مشخصات سرویسی که قرار است ساخته شود را در یک فایل با فرمت و ساختار مشخص نوشته و هر بار که فایل را از طریق fandogh service apply در اختیار cli قرار می‌دهید، سرویس مورد نظر شما با مشخصات مشخص شده ایجاد یا با ویژگی‌های جدید به روزرسانی می‌شود.

مانیفست‌ها

برای مطالعه بیشتر در مورد مانیفست به صفحه مانیفست سرویس مراجعه نمایید.

۲- استفاده از دستور deploy

برای ساخت سرویس‌ها شما نیاز دارید از دستور fandogh service deploy استفاده کنید؛ با انتخاب یک ایمیج دلخواه و یک ورژن بخصوص از‌ آن ایمیج و انتخاب یک نام برای سرویس، سرویس شما ساخته خواهد شد.

نامی که برای سرویس انتخاب می‌کنید همان نامی است که بعدا به شما کمک می‌کند در شبکه خصوصی فضانام آن سرویس را پیدا کنید، به علاوه برای سرویس‌هایی که internal-- نیستند یک hostname به شکل زیر نیز در نظر گرفته می‌شود که می‌توانید از طریق آن به سرویس خود دسترسی پیدا کنید.

Fandogh Service

service_name-namespace.fandogh.cloud
راهنمایی

فقط توجه کنید از آنجایی که قرار است نام service به عنوان بخشی از Hostname استفاده شود محدودیت‌‌های زیر برای نام‌گذاری برقرار است:

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

پارامتر‌های ساخت سرویس

ساخت سرویس پارامتر‌های زیادی دارد که می‌توانید هنگام ساخت از آن‌ها استفاده کنید:

registry-secret-- یا s-
در صورتی که Image مورد نظر شما در یک رجیستری private بوده و برای pull کردن نیاز به username/password باشد، می‌توانید با استفاده از این پارامتر، Secretای که حاوی اطلاعات لازم است را مشخص کنید.

env-- یا e-
از طریق این پارامتر می‌توانید environment variable های مختلف مورد نیاز سرویس برای اجرا را مشخص کنید. توجه داشته باشید که هیچ محدودیتی در تعداد env-- وجود ندارد . به عنوان مثال فرض کنید سرویس برای کار به پارامتر‌های api_token و secret_key نیاز دارد، در این صورت از این طریق پارامتر‌ها را مشخص می‌کنید:

fandogh service deploy
--env api_token="some token"
--env api_secret_key="some secret key"

port-- یا p-
از طریق این پارامتر می‌توانید مشخص کنید کدام یک از پورت‌های سرویس مورد نظر خود را می‌خواهید در دسترس قرار دهید. در صورتی که پورت بخصوصی را مشخص نکنید، پورت 80 در دسترس قرار می‌گیرد. مثلا فرض کنید می‌خواهیم به جای 80 از پورت 8080 استفاده کنیم:

fandogh service deploy --port 8080

internal--
در حالت عادی پورت مورد نظر هر سرویس به صورت public قابل دسترس است، با اضافه کردن سویچ internal‍-- می‌توانید پورت مورد نظر را فقط در شبکه داخلی خودتان قابل دسترس نگاه دارید.

fandogh service deploy --internal

hosts-- یا h-
از طریق این سوئیچ می‌توانید از بین دامنه‌هایی که قبلا ثبت و تایید کرده‌اید، یک یا چند مورد را انتخاب کرده و به سرویس مورد نظرتان متصل کنید.

fandogh service deploy
-h site.com
-h www.site.com
توجه

دقت داشته باشید برای آنکه بتوانید به دامنه دلخواهتان وصل شوید باید آن دامنه را در فندق ثبت کرده و یک رکورد TXT با مقداری که سرور فندق به شما می‌دهد و یک رکورد CNAME با نام lb.fandogh.cloud بر روی دامنه ی خود ایجاد نمایید .

image-pull-policy--
زمانی که قصد دارید یک ایمیج از یک رجیستری دیگر )مثل docker hub یا رجیستری‌های خصوصی( pull شود و برای ساخت سرویس استفاده شود، می‌توانید از طریق این سوئیچ مشخص کنید که چه سیاستی برای pull کردن Image بکار رود:


۱( حالت پیش‌فرض `IfNotPresent` است، یعنی فقط زمانی Image باید از رجیستری pull شود که ورژن مورد نظر روی کتابخانه لوکال داکر سرور فندق وجود ندارد؛ در غیر این صورت از همان ورژنی که قبلا pull شده است باید استفاده شود.

۲( حالت دیگر `Always` است، در این حالت همیشه و با صرف‌ نظر از آنکه آیا ورژن بخصوص قبلا pull شده است یا خیر، Image از رجیستری Pull خواهد شد.

مثلا تصور کنید آخرین نسخه پروژه همیشه روی تگ my-api:latest قرار دارد، و ورژن دیگری وجود ندارد. هر آپدیت جدیدی هم که انجام می‌دهید باز روی تگ my-api:latest ایمیج خود را push می‌کنید، در این صورت لازم است از Always استفاده کنید:
fandogh service deploy
--image some.registr.com:5000/my-namespace/my-api
--version latest
--image-pull-policy Always
توجه

توجه داشته باشید، اگر شما همیشه از یک تگ برای آخرین نسخه ایمیج خود استفاده می‌کنید، دیپلوی کردن سرویس‌ها بدون استفاده از سویچ image-pull-policy Always−− ممکن است منجر به مشکلات گیج‌کننده‌ای شود. مثلا در صورت استفاده از Replica ممکن است بعضی از Instanceهای سرویس شما ورژن جدید باشند و بعضی دیگر ورژن قبلی بمانند.

انواع حالات مشخص کردن تصویر

برای سهولت کار کاربران، ما در فندق سه روش متفاوت برای فراهم آوردن Image مورد نظر جهت ساخت سرویس در نظر گرفته‌ایم؛ که در ادامه هر کدام را بررسی می‌کنیم:

ساخت سرویس از Imageهای فندق

در این حالت شما مستقیما با Image‌های داکر سروکار ندارید؛ بلکه فقط برای پروژه خود یک Dockerfile می‌نویسید و پروژه را در فندق publish می‌کنید. در این روش در صورتی که در دایرکتوری پروژه خود باشید نیازی به مشخص کردن نام Image ندارید، یا می‌توانید از طریق سویچ image-- هنگام دیپلوی نام تصویر خود را مشخص کنید.
مثلا فرض کنید که یک تصویر در فندق منتشر کرده‌اید به نام order-handling-api و می‌خواهید از روی ورژن v.3.2 آن که قبلا آن را ایجاد کرده‌ بودید، یک سرویس با نام oh-api دیپلوی کنید. برای این کار کافیست این دستور را اجرا کنید:

fandogh service deploy \
--version v3.2 \
--image order-handling-api \
--name oh-api

ساخت سرویس از Imageهای Docker hub

در این حالت شما قصد دارید مستقیما یکی از Imageهای داخل Docker hub را در Namespace خود دیپلوی کنید، برای اینکار کافیست نام Image را با فرمت namespace/image-name مشخص کنید و ورژن Image را نیز از طریق سویچ version--‍ تعیین کنید.

راهنمایی

توجه داشته باشید که Imageهای رسمی داکر مثل Nginx یا Wordpress در Namespaceای به نام library قرار دارند و شما می‌توانید به دو شکل library/nginx یا nginx/_ آن‌ها را آدرس دهی کنید.

به عنوان مثال اگر قصد ساخت سرویس از ایمیجی با نام some-ns/foo و ورژن latest داشته باشیم، باید به این ترتیب عمل کنیم:

fandogh service deploy \
--image some-ns/foo \
--version latest

ساخت سرویس از رجیستری‌های دیگر

در صورتی که شما قصد دارید از روی Imageای سرویس دیپلوی کنید که در یک رجیستری بخصوص مانند Canister یا Gitlab قرار دارد، کافیست در عنوان نام Image، از آدرس کامل Image به همراه URL رجیستری استفاده کنید، به عنوان مثال :

fandogh service deploy \
--image cloud.canister.io:5000/mahdixareie/hello-world \
--version v2.0 \
--name hello-world \
-s canister

همانطور که مشاهده می‌کنید علاوه بر پارامتر‌های معمول deploy پارامتر s- هم استفاده شده است، به دلیل اینکه رجیستری مشخص شده یک رجیستری private است. این پارامتر نام یک Secret را مشخص می‌کند که فندق باید هنگام pull کردن تصویر از registry از آن استفاده کند.

دسترسی به سرویس ها با EXEC

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

مطالعه بیشتر

برای مطالعه بیشتر در مورد دستورات exec به صفحه exec مراجعه نمایید.

مدیریت سرویس ها

 CLI Image

fandogh-cli

شما همچنین می توانید با وارد کردن دستورfandogh service --help در fandogh-cli لیست دستورات موجود را مشاهده کنید.

deploy

با وارد کردن دستور fandogh service deploy --image IMAGE_NAME --version IMAGE_VERSION --name SERVICE_NAME می‌توانید یک سرویس جدید ایجاد نمایید.

image-- یا i-
پارامتر image یا i نمایانگر نام ایمیجی است که می‌خواهید سرویس جدید از روی آن ساخته شود.

version-- یا v-
پارامتر version یا v نمایانگر نام ورژن ایمیجی است که می‌خواهید سرویس جدید از روی آن ساخته شود.

name-- یا n-
پارامتر name یا n نمایانگر نام سرویسی است که می‌خواهید آن را بسازید.

apply

با استفاده از دستور fandogh service apply -f MANIFEST می‌توانید یک سرویس جدید از روی مانیفست خود ایجاد نمایید.

file-- یا f-
پارامتر file یا f نمایانگر آدرس مانیفیستی است که قرار است سرویس جدید از روی آن ساخته شود.

parameter-- یا p-
پارامتر parameter یا p نمایانگر نام پارامترهایی است که می‌خواهید در کنار مانیفست به سرور فرستاده شود تا در هنگام ساخت سرویس از آن ها استفاده شود.

d-
با استفاده از پارامتر d سرور کار خود را در background انجام داده و fandogh-cli را آزاد می‌کند.

details

با استفاده از دستور fandogh service details --name SERVICE_NAME همیشه می‌توانید جزئیات مربوط به هر سرویس را مشاهده کنید.

name-- یا n-
پارامتر name یا n نمایانگر نام سرویسی است که می‌خواهید جزئیات آن را مشاهده کنید.

reset

با استفاده از دستور fandogh service reset --name SERVICE_NAME می‌توانید سرویس مورد نظر را راه‌اندازی مجدد کنید. name-- یا n-
پارامتر name یا n نمایانگر نام سرویسی است که می‌خواهید آن را راه‌اندازی مجدد کنید.

logs

با استفاده از دستور fandogh service logs --name SERVICE_NAME --follow می‌توانید در هر لحظه لاگ های مربوط به هر سرویس که می‌خواهید را مشاهده کنید.

name-- یا n-
پارامتر name یا n نمایانگر نام سرویسی است که می‌خواهید لاگ های آن را مشاهده کنید.

follow-- یا f-
پارامتر follow یا f این قابلیت را برای شما ایجاد می‌کند که به صورت realtime تمام اتفاقات یک سرویس را در قالب لاگ در هر ثانیه مشاهده کنید.

راهنمایی

چنانچه فقط می‌خواهید چند لاگ آخر مربوط به هر سرویس را مشاهده کنید٬ می‌توانید follow-- یا f- را از آخر دستور logs حذف کنید.

with-timestamp--
در صورتی که لاگ سرویس‌های شما timestamp یا تاریخ و ساعت ندارند و نیاز دارید تا بدانید دقیقا هر موردی که لاگ شده است در چه زمانی رخ داده است، می‌توانید با اضافه کردن این پارامتر به دستور timestamp ،log را فعال کنید.

previous--
در صورتی که سرویس شما با خطا مواجه و restart شود، لاگ‌های قبلی از دسترس خارج می‌شوند. با اضافه کردن پارامتر previous-- می‌توانید به لاگ‌های قبلی دسترسی داشته باشید.

list

با استقاده از دستور fandogh service list می‌توانید لیست سرویس هایی که ساخته‌اید را مشاهده کنید.

dump

با استفاده از دستور fandogh service dump --service SERVICE_NAME می‌توانید فایل مانیفست سرویس خود را ببینید.

service-- یا s-
پارامتر service یا s نمایانگر نام سرویسی است که می‌خواهید فایل مانیفست آن را مشاهده کنید.

destroy

با استفاده از دستور fandogh service destroy --name می‌توانید یک سرویس را حذف نمایید. name-- یا service-- یا s-
پارامتر name یا service یا s نمایانگر نام سرویسی است که قصد حذف کردن آن را دارید.