<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های عرفان نصرتی</title>
        <link>https://virgool.io/feed/@erfannosrati20</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-10 14:21:14</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1405661/avatar/OhvMD6.jpeg?height=120&amp;width=120</url>
            <title>عرفان نصرتی</title>
            <link>https://virgool.io/@erfannosrati20</link>
        </image>

                    <item>
                <title>الگوریتم‌های اجماع</title>
                <link>https://virgool.io/@erfannosrati20/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85-%D9%87%D8%A7%DB%8C-%D8%A7%D8%AC%D9%85%D8%A7%D8%B9-alod1euryhyk</link>
                <description>در دنیای امروز که همه جا صحبت از رمزارزها و پردازش‌های ابری و توزیع شده است الگوریتم اجماع (consensus algorithms) نقش مهمی را ایفا می‌کنند و انجام کار ها به صورت توزیع شده با چالش هایی روبه‌رو است که در ادامه سعی داریم به زبانی ساده و دور از ریاضیات سخت آن را بیان کنیم. در نوشتن این مقاله از کتاب های الگوریتم های توزیع شده نانسی لینچ و ون فوکینک استفاده شده است. یک الگوریتم اجماع در واقع یک مکانیزم است که این امکان را فراهم می‌کند که چند ماشین بتوانند بر سر یک موضوع به توافق برسند بدون اینکه یک ناظر کلی در اجرای الگوریتم تاثیری داشته باشد. الگوریتم اجماع باید در مقابل خطاها از خود انعطاف نشان دهد که این خطا ها می‌توانند خراب شدن یکی از ماشین ها، نرسیدن پیام و … باشد. در الگوریتم هایی که به صورت سنتی در بحث‌های رای گیری و اجماع استفاده می‌شود یک ناظر کلی وجود دارد که همه اعضای سیستم و حالتی که هر کدام در آن هستند را مشاهده می‌کند و بر اساس این حالت ها تصمیم گیری صورت می‌گیرید و بقیه اعضا باید تصمیم گرفته شده را بپذیرند.اما سختی کار در الگوریتم‌های توزیع شده این است که دیگر ناظر کلی وجود ندارد و هر گره بر اساس حالت اولیه خودش و پیغام هایی که به او رسیده یک تصمیم را در آن لحظه می‌گیرید و این باعث می‌شود که مثلا در صورتی که دو پیام در یک لحظه به یک گره فرستاده شود در صورتی که ترتیب آنها عوض شود تصمیمی که گره گیرنده می‌گیرد نیز متفاوت باشد به همین دلیل باعث می‌شود تا این سیستم ها به طور ذاتی غیر قطعی(nondeterministic) باشند.قبل از شروع بحث نیاز است برخی از اصطلاحات توضیح داده شود تا در ادامه فهم موضوعات ساده‌تر باشد.گره متخاصم (Byzantine node): گره‌ای است که قصد خراب کردن سیستم را دارد و نمی‌توان از آن انتظار هیج کار صحیحی داشت.ازکار افتادن گره (node failure):گره‌ای است که تا به حال به درستی کار می‌کرده است اما کرش کرده و خراب شده است و دیگر درخواستی را پاسخ نمی‌دهد و پیامی نمی‌فرستد.از کار افتادن مسیر ارتباطی (link failure): در صورتی که این اتفاق رخ بدهد و لینک ارتباطی بین دو یا چند گره قطع شود دیگر امکان تبادل پیام بین آن دو یا چند گره وجود ندارد.سیستم سنکرون (synchronous): زمانی که بتوانیم برای رسیدن پیام گره‌ها به هم یک حد بالا تعریف کنیم یا به عبارت ساده‌تر بتوانیم تضمین کنیم که پیام ها حداکثر با یک تاخیر مشخص از گره فرستنده به گیرنده می‌رسند سیستم سنکرون است. در این صورت در سیستم سنکرون به دلیل وجود این حداکثر تاخیر می‌توان مراحل یا اپیزود برای سیستم در نظر گرفت.سیستم آسنکرون (asynchronous): درست برخلاف سیستم بالا یعنی نمی‌توان حاکثری برای رسیدن پیام‌ها متصور شد.برای شروع از یک مثال معروف و ساده شروع می‌کنیم تا بیشتر با یکی از انواع الگوریتم های اجماع که الگوریتم های Election‌هستند آشنا شویم.انتخاب رهبردر مسئله انتخاب رهبر (leader election) بیان می‌شود که درصورتی که ما چندین گره یکسان داشته باشیم که از هر لحاظی با هم یکسان باشند و هر گره‌ای تنها با گره سمت راست خود در ارتباط باشد(مانند شکل زیر). و سیستم نیز یک سیستم سنکرون و بدون گره متخاصم و خرابی راه ارتباطی باشد در این صورت با هیچ الگوریتمی نمی‌توان یک گره را به عنوان رهبر انتخاب کرد.گره های یکسان که تنها در یک جهت می‌توانند پیغام‌ها را ارسال کنند.شاید در هنگام خواندن این مسئله ( در صورتی که قبلا آن را ندیده باشید) از جواب شوکه شده باشید و منتظر یک الگوریتم ساده برای انتخاب رهبر بوده‌اید. اما نکته‌ای که در این مسئله وجود دارد این است که تمام گره‌ها یکسان هستند پس در ابتدا در یک حالت بوده اند و یک پیام خاص را فرستاده اند و همه یک پیام خاص را دریافت کرده اند و در این صورت اگر گره ای به صورت رهبر انتخاب شود بقیه نیز خود را رهبر می‌دانند.اما شاید با خود بگویید هر کدام یک عدد رندوم تولید کنند یا یک از نودها یک پیغام را در اول به نود دیگر بدهد اما باید در نظر گرفت اگر بتوان کاری کرد که یکی از نود ها عددی رندوم تولید کند یا پیغامی خاص بدهد عملا مسئله حل شده است و آن گره به عنوان رهبر می‌توانست انتخاب شود.انتخاب رهبر زمانی که هر گره یک آیدی خاص دارداما مسئله در صورتی که هرکدام از این گره‌ها یک کد منحصر به فرد داشته باشند قابل حل است. فرض کنید که هر گره یک آیدی منحصر به فرد داشته باشد و الگوریتمی را در نظر بگیرید که هر گره در هر مرحله یک آیدی خاص را به گره‌ای که با آن در ارتباط است می‌فرستد این آیدی خاص به این صورت فرستاده می‌شود که در صورتی که تا به حال هیج آیدی نگرفته باشد (مرحله اول و شروع الگوریتم) هر گره آیدی خود را به گره همسایه خود می‌فرستد و از مرحله یک به بعد بزرگترین آیدی درمیان آیدی‌هایی که تا کنون دریافت کرده و آیدی خود گره به گره همسایه ارسال می‌کند.در این صورت اگر ما n گره در این شبکه داشته باشیم پس از n مرحله همه گره‌ها آیدی بزرگترین گره را برای نود همسایه خود ارسال می‌کنند و شرط پایان این الگوریتم این است که یک گره آیدی خودش را دریافت کند در این صورت می‌فهمد که هیج گره‌ای با آیدی بزرگتر از آیدی خودش در این گراف وجود ندارید و بقیه گره‌ها نیز بزرگترین آیدی را دارند به همین با O(n^2) پیام ( n راند و در هر راند n پیام رد و بدل می‌شود) به اجماع رسیده اند.تاکنون درباره اهمیت و تعاریف ساده الگوریتم های اجماع صحبت کردیم در قسمت بعدی به سراغ الگوریتم‌های اجماع یکی در سیستم‌های سنکرون و دیگری در سیستم‌های آسنکرون می‌رویم. </description>
                <category>عرفان نصرتی</category>
                <author>عرفان نصرتی</author>
                <pubDate>Tue, 01 Feb 2022 16:27:42 +0330</pubDate>
            </item>
                    <item>
                <title>الگوریتمهای اجماع در سیستم‌های سنکرون</title>
                <link>https://virgool.io/@erfannosrati20/%D8%A7%D9%84%DA%AF%D9%88%D8%B1%DB%8C%D8%AA%D9%85%D9%87%D8%A7%DB%8C-%D8%A7%D8%AC%D9%85%D8%A7%D8%B9-%D8%AF%D8%B1-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%87%D8%A7%DB%8C-%D8%B3%D9%86%DA%A9%D8%B1%D9%88%D9%86-aiachxtls1ta</link>
                <description>مطالبی که در این بخش آمده‌ نیاز دارد تا بخش قبلی را مطالعه کرده باشید.در این نوشته سعی داریم با یکی از معروف‌ترین الگوریتم‌هایی که در زمینه اجماع در سیستم‌های آسنکرون داریم آشنا شویم و سپس مطالعه کنیم این الگوریتم‌ها در کجا کاربرد دارند.در ابتدا باید بررسی کنیم تحت چه شرایطی می‌توان گفت که گره‌‌ها توسط یک الگوریتم اجماع به اجماع رسیده اند. سه شرط زیر برای رسیدن به اجماع لازم است:توافق (agreement): یعنی تمام گره‌ها یک مقدار را به عنوان خروجی انتخاب کنند.خاتمه (termination): یعنی تمام گره‌ها در یک زمان محدود به یک نتیجه برسند. (این شرط باعث می‌شود تا الگوریتم تا زمان بی‌نهایت اجرا نشود.)اعتبار (validity): الگوریتم های باید بگونه باشد که خروجی براساس مقدار گره‌های راستگو مشخص شوند. برای مثال الگوریتمی که فقط یک یا فقط صفر را در یک مجموعه باینزی فارغ از مقدار گره‌ها خروجی می‌دهد هم توافق دارند هم می‌تواند در اولین مرحله خاتمه یابد زیرا مثلا همه گره‌ها در مرحله اول مقدار صفر را انتخاب می‌کنند و مسئله تمام می‌شود.با دانستن سه شرط بالا حال ما مسئله رسیدن به اجماع در زمانی که گره‌های متخاصم در شبکه داریم را بررسی می کنیم که این مسئله تعمیم یافته شبکه است که گره‌ها می‌توانند در آن از کار بی‌افتند. در زیر سعی داریم که بدون ورود به ریاضیات مسئله، اجماع در سیستم‌های سنکرون در زمانی که بعضی از نود‌ها متخاصم هستند (یعنی دروغگو هستند و می‌توانند اطلاعات غلط داشته باشند.) را بررسی کنیم. در صورت نیاز به مطالعات بیشتر می‌توانید به این مقاله یا کتاب نانسی لینچ که در نوشته قبلی آورده شده بود مراجعه کنید.تعریف مسئلهفرض کنید ما n گره که در شبکه داریم f تا از آن‌ها متخاصم هستند و می‌خواهیم الگوریتمی را اجرا کنیم که پس از اجرای آن تمام گره‌های درستکار (n-f گره) به یک تصمیم واحد برسند. در ابتدا چند مفهوم را تعریف می‌کنیم.کلید خصوصی و عمومی (Public Key and Private Key): یک جفت کلید هستند که برای اجراز هویت و رمز کردن محتوای یک پیام به کار می‌روند. به طور کلی به این صورت عمل می‌کنند که متنی که توسط کلید عمومی قفل شود تنها توسط کلید خصوصی شخص می‌توانند دوباره به متن درست تبدیل شود. و از این ویژگی می‌توان به عنوان امضای دیجیتال استفاده کرد. برای انجام این کار به صورت زیر عمل می‌شودشخص ابتدا یک کلید جفت عمومی و خصوصی تولید می‌کند و هر پیامی را که می‌فرستد با کلید خصوصی خود قفل می‌کند و کلید عمومی را نیز در اختیار همه قرار می‌دهد در نتیجه هر کس با در اختیار داشتن کلید عمومی شخص می‌تواند متن را رمزگشایی کند و مطمئن باشد که پیام از شخص مورد نظر دریافت شده است زیرا در غیر این صورت پیام با کلید عمومی آن شخص رمزگشایی نمی‌شد. ما از این ویزگی در ادامه برای احراز هویت پیام های ارسال شده استفاده می‌کنیم.درخت EIG : این درخت، درختی است که برای جمع آوری اطلاعت استفاده می‌شود و به شکل زیر استابتدا برای آشنایی با این شبکه بیاید شبکه از گره ها را در نظر بگیریم که با هم پیام تبادل می‌کنند این درخت یک نمایش پیام های ارسال شده در این شبکه است. که در لایه اول و اولین گره مقدار اولیه این گره قرار دارد که در بعد مقدار گره یک که از خود گره ۲ دریافت شده است در گره ۱ ذخیره می‌شود و مقدار گره ۲  که از خود ۲ دریافت شده است در گره ۲ ذخیره می‌شود و به همین صورت تا آخر. در لایه های بعدی مقدار گره‌ها با توجه به گره‌های واسطه ذکر شده‌اند برای مثال گره‌ای با تگ ۱۲۳۴ به این معنی است که مقدار گره ۱ با واسطه از طریق گره ۲ به گره ۳ و از طریق گره ۳ به گره ۴ رسیده است. و در آن گره مقداری که گره ۳ در مورد مقدار گره ۱ گفته است آورده شده است.حال با استفاده از دو مفهوم بالا می‌توان به سراغ مسئله رفت و آن را حل کرد.در ابتدا ثابت می‌شود که برای اینکه الگوریتم اجماع در شبکه سنکرون با گره‌های متخاصم به نتیجه برسد باید کمتر از یک سوم گره‌ها متخاصم باشند و در غیر این صورت این الگوریتم جواب نمی‌دهد. پس تعداد نود های متخاصم، f کمتر از یک سوم تعداد کل گره‌ها است.(n&gt;3f)در این مسئله همانطور که در ابتدا گفته شد گره‌های متخاصم می‌توانند درباره مقدار اولیه خودشان و بقیه گره ها دروغ بگویند و یا مقدار های‌ مختلفی را به نود های متفاوت بدهند. برای مثال اگر گره ۲ متخاصم باشد می‌تواند به گره ۱ مقدار اولیه خود را ۰ و به گره ۳ مقدار اولیه خود را ۱ گزارش کند. یا حتی در صورتی که گره ۱ یک گره درستکار باشد و مقدار اولیه ۰ داشته باشد گره ۲ مقدار اولیه گره ۱ را ۱ به گره ۳ اعلام کند.با در نظر گرفتن فرض های بالا و استفاده از درخت EIG برای حمع آوری پیام ها و کلید عمومی و خصوصی برای احراز هویت پیام ها می‌توان به صورت زیر عمل کرد.چون سیستم سنکرون است پس پیام ها حداکثر تا یک تاخیر t به مقصد می‌رسند و پس می‌توان اجرای شبکه را به مراحل یا ایپزودهایی تقسیم بندی کرد. و همچنین فرض کی کنیم گراف کامل است یعنی تمام گره ها به همدیگر متصل هستند. در این صورت در مرحله اول اجرا لایه اول درخت EIG گره ها مقدار دهی می‌شود زیرا در مرحله اول هر گره تنها مقدار گره خود را به تمام گره ها می‌فرستد در فرستادن پیام‌ها گره ها پیام ها را توسط کلید خصوصی خود قفل می‌کنند تا گره‌های گیرنده با تطبیق کلید خصوصی و عمومی هر یک از آنها از درست بودن فرستنده مطمئن شوند .در مراحل بعد هر گره علاوه بر مقدار اولیه خود مقدار هایی که تاکنون به آن دست یافته است را برای بقیه گره‌ها ارسال می‌کند در نتیجه لایه دوم هر گره نیز پر می‌شود برای مثال فرض کنید گره یک در راند ۱ به ترتیب مقدار های ۰، ۰ ، ۱ را از نود های ۲، ۳ ، ۴ گرفته است و در مرحله بعد این مقدار ها را برای هر ۳ گره ۲، ۳ و ۴ ارسال می‌کند. حال گره ۲ را در نظر بگیرید در این راند این گره در شبکه، گره های ۱۲، ۱۳، ۱۴ را در درخت خود اپدیت می‌کند معنی ۱۲ همانطور که پیشتر اشاره شده بود آن است که مقدار گره ۲ که توسط گره یک گزارش شده است.با اجرای این الگوریتم به تعداد f+1 بار تمام f+2 لایه درخت تمام پر می‌شود.زمانی که درخت به صورت کامل پر شد به این صورت عمل می‌کنیم که از لایه آخر شروع می‌کنیم و مقدار گره های پدر آن را بر اساس اکثریت آرا در لایه پایین‌تر آپدیت می‌کنیم و در صورتی که آرا نصف نصف بود یک مقدار از پیش تعیین شده مانند ۰ را قرار می‌دهیم. و به همین صورت درخت را تا ریشه لایه به لایه به روزرسانی می‌کنیم. با این کار مقدار ریشه یک عدد به دست می‌آید که آن تصمیم گره درست کار خواهد بود.در قسمت بعدی ما یک الگوریتم اجماع در سیستم‌های آسنکرون را بررسی خواهیم کرد.</description>
                <category>عرفان نصرتی</category>
                <author>عرفان نصرتی</author>
                <pubDate>Tue, 01 Feb 2022 16:26:02 +0330</pubDate>
            </item>
                    <item>
                <title>کوبرنتیز چیست ؟</title>
                <link>https://virgool.io/@erfannosrati20/%DA%A9%D9%88%D8%A8%D8%B1%D9%86%D8%AA%DB%8C%D8%B2-%DA%86%DB%8C%D8%B3%D8%AA-bwq61wsqavd9</link>
                <description>کوبرنتیز(Kubernetes) چیست ؟کوبرنتیز یا K8s (که عدد ۸ بیانگر تعداد حروف بین K و s است) یک پلتفرم متن باز است که توسط گوگل توسعه یافته است و اجرا و مدیریت اتوماتیک کانتینر هارا بر عهده می‌گیرید و به شما در مدیریت اجرای برنامه کانتینری در محیط‌های مختلف مانند سرورها؛ سرویس های ابری و ... کمک می‌کند. برای ادامه بحث و فهمیدن هرچه بهتر کوبرنتیز باید ابتدا با مفهوم کانتینر آشنا شویم. (می‌توانید در صورتی که با این مفهوم آشنایی دارید از این قسمت عبور کنید.)استقرار برنامه استقرار برنامه در طول زمان دچار دگرونی هایی شده است. استقرار برنامه به طور سنتی به این شکل بود که برنامه روی سخت افزار یک سیستم عامل نصب می‌شود و چندین برنامه روی این سیستم عامل اجرا می‌شوند. همانطور که قابل حدس است این شیوه از استقرار نرم افزار ممکن است باعث تداخل در منابع تخصیص یافته شود. برای مثال در نظر بکیرید که یک برنامه بیشتر منابع را در اختیار بگیرید و باعث شود برنامه‌های دیگر عملکرد مناسب خود را نداشته باشند. مشکل دیگر این روش کار نکردن درست برنامه در ماشین‌های متفاوت است. فرض کنید یک برنامه نویس یک برنامه را توسعه داده و در ماشین خودش تمام تست‌ها را پاس کرده اما وقتی این برنامه را به تیم عملیات می‌دهد این برنامه به درستی کار نمی‌کند و این درست کار نکردن به علت خیلی مشکلات از قبیل تفاوت در لایبری‌ها و ورژن های آنها و ... می‌تواند باشد. ( برای خواندن میم های جذاب در این باره عبارت but it works on my machine meme را جستجو کنید :) )شیوه دیگر استقرار برنامه مجازی‌سازی است (Virtualized) در این روش بر روی یک سیستم عامل ماشین‌‌های مجازی ساخته می‌شوند که این ماشین های مجازی سیستم عامل خود را دارند و این باعث ایزوله شدن برنامه‌های ماشین‌های مجازی مختلف می‌شود و باعث می‌شود بهبود مقیاس پذیری و توانایی نگه‌داری از برنامه می‌شود.شیوه نوین استقرار برنامه شیوه استقرار توسط کانتینر ها است. ایده کانتینر از شرکت های کشتی رانی گرفته شده است چون در شرکت‌های کشتی رانی محموله حمل شده مهم نیست آنها صرفا تعدادی جعبه فلزی به اسم کانتینر را جا‌به‌جا‌ و نگه داری می‌کنند و با محتوای داخلی آن ها کاری ندارند.  کانتینرها‌ مانند ماشین‌های مجازی اما سبک‌تر از ماشین‌های مجازی هستند و با این تفاوت که می‌توانند به طور مستقل از هم بر روی یک سیستم عامل اجرا شوند و این ویژگی باعث می‌شود که ایجاد و استقرار برنامه به روش کانتینر مزیت‌های بسیاری مانند سریع بودن، ایجاد روش امن برای عقب‌گرد، عملکرد تقریبا یکسان در همه پلتفرم ها و ... را داراست.در ادامه متن هر کجا از داکر که یکی از محبوب ترین روش کانتینر کردن اپلیکیشن هاست استفاده کردیم منظور روش استقرار به وسیله کانتینرها است.کوبرنتیز چه کاری انجام می‌دهد ؟قبل از اینکه در مورد کوبرنتیز صحبت کنیم ابتدا ببینیم که یک ابزار ارکستریشن (مانند کوبرنتیز) چیست؟ به وجود آمدن مفهوم ماکروسرویس ها باعث پرطرفدار شدن کانتینرها شد زیرا بسترهای سبکی هستند که می‌توانند این برنامه های سبک و مستقل را در خود اجرا کنند. و مدیریت این کانتینرها که در محیط‌های مختلف با استفاده از اسکریپت‌ها و برنامه‌های تحت نظر انسان قابل انجام نیست یا بسیار سخت است. برای مثال زمانی که در مرحله Production هستیم اطمینان از بالا بودن برنامه برای ما بسیار مهم است و در این نقطه است که کوبرنتیز به کمک ما آمده و مدیریت کانتینرها را بر عهده می‌گیرید. کوبرنتیز سرویس های زیر را ارائه می‌ده:۱. دردسترس بودن  و نگه داری از سرویس ها: یکی از تضمین هایی که کوبرنتیز به ما می‌دهد نبود زمانی است که سرویس ها پایین باشند. برای مثال اگر یک کانتینر دچار مشکل شود کوبرنتیز سعی می‌کند آن را بازیابی کند و یا یک کانتینر دیگر با آن جایگزین کند.۲. مقیاس پذیری: کوبرنتیز اجازه افزایش ظرفیت برنامه شما را به صورت سریع می‌دهد.۳.  پخش بار: کوبرنتیز می‌توانند درخواست ها را بین کانتینر های مختلف تقسیم کند به طوری که سیستم پایدار باشد.۴. منتشر کردن و عقب‌گرد اتوماتیک: فرض کنید که می‌خواهید ورژن جدید برنامه خود را منتشر کنید و می‌‌خواهید کارایی آن را تست کنید. برای اینکار ۱۰ درصد از کاربران خود را انتخاب کرده و درخواست این افراد را به ورژن جدید انتقال می‌دهید و تست های خود را انجام می‌دهید اگر موفقیت آمیز بود ورژن جدید را منتشر کرده و همه کاربران را به ورژن جدید می‌برید و در صورت خرابی به ورژن قبلی عقب گرد می‌کنید. این کار که در اینجا توصیف شد را می‌توان به صورت خودکار توسط کوبرنتیز انجام داد.۵. تخصیص بهنیه سخت افزار: کوبرنتیز این قابلیت را به شما می‌دهد تا منابع مورد نیاز برای هر کانتینر را مشخص کنید سپس خود کوبرنتیز با توجه به میزان سخت افزار شما کانتینرها را به صورتی انتخاب می‌کند که بهترین استفاده را از سخت افزار شما داشته باشد.۶. بازیابی: یکی دیگر از امکاناتی که کوبرنتیز در اختیار شما قرار می‌دهد امکان بازیابی اطلاعات و حالت برنامه هنگام وقوع یک خطا است.چه کاری را انجام نمی‌دهد ؟اما باید در نظر داشته باشیم که کوبرنتیز یک محیط با سخت افزار نیست و روی سخت افزار شما بالا می‌آید و کارهایی مانند ‌‌Build و تست سورس کد های یا فرآیند های CI/CD را انجام نمی‌دهد. همچنین کوبرنتیز خدمات لایه اپلیکیشن را ارائه نمی‌دهد و تنها image ها و کانتینر های شما را مدیریت می‌کند.نتیجه گیریکوبرنتیز مدیریت و اتوماسیون استقرار یک سیستم مبتنی بر کانتینر را بر عهده دارد. در قسمت بعد درباره چگونگی انجام این کار توسط کوبرنتیز و قسمت های مختلف آن توضیح می‌دهیم.</description>
                <category>عرفان نصرتی</category>
                <author>عرفان نصرتی</author>
                <pubDate>Fri, 24 Dec 2021 23:37:15 +0330</pubDate>
            </item>
                    <item>
                <title>کوبرنتیز چگونه کار می‌کند؟</title>
                <link>https://virgool.io/@erfannosrati20/%DA%A9%D9%88%D8%A8%D8%B1%D9%86%D8%AA%DB%8C%D8%B2-%DA%86%DA%AF%D9%88%D9%86%D9%87-%DA%A9%D8%A7%D8%B1-%D9%85%DB%8C-%DA%A9%D9%86%D8%AF-kmfqgq7e3zzn</link>
                <description> در قسمت قبل با کوبرنتیز آشنا شدیم و فهمیدیم کوبرنتیز چه کارهایی را برای ما انجام می‌دهد. در این قسمت ابتدا با معماری کوبرنتیز و سپس با اجزای مختلف آن آشنا می‌شویم.معماری کوبرنتیزکوبرنتیز از حداقل یک کنترل کننده (Control Plane) و یک ماشین کارگر (که به آن Node یا Worker Node گفته می‌شود) تشکیل شده است. کنترل کننده که بیشتر فرآیندهای (Processes) کوبرنتیز در آن اجرا می‌شوند؛ نقش  مدیریت؛ نظارت و هماهنگی کار بین گره‌های کارگر(Worker Node) را دارد که برنامه ما را اجرا می‌کنند و بیشتر منابع سخت افزاری را در اختیار دارند زیرا اجرای برنامه اصلی بر عهده همین نود‌های کارگر است و کنترل کننده تنها بر درستی و سالم بودن و دیگر موارد هماهنگ کننده بین این نود‌ها از قبیل تست‌ها و ...  نظارت می‌کند. اجزای تشکیل دهنده  Nodeنودها سرور ها یا ماشین های مجازی هستند و از اجزای زیر تشکیل شده اند:پاد (‌Pod)پاد کوچکترین قسمت نودهای کارگر هستند که یک لایه Abstraction به کانتینر ها اضافه می‌کند و در اصل بستر اجرای ایمیج‌ها؛ کانتینرها است و معمولا در هر پاد تنها یک کانتینر اجرا می‌شود. و اضافه شدن این لایه باعث‌ می‌شود پیچیدگی های سطح کانتینر در کوبرنتیز وارد نشود. هر پاد زمانی که اجرا می‌شود یک IP جدید می‌گیرید و این در جایی مشکل ساز می‌شود که یک از پادهای دچار خطا می‌شود و یک پاد دیگر را جایگزین آن می‌کنیم. در این صورت باید در اجزای دیگر که با این پاد در ارتباط هستند IP جدید را بروزرسانی کنیم.سرویس (Service)برای حل کردم مشکل ‌عوض شدن IP پادها سرویس ها استفاده می‌شوند. سرویس ها IP های ثابتی هستند که به یک پاد متصل می‌شوند و با از بین رفتن یک پاد سرویس از بین نمی‌رود و پاد جایگزین شده به این سرویس متصل شده و در این صورت پاد‌های ما همواره IP های ثابتی دارند که با از بین  رفتن و جایگزین شدن پادها تغییر نمی‌کنند.کیوبلت (kubelet)کیوبلت‌ها ایجنت‌هایی هستند که اطمینان حاصل می‌کنند تا کانتینر ها درون پادها به درستی اجرا می‌شوند و همچنین ارتباط بین Node های مختلف را ممکن می‌سازند.کانفیگ مپ (ConfigMaps)برای توضیح این کامپوننت از یک مثال استفاده می‌کنیم. فرض کنید یک برنامه دارید که دیتا های خود را درون یک دیتابیس ذخیره می‌کند. پس باید آدرس این دیتابیس را درجایی ذخیره کنیم. اگر این آدرس را داخل ایمیج ساخته شده قرار دهیم و در زمانی دیگر آدرس دیتابیس تغییر کند ما مجبور می‌شویم ایمیج ساخته شده را دوباره بیلد کنیم و در داخل ریپازیتوری قرار دهیم و سپس این ایمیج را از ریپازیتوری برداریم. برای رفع این مشکل یک کامپوننت با نام ‌ConfigMap در کوبرنتیز وجود دارد که به ما این امکان را می‌دهد تا دیتاهای تغییرپذیر و خارجی مانند آدرس دیتا بیس را در آن ذخیره کنیم و در صورت تغییر این داده ها تنها این داده ها را تغییر داده و نیازی به  فرآیندهای بیلد و پوش کردن ایمیج نباشد.(secret)حال در همان مثال بالا حالتی را در نظر بگیرید که می‌خواهید نام‌کاربر و رمز دیتابیس که آن ها نیز تغییر پذیرند را در جایی ذخیره کنید از آن جایی که ConfigMap تنها برای دیتاهای غیرمحرمانه است کامپوننت دیگری به نام secret وجود دارد که می‌توان داده‌های با حساسیت بالاتر را در آن ها ذخیره کرد.اجزای تشکیل دهنده  کنترل کننده (Control plane)kube-apiserverاین ماژول؛ در حقیقت ماژول ارتباطی ما با کوبرنتیز است که ما می‌توانیم با API یا UI یا CLT بسته به نوع استفاده (برای مثال داشبورد یا استفاده از اسکریپت‌های اتوماتیک) از آن استفاده کنیم. ‌ kube-schedulerاین کامپوننت پاد‌های جدید را که داری نود نیستند در نود ها قرار می‌دهد. برای مثال فرض کنید دو نود داریم که یکی از 60 درصد منابعش استفاده کرده است و دیگری از 20 درصد منابع در این صورت این کامپوننت پاد جدید به وجود آمده را  در داخل نودی که منابع بیشتری دارد قرار می‌دهد.etcdاین کامپوننت دیتاهای کلاستر های ما را نگه داری می‌کند. و کلاستر ها از این دیتا ها برای برای بازسازی در زمانی که خطا رخ می‌دهند استفاده می‌کنند.kube-controller-managerاین کامپوننت تغییرات داخل کلاستر را دنبال می‌کند و مدیریت می‌کند.مثلا اگر کانتینری نیاز به تعمیر داشته باشد یا خراب شده باشد آن را درست یا جایگزین می‌کند.نتیجه‌گیریدر این قسمت درباره قسمت‌های اصلی کوبرنتیز صحبت کردیم و اجزای اصلی کنترل‌کننده و Node های آن را به صورت مختصر مورد بررسی قرار دادیم. در قسمت بعد پیاده سازی یک k3s را با هم انجام می‌دهیم.</description>
                <category>عرفان نصرتی</category>
                <author>عرفان نصرتی</author>
                <pubDate>Fri, 24 Dec 2021 23:36:49 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده‌سازی k3s</title>
                <link>https://virgool.io/@erfannosrati20/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-k3s-hkbvb69hzxlt</link>
                <description>در این قسمت ابتدا کوبرنتیز را روی یک ماشین با سیستم عامل ubuntu 20.04 نصب می‌کنیم سپس یک ایمیج فرانت‌اند را توسط کوبرنتیز اجرا می‌کنیم. به دلیل تحریم ما قادر نیستیم که خود کوبرنتیز را دانلود کنیم به همین علت از یک نمونه مشابه آن به نام k3s استفاده می‌کنیم که یک توزیع از کوبرنتیز اما سبک‌تر از آن و پیچیدگی های‌ نصب کامپوننت‌های مختلف کوبرنتیز در این توزیع وجود ندارد و ما می‌توانیم توجه خود را معطوف استفاده از این برنامه‌ کنیم لینک سایت و گیت‌هاب این پروژه. نکته جالب درباره اسم این پروژه این است که خود کوبرنتیز با علامت اختصاری k8s شناخته می‌شود که ۸ مخفف ۸ حرف وسط آن است و از آنجایی که این توزیع نصف کوبرنتیز حجم دارد از k3s استفاده کرده است. در ادامه به پیاده سازی یک سرویس k3s شامل یک node کارگر و یک master می‌پردازیم.ما در این قسمت سعی داریم معماری بالا را پیاده سازی کنیم. همانطور که در تصویر بالا قابل مشاهده است این معماری شامل یک Master Node و تعداد Worker Node است که در قسمت قبل درباره آن صحبت کرده‌ایم. ما در پیاده سازی قسمت بعد تنها از یک Worker Node استفاده می‌کنیم. قسمت load balancer را نیز پیاده سازی نمی‌کنیم زیرا تنها یک نود داریم و خارج از حوصله این نوشته است.پیش از شروعپیش از شروع نصب k3s ما باید دو ماشین داشته باشیم تا بتوانیم در یکی از آنها Master Node و در دیگری Worker Node را پیاده‌سازی کنیم. برای اینکار من از VirtualBox استفاده کرده‌ام در پایین آموزش مختصر آن رارا می‌آوردم. پس از نصب دانلود این برنامه با استفاده از این لینک می‌توانید یک ماشین مجازی ایجاد کنید. همانطور که در قسمت قبل توضیح داده شد ما به دو ماشین مجازی نیاز داریم. سیستم عامل هر یک از این ماشین ها در این مثال ubuntu live server 20.04 LTS است که اگر با ترمینال آشنایی ندارید یا کار با آن برای شما سخت است می‌توانید ابونتوی عادی را نیز نصب کنید.پس از نصب و راه‌اندازی سرور ها برای اینکه بتوانید از ماشین خود به آنها دسترسی ssh داشته باشید در setting و در قسمت Network نتورک را از حالت Nat به حالت bridge در آورید سپس می‌توانید از سیستم عامل خود به این ماشین ها ssh بزنید.راه‌اندازی Masterابتدا برای نصب آن دستور زیر را میزنیم:curl -sfL https://get.k3s.io | sh -s - --no-deploy traefik --write-kubeconfig-mode 644 --node-name masterمتغییر اول این باعث می‌شود load balancer غیر فعال شود و متغیر دوم تغییرات متغیرها را انجام می‌دهد و متغیر سوم نام نود است. پس از زدن دستور بالا این دستور می‌تواند چندین دقیقه طول بکشد و زمانی که تمام شد برای اطمینان از درستی آن دستور زیر را بزنید :kubectl get nodesباید نتیجه‌ای مانند زیر را دریافت کنید:NAME         STATUS      ROLES                            AGE       VERSIONmaster        Ready         control-plane,master   10m       v1.22.5+k3s1این موضوع نشان دهنده آن است که نود مستر به درستی در حال اجرا شدن است و کار ما در این قسمت تمام است.راه‌اندازی Workerدر این قسمت باید مطمئن شویم که دو ماشین مجازی به یکدیگر ping دارند زیر در نصب worker باید مشخص کنیم که این نود مختص کدام نود ‌‌Master است. برای این کار باندا در ماشین ‌Master باید یک توکن را کپی کنیم تا در نود Worker آن را وارد کنیم. برای این کار دستور زیر را بزنید و خروجی حاصل را کپی کنید.sudo cat /var/lib/rancher/k3s/server/node-tokenK10c0170e30504120ffe8cb696d6391c6623b6667954e3ad51be09f540e1bfadf9d::server:aa33e4e0133f721bd1f812528dd4af5bحال به ماشین Worker بروید و دستور زیر را اجرا کنید. و به جای IP باید IP نود مستر را قرار دهید و به جای TOKEN نیز توکن قسمت قبل را کپی کنید.curl -sfL https://get.k3s.io | K3S_NODE_NAME=k3s-worker-01 K3S_URL=https://&lt;IP&gt;:6443 K3S_TOKEN=&lt;TOKEN&gt; sh - برای مثال آدرس ‌IP ماشین مستر من 192.168.4.7 بود و دستور برای من به شکل زیر شد:url -sfL https://get.k3s.io | K3S_NODE_NAME=worker K3S_URL=https://192.168.4.7:6443 K3S_TOKEN=K10c0170e30504120ffe8cb696d6391c6623b6667954e3ad51be09f540e1bfadf9d::server:aa33e4e0133f721bd1f812528dd4af5b sh - پس از راه اندازی این قسمت که باز ممکن است چندین دقیقه به طول بی‌انجامد درستی آن را چک می‌کنیم برای این کار باید به ماشین Master برویم و دستور زیر را که در قسمت قبل زده بودیم دوباره تکرار کنیم:kubectl get nodesNAME               STATUS    ROLES                  AGE   VERSIONmaster              Ready        control-plane,master   31m   v1.22.5+k3s1worker              Ready       &lt;none&gt;                 78s   v1.22.5+k3s1همانطور که مشاهده می‌شود به لیست ما در ماشین Master نود Worker اضافه شده است. حال ما یک k3s با یک نود Master و یک نود Worker پیاده سازی کرده ایم و تنها یک Ingress برای دیدن برنامه از بیرون و یک image برای اجرا شدن روی این نود ها نیاز داریم.پیاده‌سازی یک کانتینز ساده بر روی k3sپس از مراحل بالا ما حال به یک فایل yaml نیاز داریم که به نود مستر اطلاعات مورد نیاز برای دیپلوی کردن image داده شده را بدهد برای اینکار یک فایل با محتویات زیر نیازمندیم.apiVersion: apps/v1kind: Deploymentmetadata:  name: sharif-web-coursespec:  replicas: 4  selector:    matchLabels:      app: sharif-web-course  template:    metadata:      labels:        app: sharif-web-course    spec:      containers:      - image: frontend        imagePullPolicy: &quot;Always&quot;        name: sharif-web-course        ports:        - containerPort: 8080-------------------------------------apiVersion: v1kind: Servicemetadata:  labels:    app: sharif-web-course  name: sharif-web-coursespec:  ports:  - name: http    port: 80    targetPort: 8080  selector:    app: sharif-web-course---------------------------------apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: sharif-web-coursespec:  rules:  - http:      paths:      - path: /        pathType: ImplementationSpecific        backend:          service:            name: sharif-web-course            port:              number: 80که دو قسمتی که با خط تیره جدا شده اند نقش Ingress را بازی می‌کنند و در اینجاا از ingress-nginx استفاده شده است. این دیپلوی منت از این جا برداشته شده است و متانسب با image ما تغییر یافته است ضمنا قسمت آخر این مانیفست حذف شده است زیرا کاربرد DNS را دارد که برای ما مورد نیاز نیست.در جلوی تگ image به جای front باید آدرس ایمیج از یک رجیستری داده شود. اما این قسمت را به دلیل فیلتر بودن از سمت داکر رجیستری نتوانستیم راه حلی برای آن پیاده سازی کنیم.امیدوارم لذت برده باشید.</description>
                <category>عرفان نصرتی</category>
                <author>عرفان نصرتی</author>
                <pubDate>Fri, 24 Dec 2021 23:35:33 +0330</pubDate>
            </item>
            </channel>
</rss>