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 イノベーションを発表

推薦する

shuhost: 香港独立サーバー、477元、e3-1230v2/16Gメモリ/1Tハードディスク/20M帯域幅/3IP

Shuhost(ShuMai Technology)は11月25日より、香港のデータセンターで多数の...

XenS の「言葉では言い表せない」年齢 - 20 年 / Xen / 256 MB のメモリ / 150 g のハードディスク / 500 g のトラフィック

drserver.net のストレージ VPS ブランドである XenS の「言葉にできない」時代は...

一歩先へ:百度諾米O2Oチェスゲームでリンクされた馬

2014年、BATが地元の生活の場に参入すると、ほとんど忘れ去られていた共同購入業界が突如として熱を...

ネットワークマーケティング部門が業績評価に参加すべきかどうかについての簡単な議論

ご存知のとおり、企業内のすべての部門と役職は、売上を達成し利益を上げるために設立され、機能します。そ...

データから学び、ユーザーデータを新製品設計に適用する

導入通常、ユーザーインタビューを通じてユーザーのニーズを把握することができます。実際、デザイナーはユ...

良いランキングを獲得するための重要な要素は、外部リンクではなくユーザーエクスペリエンスです。

SEO は、ランキングを上げるために多数の外部リンクを使用する従来の方法から、ウェブサイトの総合的な...

ビジネス戦争と紛争:ケータリングO2Oが世界を征服し、市場シェアをめぐる戦いを開始

O2Oは間違いなく中国の電子商取引市場におけるダークホースであり、近年の急速な拡大と成長は中国のO2...

調査結果:マルチクラウドが標準になりつつある

パブリック クラウドに多額の投資をする企業が増えており、AWS パブリック クラウドとの差を縮めるた...

百度はネガティブな情報を排除する方法を知っている

最近、会社のWeiboマーケティングとメールマーケティングを担当しているので、Weiboマーケティン...

ブルーホールは「ナイブズ・アウト」と「ターミネーター2」の2つのゲームを棚から永久に撤去するよう要求している

北京時間4月6日早朝、海外メディアtorrentfreakは「PUBGが競争相手を締め出すため著作権...

Puyuan は、デジタルの未来を勝ち取るためにマイクロサービスと DevOps プラットフォームをアップグレードします

[51CTO.comよりオリジナル記事] 世界経済フォーラムの最新レポートによると、企業のデジタルト...

レンタカー旅行プラットフォームユーザー操作システム(1):チャネルプロモーション

この記事では、レンタカー プラットフォームである EasiestCarRental の完全なユーザー...

工業情報化部の幹部らが華雲データグループを視察

2019年3月27日、工業情報化部弁務局長の傅静波氏、情報ソフトウェア部副部長の董大建氏は江蘇省工業...

Baiboの採用でリソースの検索に失敗しました。その理由は何ですか

少し前に、百度は諾米団への戦略的投資を発表しました。現在までに、百度はまたしても大型取引を成し遂げま...