آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها

به درخواست ما، هابر یک هاب ایجاد کرد کوبرنیتس و ما خرسندیم که اولین نشریه را در آن قرار دهیم. اشتراک در!

Kubernetes آسان است. چرا بانک ها برای کار در این زمینه به من پول زیادی می پردازند، در حالی که هر کسی می تواند تنها در چند ساعت به این فناوری تسلط یابد؟

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها

اگر شک دارید که Kubernetes را می توان به این سرعت یاد گرفت، پیشنهاد می کنم خودتان این کار را انجام دهید. یعنی با تسلط بر این مطالب، می‌توانید برنامه‌ای را بر اساس میکروسرویس‌ها در یک خوشه Kubernetes اجرا کنید. من می توانم این را تضمین کنم، زیرا در همان روشی است که من در اینجا از آن استفاده می کنم که به مشتریان خود نحوه کار با Kubernetes را آموزش می دهم. چه چیزی این راهنما را از سایرین متمایز می کند؟ در واقع، خیلی چیزها. بنابراین، بیشتر این مطالب با توضیح چیزهای ساده شروع می شوند - مفاهیم Kubernetes و ویژگی های دستور kubectl. نویسندگان این مقالات تصور می کنند که خواننده آنها با توسعه برنامه های کاربردی، میکروسرویس ها و ظروف Docker آشنا هستند. از راه دیگر می رویم. ابتدا اجازه دهید در مورد نحوه اجرای یک برنامه کاربردی بر اساس میکروسرویس ها در رایانه صحبت کنیم. سپس به ساخت تصاویر کانتینر برای هر میکروسرویس نگاه خواهیم کرد. و پس از آن، با Kubernetes آشنا می شویم و استقرار یک برنامه مبتنی بر میکروسرویس ها را در یک خوشه مدیریت شده توسط Kubernetes تجزیه و تحلیل می کنیم.

این رویکرد، با رویکرد تدریجی به Kubernetes، عمق درک آنچه را که اتفاق می‌افتد را می‌دهد که یک فرد معمولی برای درک اینکه چگونه همه چیز در Kubernetes به سادگی چیده شده است، به آن نیاز دارد. Kubernetes مطمئناً یک فناوری ساده است، به شرطی که هر کسی که می‌خواهد بر آن مسلط شود، بداند کجا و چگونه از آن استفاده می‌کند.

اکنون، بدون بحث بیشتر، بیایید دست به کار شویم و در مورد برنامه ای که با آن کار خواهیم کرد صحبت کنیم.

برنامه آزمایشی

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

پنجره اصلی این اپلیکیشن به این شکل است.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
نرم افزار وب تحلیل احساسات

از نقطه نظر فنی، برنامه از سه میکروسرویس تشکیل شده است که هر کدام مجموعه خاصی از وظایف را حل می کند:

  • SA-Frontend یک وب سرور Nginx است که فایل های استاتیک React را ارائه می دهد.
  • SA-WebApp یک برنامه وب است که به زبان جاوا نوشته شده است و درخواست‌های فرانت‌اند را مدیریت می‌کند.
  • SA-Logic یک برنامه پایتون است که تجزیه و تحلیل احساسات متن را انجام می دهد.

توجه به این نکته مهم است که میکروسرویس ها به صورت مجزا وجود ندارند. آنها ایده "تفکیک وظایف" را اجرا می کنند، اما در عین حال نیاز به تعامل با یکدیگر دارند.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
جریان داده در برنامه

