سرویسها
هر سرویس در فندق یک نسخه در حال اجرا از یک ورژن بخصوص از یکی از 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 به شکل زیر نیز در نظر گرفته میشود که میتوانید از طریق آن به سرویس خود دسترسی پیدا کنید.
راهنمایی
فقط توجه کنید از آنجایی که قرار است نام service به عنوان بخشی از Hostname استفاده شود محدودیتهای زیر برای نامگذاری برقرار است:
- نام سرویس فقط میتواند شامل حروف کوچک، اعداد و خط تیره باشد.
- نام سرویس نمیتواند با اعداد آغاز شود.
- نام سرویس نمیتواند با خط تیره آغاز یا پایان یابد.
- نام سرویس نمیتواند حاوی دو خط تیره متوالی باشد.
پارامترهای ساخت سرویس
ساخت سرویس پارامترهای زیادی دارد که میتوانید هنگام ساخت از آنها استفاده کنید:
registry-secret-- یا s-
در صورتی که Image مورد نظر شما در یک رجیستری private بوده و برای pull کردن نیاز به username/password باشد، میتوانید با استفاده از این پارامتر، Secretای که حاوی اطلاعات لازم است را مشخص کنید.
env-- یا e-
از طریق این پارامتر میتوانید environment variable های مختلف مورد نیاز سرویس برای اجرا را مشخص کنید. توجه داشته باشید که هیچ محدودیتی در تعداد env--
وجود ندارد . به عنوان مثال فرض کنید سرویس برای کار به پارامترهای api_token
و secret_key
نیاز دارد، در این صورت از این طریق پارامترها را مشخص میکنید:
port-- یا p-
از طریق این پارامتر میتوانید مشخص کنید کدام یک از پورتهای سرویس مورد نظر خود را میخواهید در دسترس قرار دهید. در صورتی که پورت بخصوصی را مشخص نکنید، پورت 80 در دسترس قرار میگیرد.
مثلا فرض کنید میخواهیم به جای 80 از پورت 8080 استفاده کنیم:
internal--
در حالت عادی پورت مورد نظر هر سرویس به صورت public قابل دسترس است، با اضافه کردن سویچ internal--
میتوانید پورت مورد نظر را فقط در شبکه داخلی خودتان قابل دسترس نگاه دارید.
hosts-- یا h-
از طریق این سوئیچ میتوانید از بین دامنههایی که قبلا ثبت و تایید کردهاید، یک یا چند مورد را انتخاب کرده و به سرویس مورد نظرتان متصل کنید.
توجه
دقت داشته باشید برای آنکه بتوانید به دامنه دلخواهتان وصل شوید باید آن دامنه را در فندق ثبت کرده و یک رکورد 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 استفاده کنید:
توجه
توجه داشته باشید، اگر شما همیشه از یک تگ برای آخرین نسخه ایمیج خود
استفاده میکنید، دیپلوی کردن سرویسها بدون استفاده از سویچ
image-pull-policy Always−−
ممکن است منجر به مشکلات گیجکنندهای شود.
مثلا در صورت استفاده از Replica ممکن است بعضی از Instanceهای سرویس شما ورژن
جدید باشند و بعضی دیگر ورژن قبلی بمانند.
انواع حالات مشخص کردن تصویر
برای سهولت کار کاربران، ما در فندق سه روش متفاوت برای فراهم آوردن Image مورد نظر جهت ساخت سرویس در نظر گرفتهایم؛ که در ادامه هر کدام را بررسی میکنیم:
Imageهای فندق
ساخت سرویس ازدر این حالت شما مستقیما با Imageهای داکر سروکار ندارید؛ بلکه فقط برای پروژه خود یک Dockerfile مینویسید و پروژه را در فندق publish میکنید.
در این روش در صورتی که در دایرکتوری پروژه خود باشید نیازی به مشخص کردن نام Image ندارید، یا میتوانید از طریق سویچ image--
هنگام دیپلوی نام تصویر خود را مشخص کنید.
مثلا فرض کنید که یک تصویر در فندق منتشر کردهاید به نام order-handling-api و میخواهید از روی ورژن v.3.2 آن که قبلا آن را ایجاد کرده بودید، یک سرویس با نام 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 داشته باشیم، باید به این ترتیب عمل کنیم:
ساخت سرویس از رجیستریهای دیگر
در صورتی که شما قصد دارید از روی Imageای سرویس دیپلوی کنید که در یک رجیستری بخصوص مانند Canister یا Gitlab قرار دارد، کافیست در عنوان نام Image، از آدرس کامل Image به همراه URL رجیستری استفاده کنید، به عنوان مثال :
همانطور که مشاهده میکنید علاوه بر پارامترهای معمول deploy پارامتر s-
هم استفاده شده است، به دلیل اینکه رجیستری مشخص شده یک رجیستری private است. این پارامتر نام یک Secret را مشخص میکند که فندق باید هنگام pull کردن تصویر از registry از آن استفاده کند.
EXEC
دسترسی به سرویس ها باسرویس ها بعد از آنکه دیپلوی میشوند، در یک محیط ایزوله قرار میگیرند که دسترسی به آن ها دیگر راحت نخواهد بود. برای اینکه بتوانیم دستورات خاصی را بر روی سرویسهای خود اجرا کنیم از قابلیتی به نام EXEC استفاده میکنیم.
مطالعه بیشتر
برای مطالعه بیشتر در مورد دستورات exec به صفحه exec مراجعه نمایید.
مدیریت سرویس ها
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 نمایانگر نام سرویسی است که قصد حذف کردن آن را دارید.