KubernetesでJaegerを使用して分散トレースを実装する方法
著者はCOVID-19救済基金を選択し、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Kubernetes とそれが可能にするマイクロサービスアーキテクチャは、非常に効率的でスケーラブルなシステムを作成できます。 ただし、これらのマイクロサービスの1つでパフォーマンスの問題が発生すると、問題が発生します。 通常、顧客対応サービスからの応答時間がますます長くなっていることに最初に気づきます。 問題は、バックエンドサービスの1つ、または最適な容量を超えているデータベースにある可能性があります。 問題の根本を発見するには、分散トレースを実装する必要があります。
Jaegerは、分散トレースソリューションであり、Cloud NativeComputingFoundationのインキュベーションプロジェクトを卒業しています。 トレースを視覚化するための快適なUI、トレースを収集するための Jaegerサイドカー、およびその他のいくつかのコンポーネントを備えています。 Jaegerのような分散トレースシステムでは、顧客が生成した各イベントのライフサイクルをトレースし、各サービスがそのイベントをどのように処理するかを確認できます。
このチュートリアルでは、非常に小さな分散アプリケーションをKubernetesクラスターにデプロイし、コードのスリープ関数を使用してパフォーマンスラグをシミュレートします。 この問題の根本原因を特定し、各イベントを追跡するには、Jaegerを使用します。 トレースを有効にすると、サービスの動作を観察し、問題を特定するのにどれほど効果的かがわかります。
前提条件
始める前に、次のツールとアカウントが必要になります。
- 接続構成が
kubectl
デフォルトとして設定されているKubernetes1.15+クラスター。 DigitalOceanでKubernetesクラスタを作成するには、Kubernetesクイックスタートをお読みください。 クラスタに接続するには、DigitalOceanKubernetesクラスタに接続する方法をお読みください。 - Dockerがインストールされています。 手順については、Dockerをインストールして使用する方法に関するチュートリアルに従ってください。 DockerのWebサイトには、macOSやWindowsなどの他のオペレーティングシステムのインストール手順が記載されています。
- Dockerイメージを保存するためのDockerHubのアカウント。
kubectl
コマンドラインツールがローカルマシンにインストールされ、クラスターに接続するように構成されています。kubectl
のインストールの詳細については、公式ドキュメントを参照するか、 Kubernetesの使用を開始するためのチュートリアル:kubectl CheatSheetに従ってください。- ローカルマシンにインストールされているcurlコマンドラインユーティリティ。 オペレーティングシステムに組み込まれているパッケージマネージャーを使用して、
curl
をインストールできます。
ステップ1—サンプルアプリケーションの構築
Jaegerのトレース機能をテストするために、フロントエンド用とバックエンド用の2つのサービスを使用するサンプルアプリケーションsammy-jaeger
をビルドしてデプロイします。 PythonとFlaskマイクロフレームワークの両方を使用してビルドします。
私たちのアプリケーションは、フロントエンドを呼び出すたびに値が増加するヒットカウンターになります。 パフォーマンスの問題をシミュレートするために、フロントエンドがGET
リクエストをバックエンドに送信するたびに実行されるランダム化されたスリープ関数をコーディングします。 このステップでは、そのアプリケーションをビルドしてデプロイします。 次の手順では、アプリをKubernetesにデプロイし、Jaegerをインストールしてから、それを使用してサービスの問題を追跡します。
まず、プロジェクトディレクトリ構造を作成し、内部をナビゲートしましょう。
- mkdir -p ./sammy-jaeger/frontend ./sammy-jaeger/backend && cd ./sammy-jaeger
これで、ルートディレクトリsammy-jaeger
と2つのサブディレクトリができました。
output.
├── backend
└── frontend
また、ルートディレクトリ/sammy-jaeger
に変更しました。 ここから残りのすべてのコマンドを実行します。
フロントエンドアプリケーションの構築を始めましょう。
フロントエンドアプリケーションの構築
お好みのテキストエディタを使用して、./frontend
にfrontend.py
という名前の新しいファイルを作成して開きます。
nano ./frontend/frontend.py
次のコードを追加します。 これにより、Flaskがインポートされ、カウンター関数が作成され、HTTPリクエストのルートが1つ定義されます。
import os
import requests
from flask import Flask
app = Flask(__name__)
def get_counter(counter_endpoint):
counter_response = requests.get(counter_endpoint)
return counter_response.text
def increase_counter(counter_endpoint):
counter_response = requests.post(counter_endpoint)
return counter_response.text
@app.route('/')
def hello_world():
counter_service = os.environ.get('COUNTER_ENDPOINT', default="https://localhost:5000")
counter_endpoint = f'{counter_service}/api/counter'
counter = get_counter(counter_endpoint)
increase_counter(counter_endpoint)
return f"""Hello, World!
You're visitor number {counter} in here!\n\n"""
3つのモジュールをインポートしています。 osモジュールはオペレーティングシステムと通信します。 requests モジュールは、HTTPリクエストを送信するためのライブラリです。 Flask は、アプリをホストするマイクロフレームワークです。
次に、get_counter()
関数とincrease_counter()
関数を定義します。これらの関数は、どちらもパラメーターcounter_endpoint
を受け入れます。 get_counter()
は、GET
メソッドを使用してバックエンドを呼び出し、現在のカウンター状態を見つけます。 increase_counter()
は、POST
メソッドを使用してバックエンドを呼び出し、カウンターをインクリメントします。
次に、ルート/
を定義します。これにより、hello_world()
という別の関数が呼び出されます。 この関数は、バックエンドポッドのURLとポートを取得し、それを変数に割り当ててから、その変数を最初の2つの関数get_counter()
とincrease_counter()
に渡します。バックエンドへのX192X]