Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери

На наше прохання Хабр створив хаб Кубернетес і нам приємно розмістити першу публікацію у ньому. Підписуйтесь!

Kubernetes – це просто. Чому ж банки платять мені за роботу у цій сфері великі гроші, тоді як будь-хто може освоїти цю технологію буквально за кілька годин?

Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери

Якщо ви сумніваєтеся, що Kubernetes можна вивчити так швидко — пропоную вам спробувати зробити це самим. А саме, освоївши цей матеріал, ви зможете запустити програму, засновану на мікросервісах, в кластері Kubernetes. Я можу це гарантувати, оскільки саме за такою методикою, яка тут використана, я навчаю роботі з Kubernetes наших клієнтів. Що відрізняє цей посібник від інших? Насправді багато всього. Так, більшість подібних матеріалів починається з пояснення простих речей – концепцій Kubernetes та особливостей команди Kubectl. Автори цих матеріалів вважають, що їх читач знайомий з розробкою додатків, з мікросервісами та контейнерами Docker. Ми ж підемо іншим шляхом. Спочатку розповімо про те, як запустити на комп'ютері програму, засновану на мікросервісах. Далі розглянемо складання образів контейнерів для кожного мікросервісу. А вже після цього познайомимося з Kubernetes і розберемо розгортання програми, заснованої на мікросервісах, кластері, керованому Kubernetes.

Такий підхід з поступовим наближенням до Kubernetes дасть глибину розуміння того, що відбувається, необхідну звичайній людині для того, щоб зрозуміти те, як просто все влаштовано в Kubernetes. Kubernetes - це, безумовно, проста технологія, за умови, що тому, хто хоче її освоїти, відомо, де і як вона використовується.

Тепер, без зайвих слів, приступимо до роботи та поговоримо про додаток, з яким ми працюватимемо.

Експериментальний додаток

Наш додаток буде виконувати лише одну функцію. Воно приймає, як вхідні дані, одну пропозицію, після чого, використовуючи засоби аналізу текстів, здійснює аналіз тональності (sentiment analysis) цієї пропозиції, отримуючи оцінку емоційного ставлення автора пропозиції до якогось об'єкта.

Ось як виглядає головне вікно цієї програми.

Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери
Веб-додаток для аналізу тональності текстів

З технічної точки зору програма складається з трьох мікросервісів, кожен з яких вирішує певний набір завдань:

  • SA-Frontend – веб-сервер Nginx, який обслуговує статичні файли React.
  • SA-WebApp - веб-додаток, написаний на Java, який обробляє запити від фронтенду.
  • SA-Logic — програма Python, яка виконує аналіз тональності тексту.

Мікросервіси існують не в ізоляції. Вони реалізують ідею «поділу обов'язків», але їм, у своїй, необхідно взаємодіяти друг з одним.

Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери
Потоки даних у додатку

На наведеній вище схемі можна бачити пронумеровані етапи роботи системи, що ілюструють потоки даних у додатку. Розберемо їх:

  1. Браузер запитує у сервера файл index.html (який, своєю чергою, робить завантаження пакета React-программы).
  2. Користувач взаємодіє з додатком, це викликає звернення до веб-застосунку, заснованому на Spring.
  3. Веб-програма перенаправляє запит на виконання аналізу тексту Python-додатку.
  4. Python-додаток проводить аналіз тональності тексту та повертає результат у вигляді відповіді на запит.
  5. Spring-програма відправляє відповідь React-програмі (а вона, у свою чергу, показує результат аналізу тексту користувачеві).

Код для всіх цих програм можна знайти тут. Рекомендую вам прямо зараз скопіювати собі цей репозиторій, оскільки попереду на нас чекає багато цікавих експериментів з ним.

Запуск програми, що базується на мікросервісах, на локальному комп'ютері

Для того, щоб програма запрацювала, нам потрібно запустити всі три мікросервіси. Почнемо з найсимпатичнішого з них — із фронтенд-додатку.