در نمودار بالا، می توانید مراحل شماره گذاری شده سیستم را مشاهده کنید که جریان داده ها را در برنامه نشان می دهد. بیایید آنها را تجزیه کنیم:

  1. مرورگر فایلی را از سرور درخواست می کند index.html (که به نوبه خود بسته برنامه React را بارگیری می کند).
  2. کاربر با برنامه تعامل می کند، این باعث می شود که یک برنامه تحت وب بر اساس Spring تماس بگیرد.
  3. برنامه وب درخواست تجزیه متن را به برنامه پایتون ارسال می کند.
  4. برنامه پایتون احساسات متن را تجزیه و تحلیل می کند و نتیجه را به عنوان پاسخ به درخواست برمی گرداند.
  5. برنامه Spring پاسخی را به برنامه React ارسال می کند (که به نوبه خود نتیجه متن تجزیه شده را به کاربر نشان می دهد).

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

اجرای یک برنامه مبتنی بر میکروسرویس در ماشین محلی

برای اینکه اپلیکیشن کار کند، باید هر سه میکروسرویس را راه اندازی کنیم. بیایید با زیباترین آنها شروع کنیم - برنامه front-end.

▍تنظیم React برای توسعه محلی

برای اجرای یک برنامه React، باید فریم ورک Node.js و NPM را روی رایانه خود نصب کنید. پس از نصب همه اینها، با استفاده از ترمینال به پوشه پروژه بروید sa-frontend و دستور زیر را اجرا کنید:

npm install

با اجرای این دستور در پوشه node_modules وابستگی های برنامه React که سوابق آن در فایل موجود است بارگذاری می شود package.json. پس از دانلود وابستگی ها در همان پوشه، دستور زیر را اجرا کنید:

npm start

همین. برنامه React اکنون در حال اجرا است و با رفتن به آدرس مرورگر می توان به آن دسترسی داشت localhost:3000. شما می توانید چیزی را در کد او تغییر دهید. بلافاصله تاثیر این تغییرات را در مرورگر خواهید دید. این به لطف جایگزینی به اصطلاح "گرم" ماژول ها امکان پذیر است. به لطف این، توسعه front-end به یک تجربه ساده و لذت بخش تبدیل می شود.

▍آماده سازی اپلیکیشن React برای تولید

برای اهداف واقعی استفاده از یک برنامه React، باید آن را به مجموعه ای از فایل های ثابت تبدیل کرده و با استفاده از یک وب سرور به مشتریان ارائه کنیم.

برای ساخت برنامه React، دوباره با استفاده از ترمینال، به پوشه بروید sa-frontend و دستور زیر را اجرا کنید:

npm run build

با این کار یک دایرکتوری در پوشه پروژه ایجاد می شود build. این شامل تمام فایل های ثابت مورد نیاز برای کارکرد برنامه React می باشد.

▍ارائه فایل های استاتیک با Nginx

ابتدا باید وب سرور Nginx را نصب و اجرا کنید. اینجا می توانید آن را دانلود کنید و دستورالعمل نصب و اجرای آن را بیابید. سپس باید محتویات پوشه را کپی کنید sa-frontend/build به پوشه [your_nginx_installation_dir]/html.

با این رویکرد، فایل در هنگام مونتاژ برنامه React تولید می شود index.html در دسترس خواهد بود [your_nginx_installation_dir]/html/index.html. این فایلی است که به طور پیش فرض سرور Nginx هنگام دسترسی به آن مشکل ایجاد می کند. سرور برای گوش دادن در یک پورت پیکربندی شده است 80، اما می توانید با ویرایش فایل آن را به روشی که می خواهید سفارشی کنید [your_nginx_installation_dir]/conf/nginx.conf.

حالا مرورگر خود را باز کنید و به localhost:80. صفحه برنامه React را خواهید دید.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
برنامه React که توسط سرور Nginx ارائه می شود

اگر اکنون چیزی را در فیلد وارد کنید Type your sentence و دکمه را فشار دهید Send - هیچ اتفاقی نخواهد افتاد. اما، اگر به کنسول نگاه کنید، می توانید پیام های خطا را در آنجا ببینید. به منظور درک دقیق محل وقوع این خطاها، اجازه دهید کد برنامه را تجزیه و تحلیل کنیم.

