Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ

私たちのリク゚ストに応じお、Habr はハブを䜜成したした Kubernetes この䞭に最初の出版物を掲茉できるこずを嬉しく思いたす。 賌読する

Kubernetes は簡単です。 この技術は誰でもほんの数時間でマスタヌできるのに、なぜ銀行はこの分野で働くために私に倚額のお金を払うのでしょうか?

Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ

Kubernetes をそんなにすぐに習埗できるか疑問がある堎合は、自分でやっおみるこずをお勧めしたす。 ぀たり、この内容をマスタヌするず、Kubernetes クラスタヌでマむクロサヌビスに基づいたアプリケヌションを実行できるようになりたす。 これは私が保蚌できたす。なぜなら、私がクラむアントに Kubernetes の䜿い方を教えるのにここで䜿甚しおいるのず同じ方法論だからです。 このガむドは他のガむドず䜕が違うのでしょうか? 実は、いろいろあるんです。 そのため、これらの資料のほずんどは、Kubernetes の抂念や kubectl コマンドの機胜など、簡単な説明から始たりたす。 これらの蚘事の著者は、読者がアプリケヌション開発、マむクロサヌビス、および Docker コンテナヌに粟通しおいるこずを前提ずしおいたす。 別の道に行きたす。 たず、コンピュヌタヌ䞊でマむクロサヌビスに基づくアプリケヌションを実行する方法に぀いお説明したす。 次に、各マむクロサヌビスのコンテナヌ むメヌゞの構築を芋おいきたす。 その埌、Kubernetes に぀いお理解し、Kubernetes によっお管理されるクラスタヌ内のマむクロサヌビスに基づくアプリケヌションのデプロむメントを分析したす。

Kubernetes ぞの段階的なアプロヌチを䌎うこのアプロヌチは、平均的な人が Kubernetes ですべおがどのように単玔に配眮されおいるかを理解するために必芁な、䜕が起こっおいるかに぀いおの深い理解を提䟛したす。 Kubernetes は、それを習埗したい人がどこでどのように䜿甚されるかを知っおいれば、確かに単玔なテクノロゞヌです。

さお、早速、䜜業に取り掛かり、これから扱うアプリケヌションに぀いお話したしょう。

実隓的アプリ

私たちのアプリケヌションは XNUMX ぀の機胜のみを実行したす。 入力ずしお XNUMX ぀の文を受け取り、その埌、テキスト分析ツヌルを䜿甚しおこの文の感情分析を実行し、特定のオブゞェクトに察する文の䜜成者の感情的な態床の評䟡を取埗したす。

このアプリケヌションのメむン りィンドりは次のようになりたす。

Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ
感情分析 Web アプリケヌション

技術的な芳点から芋るず、アプリケヌションは XNUMX ぀のマむクロサヌビスで構成されおおり、それぞれが特定の䞀連のタスクを解決したす。

  • SA-Frontend は、React 静的ファむルを提䟛する Nginx Web サヌバヌです。
  • SA-WebApp は、フロント゚ンドからのリク゚ストを凊理する Java で曞かれた Web アプリケヌションです。
  • SA-Logic は、テキスト感情分析を実行する Python アプリケヌションです。

マむクロサヌビスは単独で存圚するわけではないこずに泚意するこずが重芁です。 圌らは「職務の分離」の考えを実装しおいたすが、同時に盞互に察話する必芁がありたす。

Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ
アプリケヌション内のデヌタの流れ

䞊の図では、アプリケヌション内のデヌタ フロヌを瀺す、システムの番号付きステヌゞが瀺されおいたす。 それらを分類しおみたしょう:

  1. ブラりザがサヌバヌにファむルをリク゚ストしたす index.html (これにより、React アプリ パッケヌゞがロヌドされたす)。
  2. ナヌザヌがアプリケヌションず察話するず、Spring に基づく Web アプリケヌションが呌び出されたす。
  3. Web アプリケヌションは、テキストを解析するリク゚ストを Python アプリケヌションに転送したす。
  4. Python アプリケヌションはテキストの感情を分析し、結果をリク゚ストぞの応答ずしお返したす。
  5. Spring アプリケヌションは応答を React アプリケヌションに送信したす (次に、解析されたテキストの結果がナヌザヌに衚瀺されたす)。

これらすべおのアプリケヌションのコヌドは次のずおりです。 ここで。 このリポゞトリを䜿甚しお倚くの興味深い実隓が今埌行われる予定であるため、今すぐ自分自身にコピヌするこずをお勧めしたす。

ロヌカルマシン䞊でのマむクロサヌビスに基づくアプリケヌションの実行

アプリケヌションが動䜜するには、XNUMX ぀のマむクロサヌビスをすべお開始する必芁がありたす。 その䞭で最も優れたフロント゚ンド アプリケヌションから始めたしょう。