▍Налаштування React для локальної розробки

Для того, щоб запустити React-додаток, вам потрібно встановити на своєму комп'ютері платформу Node.js та NPM. Після того, як ви все це встановите, перейдіть, використовуючи термінал, до папки проекту sa-frontend та виконайте наступну команду:

npm install

Завдяки виконанню цієї команди до папки node_modules будуть завантажені залежності програми React, записи про які є у файлі package.json. Після завершення завантаження залежностей у тій же папці виконайте таку команду:

npm start

От і все. Тепер React-програма запущена, доступ до неї можна отримати, перейшовши в браузері за адресою localhost:3000. Можете щось змінити в його коді. Ефект від цих змін ви побачите в браузері. Це можливо завдяки так званій гарячій заміні модулів. Завдяки цьому фронтенд-розробка перетворюється на просте та приємне заняття.

▍Підготовка 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 - Нічого не трапиться. Але якщо заглянути в консоль, там можна побачити повідомлення про помилки. Щоб зрозуміти, де саме відбуваються ці помилки, розберемо код програми.

▍Аналіз коду фронтенд-додатку

Поглянувши на код файлу 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. URL, за яким виконується запит 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. Тут буде знаходитись Java-додаток, упакований у jar-файл, представлений файлом sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍Запуск Java-додатки

Перейдіть до папки 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. Проаналізуємо код, де відбувається помилка.

▍Аналіз коду Java-програми

Ось фрагмент коду, де відбувається помилка.

@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. У SentimentController є поле 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

Значення цієї властивості повинно вказувати на адресу нашої програми Python.

Настроюючи його, ми повідомляємо веб-додатку Spring про те, куди йому потрібно звертатися для виконання запитів на аналіз тексту.

Для того, щоб не ускладнювати собі життя, вирішимо, що Python-додаток буде доступний за адресою localhost:5000 і намагатимемося про це не забути. В результаті команда для запуску Spring-програми буде виглядати так:

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

Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери
У нашій системі не вистачає Python-додатки

Тепер нам залишилося лише запустити Python-додаток та система запрацює так, як очікується.

▍Налаштування програми Python

Для того, щоб запустити Python-додаток, ви повинні бути встановлені Python 3 і Pip, і потрібно, щоб були правильно налаштовані відповідні змінні середовища.

▍Встановлення залежностей

Перейдіть до папки проекту 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/

▍Дослідження коду

Розглянемо код Python-додатки для того, щоб зрозуміти те, як він реагує на запити:

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.

Контейнери Docker

Кубернетес — це система для автоматизації розгортання, масштабування та управління контейнеризованими програмами. Її ще називають "оркестратором контейнерів" (container orchestrator). Якщо Kubernetes працює з контейнерами, то нам, перш ніж цією системою користуватися, потрібно спочатку цими контейнерами придбати. Але спочатку поговоримо про те, що таке контейнери. Мабуть, найкращу відповідь на питання про те, що це таке, можна знайти у документації до Docker:

Образ контейнера - це легковагий, автономний, виконуваний пакет, що містить якийсь додаток, який включає все необхідне для його запуску: код програми, середовище виконання, системні засоби та бібліотеки, налаштування. Контейнеризованими програмами можна користуватися серед Linux і Windows, при цьому вони завжди будуть працювати однаково незалежно від інфраструктури.

Це означає, що контейнери можна запускати на будь-яких комп'ютерах, у тому числі, на продакшн-серверах, і в будь-якому середовищі ув'язнені в них програми працюватимуть однаково.

Для того, щоб дослідити особливості контейнерів та зіставити їх з іншими способами запуску додатків, розглянемо приклад обслуговування React-додатка з використанням віртуальної машини та контейнера.

▍Обслуговування статичних файлів React-додатки засобами віртуальної машини