▍تجزیه و تحلیل کد برنامه front-end

نگاه کردن به کد فایل App.js، با کلیک بر روی دکمه می توانیم متوجه شویم Send یک روش فراخوانی می کند analyzeSentence(). کد این روش در زیر نشان داده شده است. در عین حال به این نکته توجه کنید که برای هر خطی که به آن یک نظر فرم وجود دارد # Номер، در زیر کد توضیح داده شده است. به همین ترتیب، سایر قطعات کد را تجزیه خواهیم کرد.

analyzeSentence() {
    fetch('http://localhost:8080/sentiment', {  // #1
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
                       sentence: this.textField.getValue()})// #2
    })
        .then(response => response.json())
        .then(data => this.setState(data));  // #3
}

1. آدرس اینترنتی که درخواست POST به آن ارسال می شود. فرض می شود که این آدرس یک برنامه کاربردی است که منتظر چنین درخواست هایی است.

2.بدن درخواست ارسال شده به برنامه. در اینجا یک نمونه بدن درخواست آمده است:

{
    sentence: "I like yogobella!"
}

3.هنگامی که پاسخ به یک درخواست دریافت می شود، وضعیت جزء به روز می شود. این باعث می شود کامپوننت دوباره رندر شود. اگر داده‌ای دریافت کنیم (یعنی یک شی JSON حاوی داده‌های وارد شده و امتیاز متن محاسبه‌شده)، مولفه را خروجی می‌کنیم. Polarityتا زمانی که شرایط فراهم باشد. در اینجا نحوه توصیف مؤلفه است:

const polarityComponent = this.state.polarity !== undefined ?
    <Polarity sentence={this.state.sentence} 
              polarity={this.state.polarity}/> :
    null;

به نظر می رسد که کد بسیار خوب کار می کند. به هر حال اینجا چه اشکالی دارد؟ اگر فرض کنید که در آدرسی که برنامه در حال تلاش برای ارسال درخواست POST به آن است، هنوز چیزی وجود ندارد که بتواند این درخواست را بپذیرد و پردازش کند، کاملاً حق با شماست. یعنی برای پردازش درخواست هایی که به آدرس می آیند http://localhost:8080/sentiment، باید یک برنامه تحت وب بر اساس Spring اجرا کنیم.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
ما به یک برنامه Spring نیاز داریم که بتواند درخواست POST را بپذیرد

▍راه اندازی وب اپلیکیشن بر اساس Spring

به منظور استقرار یک برنامه Spring، به JDK8 و Maven و متغیرهای محیطی به درستی پیکربندی شده نیاز دارید. پس از نصب همه اینها، می توانید به کار روی پروژه ما ادامه دهید.

▍ بسته بندی برنامه در یک فایل jar

با استفاده از ترمینال به پوشه بروید sa-webapp و دستور زیر را وارد کنید:

mvn install

پس از اجرای این دستور در پوشه sa-webapp دایرکتوری ایجاد خواهد شد target. این جایی است که برنامه جاوا قرار خواهد گرفت، بسته بندی شده در یک فایل jar، که توسط فایل نمایش داده می شود sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍راه اندازی یک برنامه جاوا

به پوشه بروید target و با دستور زیر برنامه را اجرا کنید:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar

هنگام اجرای این دستور خطایی رخ خواهد داد. برای شروع رفع آن، می‌توانیم جزئیات استثنا را در داده‌های ردیابی پشته تجزیه کنیم:

Error creating bean with name 'sentimentController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sa.logic.api.url' in value "${sa.logic.api.url}"

برای ما در اینجا مهم ترین چیز ذکر عدم امکان روشن شدن معناست sa.logic.api.url. بیایید کدی را که در آن خطا رخ می دهد تجزیه و تحلیل کنیم.

▍تحلیل کد برنامه جاوا

در اینجا قطعه کدی است که در آن خطا رخ می دهد.

