Kubernetes でゼロからオブザーバビリティを構築する

Kubernetes でゼロからオブザーバビリティを構築する

この記事では、Grafana、Prometheus、Loki、Tempo、OpenTelemetry を使用して、Kubernetes で可観測性プラットフォームを構築します。操作パネルとして Grafana を使用し、データソースとして Prometheus、Loki、Tempo を使用し、それぞれインジケーター、ログ、追跡データを取得します。また、Exemplars を使用して trace_id を Java メトリックに関連付け、OpenTelemetry を使用してアプリケーションをインストルメント化します。

始める前に、これらのオープンソース ツールについて簡単に紹介しましょう。

  1. OpenTelemetry: エージェントを使用してメトリック、ログ、リンクを収集し、他のツールに送信する CNCF のオープンソース製品です。複数の言語統合をサポートし、優れた計測機能を備えています。
  2. Prometheus: CNCF の卒業製品であり、現在主流の監視ツールの 1 つです。
  3. 例: trace_id とメトリックをリンクできるため、特定のログを取得し、インジケーターを通じてステータスをリンクできます。通常は Prometheus で動作します。
  4. Promtail: ログを Loki に送信するログ収集ツール。
  5. Loki: ログを収集して処理し、PromQLに似た構文のLogQLを介してログのクエリをサポートします。
  6. Tempo: OpenTelemetryデータを受信し、Jaegerを通じて視覚化できる
  7. Grafana: 複数のデータソースをサポートする視覚化パネル

バックエンドアプリケーションの準備

この例では、Java Spring Boot プロジェクトを例として使用します。

まず、start.spring.io を使用して Java Spring Boot プロジェクトを作成します。これにより、Java プロジェクトをすばやく作成し、プロジェクトに静止画やその他の構成を追加できるようになります。

で:

  • Gradle をビルド自動化ツールとして使用する
  • Spring Boot 2.7 の使用
  • パッケージビルド形式としてJARを使用する
  • JDK11の使用

構成が完了して生成されたら、圧縮されたパッケージをダウンロードして IDE で開くことができます。

まず build.gradle を設定して、すべての依存関係が正しいことを確認しましょう。

プラグイン{
id 'org.springframework.boot'バージョン'2.7.0'
id 'io.spring.dependency-management'バージョン'1.0.11.RELEASE'
id 'java'
}

リポジトリ{
メイヴン{
url = uri ( 'https://repo.spring.io/libs-snapshot' )
}
mavenCentral ()
}

依存関係管理{
インポート{
mavenBom 'io.micrometer:micrometer-bom:1.9.0-SNAPSHOT'
}
}

依存関係{
実装'org.springframework.boot:spring-boot-starter-actuator'
実装'io.micrometer:micrometer-registry-prometheus:1.9.0'
実装'org.springframework.boot:spring-boot-starter-web'
実装'io.opentelemetry:opentelemetry-api:1.12.0'
}

タスク名前付き( 'test' ) {
JUnitPlatform()を使用する
}

グループ= 'com.staz'
バージョン= '0.0.1-SNAPSHOT'
ソース互換性= '11'

次に、/fail​ と /success​ の 2 つのエンドポイントを持つコントローラー クラス Controller.java​ を作成します。ファイルは ${project}/src/main/java/com/staz/observability/ に配置する必要があります。

パッケージ com.staz.observability;

org.springframework.web.bind.annotation.GetMapping をインポートします。
org.springframework.web.bind.annotation.PostMapping をインポートします。
org.springframework.web.bind.annotation.RestController をインポートします。

@レストコントローラ
パブリッククラスコントローラ{

@PostMapping("/失敗")
パブリック文字列fail() {
「失敗!」を返します。
}

@GetMapping("/成功")
パブリック文字列成功() {

「成功!」を返します。
}

}

メトリックを trace_id に関連付けるには、${project}/src/main/java/com/staz/observability/​ パスの下に共通の構成クラス PrometheusExemplarConfiguration.java を作成する必要があります。

パッケージ com.staz.observability;

