Skip to main content

سوالات متداول

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

می‌خواهم هر بار که در برنچ تنظیم‌شده پوش (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 دیسک ۱ الی ۲ دقیقه تخمین زده می‌شود. در صورت نیاز به افزایش ظرفیت دیسک، حجم افزایشی مورد نظر خود را از طریق تیکت به پشتیبانی فنی اعلام کنید.

چرا حساب کاربری من تعلیق شده است؟

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

برای این که سالم بودن اپ من به شکل دوره‌ای و اتوماتیک بررسی شود چه کاری باید انجام دهم؟

در کوبرنتیز امکانی وجود دارد که می‌توانید یک endpoint پروتکل http را مشخص کنید تا به شکل منظم به آن درخواست دهد و در صورتی که status code مناسب دریافت نکند، آن اپ را ناسالم و وضعیت آن را Not Ready می‌کند. این endpoint را Readiness Probe (HTTP) می‌نامیم. به این شکل وقتی اپ شما در شرایط ناسالم قرار گرفت متوجه آن خواهید شد. علاوه بر این وقتی دیپلوی جدید می‌کنید (مثلا به پروژه‌ی خود در هم‌گیت پوش می‌کنید و نسخه‌ی جدید از اپ دیپلوی می‌شود). تا زمانی که این Readiness Probe (Health Check) موفقیت‌آمیز نباشد، ترافیک کاربران را به آن نمی‌فرستد و نسخه‌ی قبلی را هم پایین نمی‌آورد. این کار باعث می‌شود احتمال داشتن down time موقع آپدیت اپ کمتر شود. در صفحه‌ی «اطلاعات عمومی» اپ می‌توانید در بخش "Readiness Probe (HTTP)" این endpoint را تعیین کنید. اگر نیاز دارید که با یک دستور سالم بودن اپ را بررسی کنید از custom config استفاده کنید.

می‌خواهم منابع اپ را افزایش دهم ولی پیام انتقال به یک node دیگر دریافت می‌کنم.

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

برای اتصال دو اپ به یکدیگر چه کار باید کرد؟

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

برای مثال فرض کنید یک اپ بک‌اند دارید که باید به دیتابیس وصل شود. در اپ بک‌اند با یک متغیر محیطی آدرس دیتابیس را بگیرید و در قسمت "Environment Variables" در تنظیمات دارکوب مقدار این متغیر را برابر آدرس داخلی دیتابیس قرار دهید.

آدرس دامنه‌ای برای اپ خود اضافه کرده‌ام اما کار نمی‌‌کند.

ممکن است رکورد DNS مورد نیاز برای دامنه هنوز اضافه نشده باشد. رکورد مورد نیاز را می‌توانید در بخش «آدرس دامنه» مشاهده کرده و در تنظیمات پروایدر خود اضافه کنید. همچنین ممکن است اپ شما رکورد نادرستی داشته باشد، مثلا رکوردی که از استفاده قبلی جا مانده است. برای بررسی این موارد می‌توانید از دستور dig در ترمینال یا وب‌سایت nslookup استفاده کنید. در صورتی که از CDN استفاده می‌کنید رکورد مشاهده‌شده متفاوت با رکوردی که در تنظیمات پروایدر اضافه کرده‌اید خواهد بود.

آدرس دامنه‌ای که برای اپ اضافه کرده‌ام، خطای SSL می‌دهد یا توسط مرورگر، ناامن تشخیص داده می‌شود.

ناامن تشخیص داده شدن توسط مرورگر معمولا نمایانگر این است که مشکلی در دریافت SSL Certificate وجود دارد. با بررسی تب آدرس دامنه می‌توانید وضعیت گرفته‌شدن گواهی SSL را مشاهده کنید. در صورتی که از CDN یا Proxied DNS استفاده می‌کنید، نیاز است به صورت موقت CDN را خاموش کنید تا گواهی گرفته شود و پس از گرفتن گواهی دوباره CDN را روشن نمایید. همچنین در صورتی که امکان HTTPS Redirect در سمت پروایدر شما فعال است، می‌توانید آن را غیرفعال کرده و تنظیم SSL Redirect در سمت دارکوب را فعال نمایید تا گواهی از سمت دارکوب گرفته شده و خطا برطرف گردد.

چرا در لاگ اپ، مرتبا خطای SSL مشاهده می‌کنم؟

احتمال دارد دامنه‌ای تنظیم کرده باشید که گواهی SSL آن هنوز با موفقیت صادر نشده است. ممکن است یکی از دامنه‌های تنظیم‌شده رکورد نداشته یا رکورد نادرست داشته باشد. همچنین در صورتی که دامنه پشت CDN قرار داشته باشد ممکن است نیاز باشد برای مدت موقتی CDN را غیرفعال کنید تا گواهی گرفته شود.

آیا امکان دسترسی از طریق SSH به اپ‌ها وجود دارد؟

نمی‌توان از طریق SSH به اپ‌ها دسترسی پیدا کرد. به جای آن می‌توانید از kubectl exec استفاده کنید که در این مستند نحوه‌ی کار با آن آمده است یا از تب «ترمینال» در اپ استفاده کنید.

برای ساخت اپ از ایمیج بخصوصی نیاز به دسترسی اجرای دستورات privileged دارم (مثلا --cap-add).

اجرای کانتینر با دسترسیِ privileged در کلاسترهای عمومی دارکوب ممکن نیست.

آیا در پلتفرم ابری دارکوب می‌توان میل سرور ساخت؟

برای ایجاد میل سرور نیاز است تعدادی پورت مشخص به بیرون اکسپوز شوند. در پلتفرم ابری از آیپی مشترک استفاده می‌شود و نمی‌توان این پورت‌های ثابت را به یک اپ اختصاص داد. در نتیجه نمی‌توان چنین سرویسی ساخت. می‌توانید از سرویس‌های موجود دیگر مانند Yandex استفاده کنید.

چگونه می‌توان آی‌پی واقعی کاربران را در درخواست‌های HTTP به دست آورد؟

می‌توانید مقدار هدر X-Real-Ip را استفاده کنید.

چطور timezone کانتینر را تغییر دهیم؟

برای تغییر timezone کافی است دو خط زیر را داخل داکرفایل خود اضافه کنید.

ENV TZ="Your Timezone"
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

می‌توانید لیست timezoneها را در ویکی پدیا ببینید.