@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
    @Value("${sa.logic.api.url}")    // #1
    private String saLogicApiUrl;
    @PostMapping("/sentiment")
    public SentimentDto sentimentAnalysis(
        @RequestBody SentenceDto sentenceDto) 
    {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.postForEntity(
                saLogicApiUrl + "/analyse/sentiment",    // #2
                sentenceDto, SentimentDto.class)
                .getBody();
    }
}

  1. در اسentimentController یک میدان وجود دارد saLogicApiUrl. مقدار آن توسط ویژگی تعیین می شود sa.logic.api.url.
  2. خط saLogicApiUrl با ارزش به هم می پیوندد /analyse/sentiment. آنها با هم آدرسی را برای برقراری تماس با میکروسرویسی که تجزیه و تحلیل متن را انجام می دهد، تشکیل می دهند.

▍تنظیم مقدار خاصیت

در Spring منبع پیش فرض مقادیر ویژگی یک فایل است application.properties، که در آن یافت می شود sa-webapp/src/main/resources. اما استفاده از آن تنها راه برای تنظیم مقادیر ویژگی نیست. با دستور زیر نیز می توانید این کار را انجام دهید:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URL

مقدار این ویژگی باید به آدرس برنامه پایتون ما اشاره کند.

با پیکربندی آن، به برنامه وب Spring می گوییم که برای ایجاد درخواست های تجزیه متن باید به کجا برود.

برای اینکه زندگی ما پیچیده نشود، تصمیم می گیریم که برنامه پایتون در دسترس باشد localhost:5000 و سعی کنید آن را فراموش نکنید. در نتیجه دستور شروع برنامه Spring به شکل زیر خواهد بود:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
سیستم ما فاقد یک برنامه پایتون است

اکنون فقط باید برنامه پایتون را اجرا کنیم و سیستم مطابق انتظار کار خواهد کرد.

▍ راه اندازی یک برنامه پایتون

برای اجرای برنامه پایتون، باید پایتون 3 و پیپ را نصب کرده باشید و متغیرهای محیطی مناسب را به درستی تنظیم کنید.

▍وابستگی ها را نصب کنید

به پوشه پروژه بروید sa-logic/sa و دستورات زیر را اجرا کنید:

python -m pip install -r requirements.txt
python -m textblob.download_corpora

▍راه اندازی اپلیکیشن

با نصب وابستگی ها، ما آماده اجرای برنامه هستیم:

python sentiment_analysis.py

پس از اجرای این دستور موارد زیر به ما گفته می شود:

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

این بدان معنی است که برنامه در حال اجرا است و منتظر درخواست ها در localhost:5000/

▍تحقیق کد

بیایید به کد برنامه پایتون نگاه کنیم تا بفهمیم چگونه به درخواست ها پاسخ می دهد:

from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__)                                   #1
@app.route("/analyse/sentiment", methods=['POST'])      #2
def analyse_sentiment():
    sentence = request.get_json()['sentence']           #3
    polarity = TextBlob(sentence).sentences[0].polarity #4
    return jsonify(                                     #5
        sentence=sentence,
        polarity=polarity
    )
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)                #6

  1. مقداردهی اولیه شی Flask.
  2. تعیین آدرس برای درخواست POST به آن.
  3. بازیابی یک ملک sentence از بدن درخواست
  4. مقداردهی اولیه شی ناشناس TextBlob و گرفتن ارزش polarity برای اولین پیشنهاد دریافت شده در بدنه درخواست (در مورد ما، این تنها پیشنهاد ارائه شده برای تجزیه و تحلیل است).
  5. بازگرداندن پاسخی که متن آن شامل متن پیشنهاد و شاخص محاسبه شده برای آن است polarity.
  6. راه اندازی برنامه Flask، که در دسترس خواهد بود 0.0.0.0:5000 (همچنین می توانید با استفاده از ساختار فرم به آن دسترسی داشته باشید localhost:5000).