io.micrometer.core.instrument.Clock をインポートします。
io.micrometer.prometheus.PrometheusConfig をインポートします。
io.micrometer.prometheus.PrometheusMeterRegistry をインポートします。
io.opentelemetry.api.trace.Span をインポートします。
io.prometheus.client.CollectorRegistry をインポートします。
io.prometheus.client.exemplars.DefaultExemplarSampler をインポートします。
io.prometheus.client.exemplars.tracer.otel_agent をインポートします。
OpenTelemetryAgentSpanContextSupplier;
org.springframework.context.annotation.Bean をインポートします。
org.springframework.context.annotation.Configuration をインポートします。

@構成
パブリッククラス PrometheusExemplarConfiguration {
@ビーン
パブリック PrometheusMeterRegistry prometheusMeterRegistryWithExemplar
(PrometheusConfig prometheusConfig、CollectorRegistry collectorRegistry、
時計時計){
新しいPrometheusMeterRegistry(prometheusConfig, collectorRegistry,)を返します。
クロック、新しい DefaultExemplarSampler(新しい OpenTelemetryAgentSpanContextSupplier() {

@オーバーライド
パブリック文字列 getTraceId() {
(!Span.current().getSpanContext().isSampled())の場合{
null を返します。
}
super.getTraceId() を返します。
}
})
);
}
}

最後に、${project}/src/main/resources/​ディレクトリにある構成ファイル application.yml を編集します。

 # Prometheusを含むアクチュエータエンドポイントを有効にする
管理:
エンドポイント:
ウェブ:
暴露:
含む: 健康、情報、プロメテウス
メトリクス:
# 典型的な指標
分布:
パーセンタイルヒストグラム:
http.server.requests: 真
最小期待値:
http.server.リクエスト: 5ms
最大期待値:
http.server.リクエスト: 1000ミリ秒

# ログに trace_id を追加します。 OpenTelemetry は logger-mdc を使用してこの値を設定します。
# https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/logger-mdc-instrumentation.md
ログ記録:
パターン:
レベル: '%prefix(%mdc{trace_id:-0}) %5p'

プロジェクトをローカルで実行するには、OpenTelemetry Agent をダウンロードする必要があります。このプロジェクトで使用されるバージョンは 1.12.1 です。

準備が完了したら、ローカルでテストしてみましょう。

まず、gradle build -x test を使用してプロジェクトをコンパイルします。

次に、次のコマンドで起動します。

 java -javaagent:opentelemetry-javaagent.jar -Dspring.config.locatinotallow=src/main/resources/application.yml -jar build/libs/observability-0.0.1-SNAPSHOT.jar

次に、htttp://localhost:8080/fail と htttp://localhost:8080/success を使用してアクセスをテストできます。

次に、localhost:8080/actuator/prometheus を使用して、Prometheus インジケーターが有効かどうかを確認します。

最後に、metrice と trace_id の関連付けを確認します。

 curl -H 'Accept: application/openmetrics-text;バージョン 1.0.0; charset=utf-8' http://localhost:8080/actuator/prometheus | grep トレースID

Spring Boot アプリケーションの準備ができました。次に、監視ツールをインストールする必要があります。その前に、ローカルに K3s クラスターを作成し、すべてのソフトウェアをそこにデプロイします。

コンテナ化されたアプリケーション

まず、プロジェクトのルート ディレクトリに次の内容の Dockerfile を作成します。

 # OpenTelemetryAgent をダウンロード
curlimages/curl:7.81.0 から OTEL_AGENT として
ARG OTEL_AGENT_VERSION="1.12.1"
curl --silent --fail -L "https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v${OTEL_AGENT_VERSION}/opentelemetry-javaagent.jar" を実行します。\
-o "/tmp/opentelemetry-javaagent.jar"

# .JAR ファイルをビルドする
gradle:7.1.1-jdk11-hotspot から BUILD_IMAGE として
コピー --chown=gradle:gradle ./home/gradle/src
ワークディレクトリ /home/gradle/src
gradle build -x test --no-daemon を実行します。

