سوالات متداول
با مطالعه سوالات و پاسخهای موجود در این صفحه، بخشی از سوالات شما در جهت مشکلات پیش آمده طی استفاده از خدمات همروش پاسخ داده میشود.
میخواهم هر بار که در برنچ تنظیمشده پوش (push) میکنم اپلیکیشنم به طور خودکار آپدیت شود.
شما میتوانید با فعال کردن گزینه «دیپلوی خودکار بعد از push کردن» این کار را انجام دهید. برای این کار، در صفحه مشخصات اپ، آدرس ریپو، گزینه ویرایش را زده و این تنظیم را فعال کنید.
بعد از دیپلوی موفق، در اتصال به سرویس خود با timeout مواجه میشوم.
مطمئن شوید که سرویس شما به جای 127.0.0.1 روی 0.0.0.0 درحال دریافت request باشد. اگر سرویس قرار است ترافیک خارج از host را نیز دریافت کند، باید روی 0.0.0.0 در حال listen کردن باشد. همچنین مطمئن شوید که پورتی که برنامه/پردازهی کانتینری شده روی آن اجرا میشود، به درستی ست شده باشد.
وقتی دیپلوی جدید میکنم، برای فاصله کوتاهی اپ کاملا از دسترس خارج میشود. چطور میتوانم از این مسئله جلوگیری کنم و زیرو داونتایم داشته باشم؟
دلیل این مسئله این است که قبل از بالا آمدن کامل نسخه جدید اپ، نسخه قدیمی اپ پایین میرود و اندکی فاصله تا بالا آمدن کامل و اماده شدن نسخه جدید وجود دارد که در آن اپ شما بالا نیست. شما میتوانید با تنظیم Readiness Probe (HTTP) ترتیبی بدهید که تا وقتی نسخه جدید اپ کاملا آماده دریافت ریکوئست نشده، نسخه قدیمی پایین نیاید. سادهترین شکل Readiness Probe (HTTP)، یک اندپوینت ساده در اپ است که صرفا جواب ۲۰۰ برمیگرداند. همچنین میتوانید با تنظیم readinessProbe و RollingUpdate در بخش CustomConfig و همچنین تنظیم replica، شخصیسازی بیشتری برای داشتن داونتایم صفر اعمال کنید.
بعد از اضافه کردن دیسک به اپ، اپم از کار افتاده است.
احتمالا آدرسی که هنگام اضافه کردن پارتیشن به اپ وارد کردهاید، قبلا دارای اطلاعاتی بوده که با اضافه کردن دیسک روی آن، این اطلاعات از بین رفته و باعث اشکال در اپ شما شده است. دقت داشته باشید که وقتی آدرسی را به عنوان دیسک، mount میکنید، کل محتوای قبلی آن آدرس پاک خواهد شد. در مجموع بهتر است فولدر mount کردن دیسک را طوری انتخاب کنید که به جز فایلهایی که قرار است توسط شما تغییر داده شوند، فایل دیگری در آن وجود نداشته باشد. اگر حتما به persist شدن یک فولدر حاوی فایلهای قبلی نیاز دارید، لازم است بعد از اضافه کردن دیسک، محتوای قبلی آن فولدر را خودتان به صورت دستی اضافه کرده و اپ را ریستارت نمایید.
پس از mount مسیر دیسک، محتوای پوشه آن حذف میشود.
این مورد بهدلیل تفاوت نحوه کارکرد کوبرنتیز و داکر است. در کوبرنتیز وقتی مسیری را به عنوان دیسک، mount میکنید، کل محتوای قبلی آن پوشه (در داکر ایمیج) پاک خواهد شد. در صورتی که در داکر محتوا مسیر mount شده باقی خواهند ماند.
مقدار خروجی دستور du با مقدار df برای دیسکها متفاوت است و فضای بیشتری مصرف شده است
به خاطر نحوهی کارکرد سیستم بکاپ، یک نسخه از اسنپش ات از دیتا به شکل Copy On Write روی دیسک ذخیره میشود. این فضا در واقع مصرف شده است اما فایلهای آن توسط برنامه و در ترمینال قابل مشاهده نیستند. اختلاف این فضای دیسک وابستگی به نرخ تغییرات فایلها در بازهی گرفته شدن بکاپ تا الان دارد. در صورت نیاز به خالی شدن این فضا، بکاپ جدیدی را (از تب بکاپ یا قسمت بکاپ در سایدبار) اجرا کنید تا اسنپشات جدیدی گرفته شود و اسنپشات بکاپ قبلی از دیسک پاک شود. برای اطلاعات بیشتر به صفحهی دیسک در دارکوب مراجعه فرمائید.
میخواهم آیپی خروجی اپ را جهت وایتلیست کردن به بانک یا پنل پیامکی ارائه کنم.
آیپی خروجی اپ شما در صفحه مشخصات اپ به عنوان آیپی کلاستر آورده شده است. برای مشاهده، در صفحه مخشصات اپ روی گزینه IP کنار نام کلاستر کلیک کنید. این آیپی ثابت است و تغییر نمیکند. اگر قرار به تغییر این آیپی باشد، همروش حتما از قبل شما را از این مسئله مطلع خواهد کرد.
همچنین شما میتوانید با زدن دستور curl ifconfig.co
در ترمینال اپ، آیپی خروجی اپ را مشاهده کنید که دقیقا برابر با آیپی ذکر شده در مشخصات اپ است.
میخواهم اپهای خود را به همدیگر متصل کنم، اما نمیخواهم این اپها در سطح اینترنت قابل دسترسی باشند.
بهترین راهکار برای این مسئله این است که اپهایی که قرار است به هم وصل شوند را در یک namespace قرار دهید. به این ترتیب شما میتوانید از قابلیت آدرس داخلی برای اتصال اپها به هم استفاده کنید. به این ترتیب نیازی به expose شدن اپها در سطح اینترنت نخواهید داشت. آدرس داخلی هر اپ در صفحه مشخصات آن اپ قابل مشاهده است.
چگونه میتوانم اپهایی که داخل یک namespace یکسان هستند را به هم متصل کنم؟
اگر سرویس های مبدا و مقصد هر دو در یک کلاستر و در یک namespace هستند،
میتوانید با آدرس SVC_NAME.NS.svc
به مقصد متصل شوید که در آن NS نام namespace و SVC_NAME نام service
مقصد است.
اگر سرویس مقصد را با دارکوب دیپلوی کردهاید، SVC_NAME همان نام اپ است.
اگر به کلاستر دسترسی دارید یا دسترسی kubeconfig دانلود کردهاید، میتوانید با دستور kubectl get svc -n NS مقدار آن را پیدا کنید. در غیر این صورت، تیکت ثبت کنید.
برای اپها/پادهای دیسکدار به مشکل permissions برخورد میکنم و برنامه دسترسی به پوشهی مربوطه ندارد.
در صورتی که کانتینرِ اپ/پاد شما با userای غیر از root اجرا شود
(که در بسیاری از ایمیجهای رایج به دلایل امنیتی مشاهده میشود) دسترسی (خواندن/نوشتن)
در پوشهای که دیسک به آن الصاق شده است را ندارد.
برای بررسی وجود این مسئله میتوانید به مستندات خود ایمیج مراجعه کنید
یا داخل کانتینر (پس از exec) دستور id
را بزنید. برای رفع این مشکل میتوان به چند طریق عمل کرد.
راه اول استفاده از ایمیجی دیگر، که با یوزر root اجرا میشود (مثلا alpine)، به عنوان initcontainer است. در این حالت initcontainerای که دسترسی به دیسک هم دارد، در دستور اجراییاش عملیات chown بر روی پوشهی دیسک را انجام میدهد. برای این کار باید user_id و group_idای که پردازه کانتینر اصلی با آن اجرا میشود را پیدا کنیم و در دستور زیر وارد کنیم:
chown -R UID:GID /DISK_MOUNT_POINT
راه دیگر استفاده از مفهوم fsGroup در قسمت securityContext مانیفست پاد هست. برای اطلاعات بیشتر به صفحهی توضیحات secrurity context کوبرنتیز مراجعه کنید.
راه دیگر این است که ایمیج اپ/پاد را موقتا به ایمیجی دیگر (مثلا alpine) تغییر دهیم و از طریق تنظیم دستور اجرایی (یا با exec کردن در کانتینرش) دسترسی پوشهی دیسک را (مشابه حالت initcontainerای) اصلاح کنیم و سپس با ویرایش مجدد، آدرس ایمیج را به ایمیج اصلی بازگردانیم.
چرا نباید از تگ latest برای انتخاب ایمیجهای داکر استفاده کنیم؟
تگ latest در گذر زمان و با افزایش نسخه، همواره به یک نسخه خاص و ثابت از ایمیج اشاره نمیکند. در صورت وجود تغییرات backward incompatible در نسخهی جدید و دریافت و اجرای مجدد ایمیج latest (به هر دلیلی) مشکلاتی در اجرای برنامه به وجود خواهد آمد. همچنین استفاده از تگ latest عملیات rollback و مشاهدهی تاریخچهی تغییرات را سخت میکند.
توصیه میشود که برای انتخاب تگ ایمیج یا از تگ دقیق (مثلا 1.2.3 یا digest) استفاده کنیم و یا در صورت پشتیبانی برنامه از Semantic Versioning، از قسمت Major.Minor (مثلا 1.2) به عنوان تگ استفاده کنیم. به این ترتیب در هر بار دریافت و اجرای مجدد ایمیج، از آخرین عدد بخش سوم تگ (یعنی بخش نشانگر patch) استفاده میشود و آخرین patchهای امنیتی خودبخود در اپ اعمال خواهند شد. با توجه به این که این patchها حتما با نسخهی minor سازگار هستند، این مورد معمولا مشکلی در اپ به وجود نمیاورد.
چرا بیلدهای من ناموفق میشوند؟
ناموفق شدن بیلد دلایل مختلفی میتواند داشته باشد. برخی از این دلایل عبارتند از:
- مشکلات شبکه و مولفههای زیرساختی. در این موارد با retry بیلد ممکن است مشکل برطرف شود.
- رسیدن به محدودیت زمان بیلد ماهانه.
هر سازمان دارکوب در طول یک ماه میتواند حداکثر ۱۰۰ ساعت بیلد رایگان داشته باشد. در صورتی که خطای
monthly build quota
را مشاهده کنید، یعنی سهمیه بیلد این ماه شم ا پر شده است و باید تا ماه بعدی منتظر بمانید. هر سازمان دارکوب در طول یک ماه میتواند حداکثر ۱۰۰ ساعت بیلد رایگان داشته باشد. در صورتی که خطای مربوطه را در اجرای بیلد جدید مشاهده کنید، یعنی به این محدودیت رسیدهاید. - طولانی شدن زمان بیلد. در صورتی که زمان بیلد از دو ساعت فراتر رود، بیلد شما توسط دارکوب kill خواهد شد.
- مصرف حافظه بالا.
همچنین محدودیت حافظهی بیلد در دارکوب ۲ گیگابایت است و در صورتی که پردازهی بیلد به این محدودیت برخورد کند، ممکن است kill شود. در بیلدهای nodejs، میتوانید با ست کردن متغیر
NODE_OPTIONS
این محدودیت رم را در اپ خود مشخص کنید. توضیحات تکمیلی در این مورد در صفحهی ساخت اپ ریاکت داده شده است.
میخواهم هنگام بیلد به دیتابیسم که در namespace اپ مورد نظر قرار دارد، دسترسی داشته باشم؛ اما بیلدم دچار خطا میشود.
احتمالا برای ارتباط با دیتابیس از آدرس داخلی استفاده شده است. بیلدهای دارکوبی در یک namespace متفاوت از خود اپ انجام میشوند، بنابراین نمیتوان با آدرس داخلی به اپهای آن نیماسپیس دسترسی داشت. برای رفع مسئله میتوانید از آدرس خارجی اپ دیتابیس برای اتصال استفاده کنید. لازم به ذکر است که به صورت ایدهآل بهتر است برنامه شما به گونهای طراحی شود که اقدامات مرتبط با دیتابیس، نه در هنگام بیلد که در هنگام دیپلوی انجام شوند
آیا با آدرس داخلی میتوانم بین اپهای دو نیماسپیس یا اپهای دو کلاستر مختلف ارتباط برقرار کنم؟
خیر، آدرس داخلی تنها امکان ارتباط بین اپهای یک نیماسپیس را فراهم میکند. برای ارتباط با اپهای خارج از این محدوده نیاز است از آدرس خارجی، دسترسی از طریق اینترنت، یا آدرس دامنه استفاده کنید.
در بخشی از اپم فایل یا دیتایی ذخیره کرده بودم که پس از ریستارت یا ذخیره تغییرات، پاک شده است.
فایل سیستم ذخیرهی فایلها در کانتینرها ماندگار (persistent) نیست و در صورت ریست کانتینر، دادههایی که در خود داکر ایمیج نیستند، پاک میشوند. برای ماندگاری دادهها باید از ویژگی دیسک در دارکوب استفاده شود. در این صورت دادههای موجود در همان پوشهی خاصی که دیسک روی آن mount شده بود، ماندگار خواهند شد. این ویژگی مخصوصا در استفاده از اپهای دیتابیسی اهمیت بیشتری پیدا میکند.
آیا دیتای غیر ماندگار (ephemeral) در اپ محدودیت حجم دارد؟
بله. در دارکوب مقدار محدودی دیتا به شکل ephemeral میتوان نگهداشت و برای حجم زیاد بهتر است از دیسک استفاده کنید که در سوال قبلی به آن پاسخ داده شده است. برای debugging از این حجم استفاده کنید.
چرا پیام «مقدار دیسک به حداکثر رسیده است» را مشاهده میکنم؟
این مورد در شرایطی رخ میدهد که دیسک سرور مربوطه ظرفیت افزایش ندارد. در این شرایط و در صورت نیاز به افزایش ظرفیت دیسک میبایست عملیات انتقال دیسک به سروری دیگر انجام شود. این عملیات نیازمند downtime برای اپلیکیشن مربوط به آن است. مدت زمان مورد نی از برای فرآیند انتقال به ازای هر GB دیسک ۱ الی ۲ دقیقه تخمین زده میشود. در صورت نیاز به افزایش ظرفیت دیسک، حجم افزایشی مورد نظر خود را از طریق تیکت به پشتیبانی فنی اعلام کنید.
چرا حساب کاربری من تعلیق شده است؟
در صورتی که از بستر دارکوب برای انجام فیشینگ استفاده نمایید، ابزارهای امنیتی علیه سرویسهای دیگران اجرا کنید، و یا سیاست مصرف منصفانه همروش را رد کنید حساب شما تعلیق خواهد شد.