اکنون میکروسرویس هایی که برنامه را تشکیل می دهند در حال اجرا هستند. آنها قرار است با یکدیگر تعامل داشته باشند. در اینجا نمودار برنامه در این مرحله از کار به نظر می رسد.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
همه میکروسرویس هایی که برنامه را تشکیل می دهند به حالت سالم می رسند

اکنون، قبل از ادامه، برنامه React را در یک مرورگر باز کنید و سعی کنید جمله ای را با آن تجزیه کنید. اگر همه چیز به درستی انجام شود - پس از فشار دادن دکمه Send نتایج تجزیه و تحلیل را در زیر کادر متنی مشاهده خواهید کرد.

در بخش بعدی، در مورد نحوه اجرای میکروسرویس های خود در کانتینرهای Docker صحبت خواهیم کرد. این برای آماده سازی برنامه برای اجرا در خوشه Kubernetes ضروری است.

کانتینرهای داکر

کوبرنیتس سیستمی برای خودکارسازی استقرار، مقیاس بندی و مدیریت برنامه های کاربردی کانتینری است. به آن "ارکستراتور کانتینری" نیز می گویند. اگر Kubernetes با کانتینرها کار می کند، قبل از استفاده از این سیستم، ابتدا باید این کانتینرها را تهیه کنیم. اما ابتدا اجازه دهید در مورد اینکه ظروف چیست صحبت کنیم. شاید بهترین پاسخ برای این سوال که آن چیست را بتوان در آن یافت مستندات به داکر:

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

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

برای بررسی ویژگی‌های کانتینرها و مقایسه آن‌ها با روش‌های دیگر اجرای برنامه‌ها، بیایید به مثال ارائه یک برنامه React با استفاده از ماشین مجازی و کانتینر نگاهی بیندازیم.

▍ارائه فایل های ثابت برنامه React با استفاده از ماشین مجازی

در تلاش برای سازماندهی نگهداری فایل های استاتیک با استفاده از ماشین های مجازی، با معایب زیر مواجه خواهیم شد:

  1. استفاده ناکارآمد از منابع، زیرا هر ماشین مجازی یک سیستم عامل کامل است.
  2. وابستگی به پلتفرم آنچه روی برخی از رایانه های محلی کار می کند ممکن است روی سرور تولیدی کار نکند.
  3. مقیاس بندی آهسته و فشرده منابع یک راه حل ماشین مجازی.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
وب سرور Nginx که فایل های ثابتی را که در یک ماشین مجازی اجرا می شوند، ارائه می دهد

اگر از کانتینرها برای حل یک مشکل مشابه استفاده شود، در مقایسه با ماشین های مجازی، می توان به نقاط قوت زیر اشاره کرد:

  1. استفاده کارآمد از منابع: کار با سیستم عامل با استفاده از Docker.
  2. استقلال سکو. محفظه‌ای که یک توسعه‌دهنده می‌تواند روی رایانه خود اجرا کند، در هر جایی اجرا می‌شود.
  3. استقرار سبک وزن از طریق استفاده از لایه های تصویر.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
وب سرور Nginx که فایل های ثابتی را که در یک کانتینر اجرا می شوند ارائه می دهد

ما فقط ماشین‌های مجازی و کانتینرها را در چند نکته با هم مقایسه کرده‌ایم، اما همین هم برای درک نقاط قوت کانتینرها کافی است. اینجا می توانید جزئیات مربوط به کانتینرهای Docker را بیابید.

▍ ساخت یک تصویر ظرف برای یک برنامه React

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

قبل از شروع کار با فایل Dockerfile، به یاد داشته باشید که برای آماده سازی فایل های برنامه React برای آپلود در سرور Nginx چه کاری انجام دادیم:

  1. ساخت بسته برنامه React (npm run build).
  2. راه اندازی سرور Nginx
  3. کپی کردن محتویات یک دایرکتوری build از پوشه پروژه sa-frontend به پوشه سرور nginx/html.