Намагаючись організувати обслуговування статичних файлів засобами віртуальних машин, ми зіткнемося з такими недоліками:

  1. Неефективне використання ресурсів, оскільки кожна віртуальна машина є повноцінною операційною системою.
  2. Залежність від платформи. Те, що працює на якомусь локальному комп'ютері, цілком може не заробити на продакшн-сервері.
  3. Повільне та вимогливе до ресурсів масштабування рішення, що базується на віртуальних машинах.

Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери
Веб-сервер Nginx, який обслуговує статичні файли, запущений на віртуальній машині

Якщо ж для вирішення аналогічного завдання застосувати контейнери, то, порівняно з віртуальними машинами, можна буде відзначити такі сильні сторони:

  1. Ефективне використання ресурсів: робота з операційною системою за допомогою Docker.
  2. Незалежність від платформи. Контейнер, який розробник зможе запустити на своєму комп'ютері, працюватиме будь-де.
  3. Легкове розгортання рахунок використання шарів образів.

Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери
Веб-сервер Nginx, який обслуговує статичні файли, запущений у контейнері

Ми зіставили віртуальні машини та контейнери лише по кількох пунктах, але навіть цього достатньо для того, щоб відчути сильні сторони контейнерів. Тут Докладніше про контейнери Docker.

▍Складання образу контейнера для React-програми

Основним будівельним блоком контейнера Docker є файл 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. встановити Docker.
  2. Зареєструватись на сайті Docker Hub.
  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, адреса якої буде виглядати як <docker-machine ip>:80. Для того, щоб з'ясувати IP-адресу віртуальної машини Docker, можна скористатися командою docker-machine ip.

На даному етапі, після успішного запуску контейнера фронтенд-програми, у вас має бути можливість відкрити його сторінку у браузері.

▍Файл .dockerignore

Збираючи образ програми SA-FrontendМи могли помітити, що цей процес виявляється вкрай повільним. Відбувається так через те, що демону 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. Тепер складання образу займатиме лічені секунди.

Займемося тепер для Java-додатка.

▍Складання образу контейнера для Java-додатка

Знаєте що, а ви вже вивчили все необхідне для створення образів контейнерів. Саме тому цей розділ буде дуже коротким.

Відкрийте файл 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.

▍Складання образу контейнера для програми Python

Якщо ви подивитеся на вміст файлу 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. Крім того, нам потрібно налаштувати порт, на якому Python-додаток буде чекати на запити від Java-додатка, перепризначивши змінну оточення 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, зверніться до файлу README.

Запустимо контейнер програми sa-frontend:

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

Тепер все готове до того, щоб перейти до браузера за адресою localhost:80 та випробувати додаток.

Якщо ви змінювали порт для sa-webapp, або якщо ви працюєте з віртуальною машиною Docker, вам знадобиться відредагувати файл App.js з папки sa-frontend, змінивши IP-адресу або номер порту в методі analyzeSentence(), підставивши замість застарілих даних актуальну інформацію. Після цього потрібно знову зібрати образ та скористатися ним.

Ось як виглядає схема нашої програми тепер.

Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери
Мікросервіси виконуються у контейнерах

Підсумки: навіщо кластер Kubernetes?

Щойно ми вивчили файли Dockerfile, поговорили про те, як збирати образи та відправляти їх до репозиторію Docker. Крім того, ми навчилися прискорювати збирання образів, користуючись файлом .dockerignore. У результаті наші мікросервіси виконуються в контейнерах Docker. Тут у вас може виникнути цілком виправдане питання, навіщо нам Kubernetes. Відповіді на це питання буде присвячена друга частина цього матеріалу. А поки що подумайте над наступним питанням:
Припустимо, що наш веб-додаток для аналізу текстів став всесвітньо популярним. Щохвилини до нього приходять мільйони запитів. Це означає, що мікросервіси sa-webapp и sa-logic будуть під величезним навантаженням. Як масштабувати контейнери, де виконуються мікросервіси?

Посібник з Kubernetes, частина 1: додатки, мікросервіси та контейнери

Джерело: habr.com

Додати коментар або відгук