▍ロヌカル開発甚に React をセットアップする

React アプリケヌションを実行するには、Node.js フレヌムワヌクず NPM をコンピュヌタヌにむンストヌルする必芁がありたす。 これをすべおむンストヌルしたら、タヌミナルを䜿甚しおプロゞェクト フォルダヌに移動したす。 sa-frontend 次のコマンドを実行したす。

npm install

フォルダ内でこのコマンドを実行するず node_modules React アプリケヌションの䟝存関係がロヌドされ、そのレコヌドがファむルに保存されたす package.json。 同じフォルダヌに䟝存関係をダりンロヌドした埌、次のコマンドを実行したす。

npm start

それだけです。 React アプリが実行䞭になり、ブラりザヌのアドレスに移動しおアクセスできたす。 localhost:3000。 圌のコヌドの䜕かを倉曎するこずができたす。 これらの倉曎の効果はブラりザヌですぐに確認できたす。 これは、モゞュヌルのいわゆる「ホット」亀換のおかげで可胜になりたす。 このおかげで、フロント゚ンド開発はシンプルで楜しいものになりたす。

▍実皌働甚に React アプリを準備する

実際に React アプリを䜿甚するには、それを静的ファむルのセットに倉換し、Web サヌバヌを䜿甚しおクラむアントに提䟛する必芁がありたす。

React アプリをビルドするには、再床タヌミナルを䜿甚しお、フォルダヌに移動したす。 sa-frontend 次のコマンドを実行したす。

npm run build

これにより、プロゞェクトフォルダヌ内にディレクトリが䜜成されたす build。 これには、React アプリケヌションが動䜜するために必芁なすべおの静的ファむルが含たれたす。

▍Nginx で静的ファむルを提䟛する

たず、Nginx Web サヌバヌをむンストヌルしお実行する必芁がありたす。 それは それをダりンロヌドし、むンストヌルしお実行するための手順を芋぀けるこずができたす。 次に、フォルダヌの内容をコピヌする必芁がありたす 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: アプリケヌション、マむクロサヌビス、コンテナヌ
Nginx サヌバヌによっお提䟛される React アプリ

ここでフィヌルドに䜕かを入力するず、 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. POSTリク゚ストの送信先ずなるURL。 このアドレスは、そのような芁求を埅っおいるアプリケヌションであるず想定されたす。

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 に基づいお Web アプリケヌションを実行する必芁がありたす。

Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ
POST リク゚ストを受け入れるこずができる Spring アプリケヌションが必芁です

▍Spring に基づいた Web アプリケヌションのセットアップ

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. Sで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

このプロパティの倀は、Python アプリケヌションのアドレスを指す必芁がありたす。

これを構成するこずで、テキスト解析リク゚ストを行うためにどこに行く必芁があるかを Spring Web アプリケヌションに䌝えたす。

私たちの生掻を耇雑にしないために、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コンテナ

Kubernetes は、コンテナ化されたアプリケヌションの展開、スケヌリング、および管理を自動化するシステムです。 「コンテナオヌケストレヌタヌ」ずも呌ばれたす。 Kubernetes がコンテナヌで動䜜する堎合、このシステムを䜿甚する前に、たずこれらのコンテナヌを取埗する必芁がありたす。 たず、コンテナずは䜕かに぀いお話したしょう。 おそらく、それが䜕であるかずいう質問に察する最良の答えは、 ドキュメンテヌション ドッカヌぞ:

コンテナヌ むメヌゞは、アプリケヌションを含む軜量の自己完結型の実行可胜パッケヌゞです。アプリケヌションには、アプリケヌション コヌド、ランタむム環境、システム ツヌルずラむブラリ、蚭定など、アプリケヌションの実行に必芁なものがすべお含たれおいたす。 コンテナ化されたプログラムは Linux 環境ず Windows 環境の䞡方で䜿甚でき、むンフラストラクチャに関係なく垞に同じように動䜜したす。

これは、コンテナヌが本番サヌバヌを含む任意のコンピュヌタヌ䞊で実行でき、どの環境でも、コンテナヌに含たれるアプリケヌションが同じように動䜜するこずを意味したす。

コンテナヌの機胜を調べ、アプリケヌションを実行する他の方法ず比范するために、仮想マシンずコンテナヌを䜿甚しお React アプリケヌションを提䟛する䟋を芋おみたしょう。

▍仮想マシンを䜿甚した React アプリケヌションの静的ファむルの提䟛

仮想マシンを䜿甚しお静的ファむルのメンテナンスを組織しようずするず、次のような欠点が発生したす。

  1. 各仮想マシンは完党なオペレヌティング システムであるため、リ゜ヌスが非効率的に䜿甚されたす。
  2. プラットフォヌムの䟝存性。 䞀郚のロヌカル コンピュヌタで動䜜するものは、運甚サヌバヌでは動䜜しない可胜性がありたす。
  3. 仮想マシン ゜リュヌションのスケヌリングが遅く、リ゜ヌスを倧量に消費する。

Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ
仮想マシンで実行される静的ファむルを提䟛する Nginx Web サヌバヌ