در زیر می توانید تشابهات بین ایجاد یک کانتینر و مراحل فوق را که در رایانه محلی انجام شده است مشاهده کنید.

▍تهیه یک Dockerfile برای برنامه SA-Frontend

دستورالعمل هایی که باید در آن گنجانده شود Dockerfile برای استفاده SA-Frontend، فقط از دو دستور تشکیل شده است. واقعیت این است که تیم توسعه Nginx یک پایه اولیه را آماده کرده است تصویر برای Nginx، که ما از آن برای ساخت تصویر خود استفاده خواهیم کرد. در اینجا دو مرحله وجود دارد که باید توضیح دهیم:

  1. شما باید تصویر Nginx را اساس تصویر قرار دهید.
  2. محتوای پوشه sa-frontend/build باید در پوشه تصویر کپی کنید nginx/html.

اگر از این توضیحات به فایل برویم Dockerfile، سپس به شکل زیر خواهد بود:

FROM nginx
COPY build /usr/share/nginx/html

همانطور که می بینید، همه چیز در اینجا بسیار ساده است، در حالی که محتویات فایل حتی کاملاً خوانا و قابل درک است. این فایل به سیستم می گوید که تصویر را بگیرد nginx با همه چیزهایی که از قبل دارد، و محتویات دایرکتوری را کپی کنید build به دایرکتوری nginx/html.

در اینجا ممکن است در مورد اینکه چگونه می دانم دقیقا کجا فایل ها را از پوشه کپی کنم، سوالی برای شما پیش آمده است build، یعنی مسیر از کجا آمده است /usr/share/nginx/html. در واقع، در اینجا نیز هیچ چیز پیچیده ای وجود ندارد. واقعیت این است که اطلاعات مربوطه را می توان در شرح تصویر

▍مونتاژ تصویر و آپلود آن در مخزن

قبل از اینکه بتوانیم با یک تصویر تکمیل شده کار کنیم، باید آن را به مخزن تصویر ارسال کنیم. برای انجام این کار، از پلت فرم رایگان میزبانی تصویر مبتنی بر ابر Docker Hub استفاده خواهیم کرد. در این مرحله از کار، باید موارد زیر را انجام دهید:

  1. نصب کنید کارگر بارانداز.
  2. در سایت داکر هاب ثبت نام کنید.
  3. با اجرای دستور زیر در ترمینال وارد حساب کاربری خود شوید:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

اکنون باید با استفاده از ترمینال به دایرکتوری بروید sa-frontend و دستور زیر را در آنجا اجرا کنید:

docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .

در اینجا و زیر در دستورات مشابه $DOCKER_USER_ID باید با نام کاربری شما در Docker Hub جایگزین شود. به عنوان مثال، این بخش از دستور ممکن است به شکل زیر باشد: rinormaloku/sentiment-analysis-frontend.

در این صورت می توان این دستور را با حذف از آن کوتاه کرد -f Dockerfile، از آنجایی که پوشه ای که در آن این دستور را اجرا می کنیم قبلاً این فایل را دارد.

برای ارسال تصویر تمام شده به مخزن، به دستور زیر نیاز داریم:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

پس از تکمیل آن، لیست مخازن خود را در Docker Hub بررسی کنید تا ببینید آیا تصویر با موفقیت به فضای ذخیره سازی ابری منتقل شده است یا خیر.

▍راه اندازی ظرف

اکنون هر کسی می تواند تصویری را که به نام شناخته می شود دانلود و اجرا کند $DOCKER_USER_ID/sentiment-analysis-frontend. برای انجام این کار، باید دستورات زیر را اجرا کنید:

docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

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

  • شماره اول 80 شماره پورت میزبان (یعنی رایانه محلی) است.
  • شماره دوم 80 پورت کانتینری است که درخواست باید به آن هدایت شود.