# OTELエージェントと.JARファイルをコピーした最終イメージ
gradle:7.1.1-jdk11-hotspotから
ENV TIME_ZONE アメリカ/リマ
環境変数 TZ=$TIME_ZONE
ENV JAVA_OPTS "-Dspring.config.locatinotallow=src/main/resources/application.yml"
コピー --from=OTEL_AGENT /tmp/opentelemetry-javaagent.jar /otel-javaagent.jar
コピー --from=BUILD_IMAGE home/gradle/src/build/libs/*.jar app.jar
エントリポイント exec java -javaagent:/otel-javaagent.jar -jar app.jar

次のコマンドを使用してビルドおよびテストします。

次のコマンドを実行して、docker build を実行します。
$ docker run -it -p 8080:8080 otel-springboot-prometheus

コンテナが起動したら、http://localhost:8080/success を使用して正常に使用できるかどうかを確認します。

単一ノードクラスタの作成

まず、マルチパスを使用して Ubuntu インスタンスを作成します。

 $ マルチパス起動 --name デモ --mem 4G --disk 20G

次にインスタンスにログインします。

 $ マルチパスシェルデモ

sudo su コマンドを使用して、Ubuntu インスタンスに正しく入力したかどうかを確認できます。

次に、次のコマンドで K3s をインストールします。

 https://get.k3s.io を実行します。シュ -

クラスターが作成されたら、環境変数に KUBECONFIG を追加します。

 $ エクスポート KUBECONFIG=/etc/rancher/k3s/k3s.yaml

クラスターが正常に動作しているかどうかを確認します。

 $ kubectl クラスター情報

次に、後でアプリケーション ソフトウェアをインストールするために使用する Helm をインストールします。

 $ スナップインストールヘルム --classic

K3s の KUBECONFIG を ~/.kube/config ディレクトリにコピーします。

 $ kubectl config ビュー --raw > ~/.kube/config

最後に、Helm が正しく動作していることを確認します。

 $ ヘルム

可観測性コンポーネントをデプロイする

この段階では、Helm を使用して Prometheus、Promtail、Loki、Tempo、Grafana をデプロイし、最後にアプリケーションをデプロイして検証します。

 上記のアプリケーションはすべて K3s にデプロイされます。

まず、リポジトリから必要なマニフェストをクローンします。

 $ git clone https://github.com/stazdx/otel-springboot-grafana-tools.git
$ cd otel-springboot-grafana-tools/kubernetes

次に、Helm リポジトリを追加します。

 $ helm リポジトリ追加 grafana https://grafana.github.io/helm-charts
$ helm リポジトリの更新

最後に、名前空間を作成し、すべてのアプリケーションをこの名前空間にデプロイします。

 $ kubectl ns オブザーバビリティを作成します

Promtailを展開する

次のコマンドを使用してデプロイします。

 $ cd プロンプト
$ helm upgrade --install promtail grafana/promtail -n observability -f promtail.yaml

Promtail が指している Loki アドレスに注意してください。

Lokiを展開する

デプロイメントコマンドは次のとおりです。

 $ helm アップグレード --install loki grafana/loki-distributed -n 観測可能性

loki-loki-distributed-gateway サービスは非常に重要です。 Promtail はこれにデータを送信し、Grafana はそれを介してデータを取得します。

テンポを展開する

まず、Tempo マニフェストが配置されているディレクトリに移動します。

 $ cd ../テンポ

Tempo をインストールする前に、まず minio をインストールする必要があります。コマンドは次のとおりです。

 $ kubectl を適用 -f minio.yaml 

  Minio は、より一般的なオブジェクト ストレージ ツールであり、直接的な監視を目的としていないため、デフォルトの名前空間にデプロイされます。

次に、次のコマンドで Tempo をデプロイします。

 $ helm アップグレード --install tempo grafana/tempo-distributed -n observability -f tempo.yaml 

!! Grafana は tempo-tempo-distributed-query-frontend:3100 を通じてデータを取得します。

PrometheusとGrafanaをデプロイする

Prometheus と Grafana は、公式 Web サイトのリポジトリを使用して直接デプロイされます。

まず、Helm リポジトリを追加します。

 $ helm リポジトリに prometheus-community を追加します https://prometheus-community.github.io/helm-charts
$ helm リポジトリの更新

次に、リポジトリ マニフェストを使用してデプロイします。

 $ cd ../prometheus-grafana
$ helm依存関係の更新
helm アップグレード --install kube-prometheus-stack -n observability 。

デプロイメントの確認

Helm コマンドを使用して、デプロイされたすべてのアプリケーションを表示します。

 $ helm ls -n 可観測性

次に、kubectl を使用して、アプリケーションが正常に起動されたかどうかを確認します。

 $ kubectl get po -n 可観測性

サービスが正常かどうかを確認します。

 $ kubectl get svc -n 可観測性

すべてのアプリケーションが正常にデプロイされていることがわかります。

バックエンドアプリケーションをデプロイする

デプロイするには、ウェアハウス ディレクトリ リストに移動するだけです。

 $ cd ../springboot-app

Prometheus がインジケーターを正常にクロールできるようにするには、次の​Annotations​を追加する必要があることに注意してください。

注釈:
# Prometheus のアノテーション - scrape config
prometheus.io/パス: '/actuator/prometheus'
prometheus.io/ポート: 'アクチュエータ'
prometheus.io/scrape: 'true'

もう 1 つの重要な構成は、次の OpenTelemetry 構成です。

環境:
- 名前: SERVER_PORT
値: '8080'
- 名前: MANAGEMENT_SERVER_PORT
値: '8081'
# 設定 OTEL_EXPORTER_METRICS: none - デフォルト: OTLP
- 名前: OTEL_METRICS_EXPORTER
値: なし
- 名前: OTEL_TRACES_EXPORTER
値: otlp、ログ
# GRPC ポートを使用してテンポ ディストリビュータ サービスを設定する -> 4317
- 名前: OTEL_EXPORTER_OTLP_ENDPOINT
値: http://tempo-tempo-distributed-distributor.observability.svc.cluster.local:4317
- 名前: OTEL_SERVICE_NAME
値: springboot-app
- 名前: KUBE_POD_NAME
値:
フィールド参照:
フィールドパス: metadata.name
- 名前: OTEL_RESOURCE_ATTRIBUTES
値: app=springboot-app

最後に、Spring Boot を使用した Grafana ダッシュボードの構成マップがあり、これにより、リクエストのレイテンシなどのメトリックを通じて Exemplar と Tempo の相関関係を確認できます。

構成がチェックされ、正しいことが確認されたら、デプロイできます。

 $ kubectl apply -f springboot-app.yaml

アプリケーションが正常にデプロイされているかどうかを確認します。

 $ kubectl get deploy,svc,cm -l app=springboot-app

インターフェーステスト

まず、/fail インターフェースをテストします: http://{external-ip}:8080/fail。

次に、/success インターフェースをテストします: http://{external-ip}:8080/success。

最後に、/actuator/prometheus インターフェースをテストします: http://{external-ip}:8081/actuator/prometheus。

すべてのインターフェースが正常に戻ったことがわかります。

Grafana テスト

以上で全ての設定が完了しました。次に、Grafanaで正常に使用できるかを確認します。

まず、Grafana のアクセス アドレスを取得します。

 $ kubectl get svc -n 可観測性

ブラウザにアドレス http://{external-ip}:32656 を入力します。

次に、データ ソースを追加します。

Prometheus、Loki、Tempo のデータ ソースを追加します。

このうち、Prometheus の構成は次のとおりです。

!! Prometheus と Tempo が Exemplars を通じて関連付けられていることがわかります。

Loki の構成は次のとおりです。

!! Loki と Tempo が trace_id を通じて関連付けられていることがわかります。

テンポは次のように構成されます。

!!ここでは、Tempo を Loki に関連付け、マイクロサービスで構成したアプリケーション ラベルをマップします。

試してみる

アプリケーション ログは Explore から表示できます。

Loki データ ソースを選択します。

Loki を使用すると、監視ログをラベル別にフィルタリングできます。

ログからトレース情報を確認できます。

次に、Grafana ダッシュボードを見てみましょう。

私たちが独自に作成したパネルである Spring Boot Demo を選択します。

アプリケーションのリクエストのレイテンシと、Exemplar によって生成されたスターを確認できます。

マウスをその上に置くと、それがどのように trace_id に関連付けられているかがわかり、クリックすると Tempo にリダイレクトされます。

生成されたトレースを表示でき、ログも表示できます。これは Loki にも関連しているため、クリックすると特定の情報が表示されます。

画面は分割されていますが、特定のログを見ることができます。

やっと

メトリック、ログ、トレース間の可観測性の相関関係を有効にしました。これにより、ボトルネックを特定し、アプリケーション メトリックの動作を確認し、特定のトレースとログを取得できるため、マイクロサービスのトラブルシューティング プロセスに役立ちます。

<<:  クラウド ネイティブはビッグ データ アプリケーションの管理においてどのような役割を果たすのでしょうか?

>>:  VMware、自動化を推進し、IT の近代化を加速する Anywhere Workspace イノベーションを発表

推薦する

licloud 香港 VPS の簡単なレビュー - 香港合理化ネットワーク 100M 帯域幅、その仕組みを説明します

数日前、licloud の香港 VPS がリリースされました。これは、100Mbps の帯域幅を年間...

A5 WeChat公式アカウントをフォローして、ウェブマスターの役立つ情報をタイムリーに入手してください

モバイルインターネットの時代において、WeChatはさまざまな情報を入手するための主要なモバイルポー...

ウェブサイト分析: ウェブサイトユーザーのライフサイクル価値分析

Avinash Kaushik のブログの最近の記事「顧客生涯価値の計算」では、Web サイト ユー...

リンクの価値指向を利用してウェブサイトのリンクを最適化する

みなさんこんにちは。私はMuzi Chengzhouです。以前、私はLi Jianzhong氏の記事...

BandwagonHost VPS はいかがでしょうか?ロサンゼルス「USCA_8」データセンターのVPSの簡単なレビュー

BandwagonHost VPS はいかがでしょうか?破壊者USCA_8はどうですか? Bandw...

元ウェブマスターは今どこにいますか?

Baidu Newsで関連キーワードを検索したところ、Discuz!が最後に市場ブランドに露出されて...

ブラック 5: Namecheap - ドメイン名の新規登録/移管 0.98 USD

Namecheapのブラックフライデーのプロモーション情報は次のとおりです。[1] .club、.w...

raksmart: 無制限トラフィックの VPS、月額 2 ドルから、米国 VPS、香港 VPS、日本 VPS、韓国 VPS

Raksmart は、米国での無制限トラフィック VPS、香港での無制限トラフィック VPS、日本で...

百度のオンライン外部リンク拒否ツールが私たちにもたらした影響と啓蒙

3月1日、Baiduは外部リンクを拒否するツールをリリースしました。青大根アルゴリズムに続いて、Ba...

Googleが教えてくれる5つのよくあるSEOの間違い

みなさんこんにちは。私はMuzi Chengzhouです。 chinazのホームページで、Googl...

簡単な議論: 特殊車両ウェブサイトのユーザーエクスペリエンスを向上させる方法

昨日は工場の電気がなかったので、今日は出勤に回ったので、昨日Niziが書いた記事は見ていません。昨日...

素人の目から見て、オンライン採用は投資する価値があるのでしょうか?

卒業シーズンが近づいており、当社は最近採用活動に忙しくしています。当社はさまざまな方法で採用活動を行...

vmissはどうですか?ロサンゼルスユニコムAS9929ラインのVPSの簡単な評価

vmiss vps は、オリジナルのロサンゼルス cn2 gia、香港 cn2、日本 iij、韓国 ...

アリ氏によるOFOの17億7000万元の救済は、アリ氏とテンセントの魔法の計画によって支えられている

1. 注意:CITIC銀行は200万元以上の住宅ローンを停止しました2017年の時点で、2018年は...

ジュニパーネットワークスとエッジクラウドサービスプロバイダーのZenlayerが世界をつなぐために協力関係を拡大

ジュニパーネットワークス MX シリーズ ルーターは、セグメント ルーティング トラフィック エンジ...