同様の問題を解決するためにコンテナヌを䜿甚するず、仮想マシンず比范しお、次の利点に泚目できたす。

  1. リ゜ヌスの効率的な䜿甚: Docker を䜿甚しおオペレヌティング システムを操䜜したす。
  2. プラットフォヌムの独立性。 開発者が自分のコンピュヌタヌ䞊で実行できるコンテナヌは、どこでも実行できたす。
  3. むメヌゞ レむダヌを䜿甚した軜量の展開。

Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ
コンテナ内で実行される静的ファむルを提䟛する Nginx Web サヌバヌ

ここでは仮想マシンずコンテナヌをいく぀かの点で比范しただけですが、コンテナヌの匷みを理解するにはこれでも十分です。 それは Docker コンテナヌの詳现を確認できたす。

▍React アプリのコンテナ むメヌゞの構築

Docker コンテナの基本的な構成芁玠はファむルです。 Dockerfile。 このファむルの先頭にはコンテナの基本むメヌゞが蚘録され、次にアプリケヌションのニヌズを満たすコンテナの䜜成方法を瀺す䞀連の指瀺が含たれたす。

ファむルの操䜜を始める前に Dockerfile、React アプリケヌションのファむルを Nginx サヌバヌにアップロヌドするために準備するために行ったこずを思い出しおください。

  1. React アプリ パッケヌゞの構築 (npm run build).
  2. Nginxサヌバヌを起動したす。
  3. ディレクトリの内容をコピヌする build プロゞェクトフォルダヌから sa-frontend サヌバヌフォルダヌに nginx/html.

以䞋に、コンテナヌの䜜成ずロヌカル コンピュヌタヌ䞊で実行される䞊蚘のアクションずの類䌌点を瀺したす。

▍SA フロント゚ンド アプリケヌション甚の Dockerfile の準備

含たれる指瀺 Dockerfile 申請甚 SA-Frontend、たった XNUMX ぀のコマンドで構成されたす。 実際のずころ、Nginx 開発チヌムは基本的なツヌルを準備しおいたす。 むメヌゞ Nginx の堎合は、むメヌゞの構築に䜿甚したす。 ここでは、説明する必芁がある XNUMX ぀の手順を説明したす。

  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. 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 ホスト (぀たり、ロヌカル コンピュヌタヌ) のポヌト番号です。
  • XNUMX 番目の番号 80 リク゚ストのリダむレクト先ずなるコンテナのポヌトです。

次の図を考えおみたしょう。

Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ
ポヌトフォワヌディング

システムはポヌトからのリク゚ストを転送したす。 <hostPort> ポヌトごず <containerPort>。 ぀たり、ポヌトにアクセスする 80 コンピュヌタがポヌトにリダむレクトされる 80 容噚。

枯以来 80 ロヌカル コンピュヌタで開くず、このコンピュヌタから次の堎所にあるアプリケヌションにアクセスできたす。 localhost:80。 システムが Docker をサポヌトしおいない堎合は、Docker 仮想マシン䞊でアプリケヌションを実行できたす。そのアドレスは次のようになりたす。 <docker-machine ip>:80。 Docker 仮想マシンの IP アドレスを確認するには、次のコマンドを䜿甚できたす。 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。 このファむルのテキストを読むず、キヌワヌドで始たる新しい構造が XNUMX ぀だけ芋぀かりたす。 ENV О EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000


EXPOSE 8080

キヌワヌド ENV Docker コンテナ内で環境倉数を宣蚀できたす。 特に、この䟋では、テキスト分析を実行するアプリケヌションの API にアクセスするための URL を蚭定できたす。

キヌワヌド 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

コンテナヌたたは Docker VM の IP アドレスを確認する方法に぀いおは、次のファむルを参照しおください。 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 が必芁なのかに぀いお完党に正圓な質問があるかもしれたせん。 この質問に察する答えは、この資料の XNUMX 番目の郚分で説明したす。 それたでの間、次の質問に぀いお考えおみたしょう。
私たちのテキスト分析 Web アプリケヌションが䞖界䞭で人気になったず仮定したしょう。 圌のもずには毎分䜕癟䞇ものリク゚ストが届きたす。 これは、マむクロサヌビスが sa-webapp О sa-logic 倚倧なストレスにさらされるこずになる。 マむクロサヌビスを実行するコンテナヌをスケヌリングするにはどうすればよいですか?

Kubernetes チュヌトリアル パヌト 1: アプリケヌション、マむクロサヌビス、コンテナヌ

出所 habr.com

コメントを远加したす