تصویر زیر را در نظر بگیرید.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
پورت حمل و نقل

سیستم درخواست ها را از پورت ارسال می کند <hostPort> به بندر <containerPort>. یعنی دسترسی به پورت 80 کامپیوتر به یک پورت هدایت می شود 80 ظرف

از آنجا که بندر 80 در رایانه محلی باز می شود، می توانید از این رایانه به برنامه دسترسی داشته باشید localhost:80. اگر سیستم شما از Docker پشتیبانی نمی کند، می توانید برنامه را روی یک ماشین مجازی داکر اجرا کنید که آدرس آن شبیه به <docker-machine ip>:80. برای اطلاع از آدرس IP ماشین مجازی داکر می توانید از دستور استفاده کنید docker-machine ip.

در این مرحله، هنگامی که کانتینر برنامه front-end با موفقیت راه اندازی شد، باید بتوانید صفحه آن را در یک مرورگر باز کنید.

فایل ▍.dockerignore

ساخت تصویر برنامه SA-Frontend، می توانیم متوجه شویم که این روند بسیار کند است. این به این دلیل است که زمینه ساخت تصویر باید به Daemon Docker ارسال شود. دایرکتوری که زمینه ساخت را نشان می دهد به عنوان آخرین آرگومان دستور داده می شود docker build. در مورد ما، یک نقطه در انتهای این دستور وجود دارد. این باعث می شود که ساختار زیر در زمینه اسمبلی گنجانده شود:

sa-frontend:
|   .dockerignore
|   Dockerfile
|   package.json
|   README.md
+---build
+---node_modules
+---public
---src

اما از تمام پوشه های موجود در اینجا، ما فقط به یک پوشه نیاز داریم build. دانلود هر چیز دیگری اتلاف وقت است. می توانید با گفتن به Docker که کدام دایرکتوری ها را نادیده بگیرد سرعت ساخت را افزایش دهید. برای انجام این کار به یک فایل نیاز داریم .dockerignore. شما اگر با فایل آشنایی دارید .gitignore، ساختار این فایل احتمالا آشنا به نظر می رسد. فهرست دایرکتوری هایی را که سیستم ساخت تصویر می تواند نادیده بگیرد را فهرست می کند. در مورد ما، محتویات این فایل به شکل زیر است:

node_modules
src
public

پرونده .dockerignore باید در همان پوشه فایل باشد Dockerfile. اکنون مونتاژ تصویر چند ثانیه طول می کشد.

بیایید اکنون به تصویر یک برنامه جاوا بپردازیم.

▍ساخت یک تصویر ظرف برای یک برنامه جاوا

شما می دانید چه چیزی، و قبلاً همه چیزهایی را که برای ایجاد تصاویر ظرف نیاز دارید، یاد گرفته اید. به همین دلیل این بخش بسیار کوتاه خواهد بود.

فایل را باز کنید Dockerfile، که در پوشه پروژه قرار دارد sa-webapp. اگر متن این فایل را بخوانید، در آن تنها با دو ساختار جدید روبرو خواهید شد که با کلمات کلیدی شروع می شوند ENV и EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000
…
EXPOSE 8080

کلمه کلیدی ENV به شما اجازه می دهد تا متغیرهای محیطی را در داخل کانتینرهای Docker اعلام کنید. به طور خاص، در مورد ما، به شما امکان می دهد یک URL برای دسترسی به API برنامه ای که تجزیه و تحلیل متن را انجام می دهد تنظیم کنید.

کلمه کلیدی EXPOSE به شما امکان می دهد به Docker بگویید که یک پورت را باز کند. ما قصد داریم از این پورت در حین کار با اپلیکیشن استفاده کنیم. در اینجا می توانید آن را در Dockerfile برای استفاده SA-Frontend چنین دستوری وجود ندارد این فقط برای اهداف مستندسازی است، به عبارت دیگر، این ساختار برای خواننده است Dockerfile.

ساختن تصویر و فشار دادن آن به مخزن دقیقاً شبیه مثال قبلی است. اگر هنوز به توانایی های خود اطمینان زیادی ندارید، دستورات مربوطه را می توانید در فایل پیدا کنید README.md در پوشه sa-webapp.

▍ساخت یک تصویر ظرف برای برنامه پایتون

اگر به محتویات فایل نگاهی بیندازید Dockerfile در پوشه sa-logicشما چیز جدیدی در آنجا پیدا نخواهید کرد. دستورات ساخت تصویر و فشار دادن آن به مخزن نیز باید برای شما آشنا باشد، اما، همانطور که در مورد سایر برنامه های ما وجود دارد، آنها را می توانید در فایل پیدا کنید. README.md در پوشه sa-logic.

▍آزمایش کاربردهای کانتینری

آیا می توانید به چیزی که آزمایش نکرده اید اعتماد کنید؟ من هم نمی توانم. بیایید ظروف خود را آزمایش کنیم.

  1. اجازه دهید ظرف برنامه را شروع کنیم sa-logic و آن را برای گوش دادن در یک پورت پیکربندی کنید 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. اجازه دهید ظرف برنامه را شروع کنیم sa-webapp و آن را برای گوش دادن در یک پورت پیکربندی کنید 8080. علاوه بر این، باید پورتی را تنظیم کنیم که برنامه پایتون به درخواست‌های برنامه جاوا با تخصیص مجدد متغیر محیطی گوش دهد. SA_LOGIC_API_URL:
    $ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app

برای اطلاع از نحوه اطلاع از آدرس IP یک کانتینر یا Docker VM به فایل مراجعه کنید README.

اجازه دهید ظرف برنامه را شروع کنیم sa-frontend:

docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

اکنون همه چیز برای پیمایش در مرورگر به آدرس آماده است localhost:80 و اپلیکیشن را تست کنید

لطفا توجه داشته باشید که اگر پورت را برای sa-webapp، یا اگر از Docker VM استفاده می کنید، باید فایل را ویرایش کنید App.js از پوشه sa-frontendبا تغییر آدرس IP یا شماره پورت در روش analyzeSentence()با جایگزینی اطلاعات فعلی به جای داده های منسوخ. پس از آن، باید تصویر را دوباره جمع کنید و از آن استفاده کنید.

این همان چیزی است که نمودار برنامه ما اکنون به نظر می رسد.

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها
میکروسرویس ها در کانتینرها اجرا می شوند

خلاصه: چرا به خوشه Kubernetes نیاز داریم؟

ما فقط فایل ها را بررسی کردیم Dockerfile، در مورد نحوه ساخت تصاویر و فشار دادن آنها به مخزن Docker صحبت کرد. علاوه بر این، ما یاد گرفتیم که چگونه با استفاده از فایل، سرعت مونتاژ تصاویر را افزایش دهیم .dockerignore. در نتیجه، میکروسرویس‌های ما اکنون در کانتینرهای Docker اجرا می‌شوند. در اینجا ممکن است یک سوال کاملا موجه در مورد اینکه چرا ما به Kubernetes نیاز داریم داشته باشید. پاسخ به این سوال به بخش دوم این مطلب اختصاص خواهد یافت. در ضمن به سوال زیر توجه کنید:
بیایید فرض کنیم که برنامه وب تحلیل متن ما در سراسر جهان محبوب شده است. هر دقیقه میلیون ها درخواست به او می رسد. این بدان معناست که میکروسرویس ها sa-webapp и sa-logic تحت استرس شدید قرار خواهد گرفت چگونه ظروف را که میکروسرویس ها را اجرا می کنند، مقیاس بندی کنیم؟

آموزش Kubernetes قسمت 1: برنامه های کاربردی، میکروسرویس ها و کانتینرها

منبع: www.habr.com

اضافه کردن نظر