4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenShift Advent Calendar 2024

Day 22

OpenShift Service Mesh 3.x + Tempo Operator + Red Hat build of OpenTelemetryで分散トレーシングの設定をしてみた

Last updated at Posted at 2024-12-22

この投稿はOpenShift Advent Calendar 2024の12/22の記事です。

概要

2024年9月末ごろに、OpenShift Service Mesh 3.x (Sail Operator) が Technology Previewで公開されました。
OpenShift Service Mesh 3.xでは、分散トレーシングは、Tempo Operator + Red Hat build of OpenTelemetryで実施することができます。

今回は、実際にOpenShift Service Mesh 3.x + Tempo Operator + Red Hat build of OpenTelemetryで、分散トレーシングの設定をやってみたので、その際の手順をメモとして残しておきます。

OpenShift ServiceMesh v3は 執筆時点(2024/12/19)では Technology Preview (TP) です。
GAになるまでは実稼働環境ではサポートの観点でまだ適用できない点に注意です。

(補足)Service Mesh 2.xの分散トレーシング
2024/12/19時点でGAされているOpenShift Service Meshの最新のバージョンはv2.6.xです。
Service Mesh 2.xは、分散トレーシングプラットフォーム(Jaeger)とOpenShift Elasticsearch Operatorで分散トレーシングを実施していましたが、Service Mesh 2.6が、Jaeger + Elasticsearchをサポートする最後のバージョンとなります。そのため、2.xでも今後はTempo Operator + Red Hat build of OpenTelemetryに切り替える必要があるとの記載があります。

今回は、Tempo Operator + Red Hat build of OpenTelemetryによる分散トレーシングの設定を実施するにあたり、せっかくなので、Service Mesh 2.xではなく、Service Mesh 3.xで、実施しています。

参考リンク

Qiita

OpenShift Service Mesh 3.x Document

OpenShift 4.17 Document

Red Hat Blog

Others

検証環境

今回は、IBM CloudのManaged OpenShift (ROKS)で実施しています。
バージョンは4.17.5です。
また、作業用のPCにはOpenShift CLI(oc)とIstio CLI(istioctl)がすでに導入されていることを前提とします。

(補足)Istio CLI(istioctl)のサポート
Istio CLI(istioctl)は、Service Mesh 2.xではサポートされていませんでしたが、3.xではサポートされています。

Mac: ~ % oc version
Client Version: 4.17.5
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: 4.17.5
Kubernetes Version: v1.30.5
Mac: ~ %
Mac: ~ % istioctl version
client version: 1.24.2
control plane version: 1.24.1_ossm_tp.2
data plane version: 1.24.1 (13 proxies)
Mac: ~ %

最終的な構成

今回の手順で使用したOperatorは以下のバージョンになります。

Operator Channel 更新承認ストラテジー CSV 備考
Red Hat OpenShift Service Mesh 3 candidates Automatic servicemeshoperator3.v3.0.0-tp.2 テクノロジープレビュー
Tempo Operator stable Manual tempo-operator.v0.14.1-1
Red Hat build of OpenTelemetry stable Manual 0.113.0-1

手順の流れ

OpenShift Service Mesh 3.x + Tempo Operator + Red Hat build of OpenTelemetryで、分散トレーシングの設定をする手順の流れは以下のようになります。

1. Istio(OpenShift Service Mesh 3)のインストール

2. 分散トレースプラットフォーム(Tempo)のインストール

3. 分散トレースデータ収集(OpenTelemetry)のインストール

4. サービスメッシュを使用したRed Hat OpenShift分散トレースデータ収集の設定

5. 分散トレーシングの確認

実施の手順

1. Istio(OpenShift Service Mesh 3)のインストール

(1) OpenShift Service Mesh 3.xの導入

まず、OCP 4.17.5に、Red Hat OpenShift Service Mesh 3 Operatorを導入します。

Red Hat OpenShift Service Mesh 3 Operatorの導入と、Service Mesh(Istio)のControl Plane(istiod)の初期設定、アプリケーションを公開するためのIngress Gatewayの作成は、以下の手順を参考に事前に作成しておきます。

2. 分散トレースプラットフォーム(Tempo)のインストール

(1) Tempo Operatorの導入

(2) TempoMoniliticインスタンスの作成

分散トレーシングの機能を提供する分散トレースプラットフォームとしてTempo Operatorを導入します。

Tempo Operator導入後に、Tempoのインスタンスを作成します。

Tempoのインスタンスは以下の2つの導入方法があります。

  • TempoStack: Tempoを構成する複数のコンポーネントをマイクロサービスモードで導入するカスタムリソース
    • (Gateway、Distributor、Ingester、Query Frontend、Querier、Compactorなど、Tempoデプロイメントの各コンポーネントが、マイクロサービスとして導入される)
  • TempoMonolitic: Tempoを構成する複数のコンポーネントをモノリシックモードで導入するカスタムリソース
    • (Gateway、Distributor、Ingester、Query Frontend、Querier、Compactorなど、Tempoデプロイメントの各コンポーネントが、単一のコンテナーに含まれる)

TempoMonoliticの方がインストールが簡単ですが、現在Technology Previewのステータスです。
今回は検証目的なので、TempoMonoliticで導入しています。

また、TempoStackTempoMonoliticのいずれの場合も、分散トレースデータの保存先としてオブジェクトストレージが必要です。

サポートされるオブジェクトストレージは、現在は、Red Hat OpenShift Data Foundation、MinIO、Amazon S3、Azure Blob Storage、Google Cloud Storage となります。
(TempoMonoliticの場合は、オブジェクトストレージ以外にも、インメモリーストレージ、永続ボリュームも利用可能。)

今回はIBM CloudのROKS環境を使っているため、(サポートはないですが)IBM Cloud Object Storage(ICOS)をTempoのバックエンドのストレージとして構成して検証しました。
具体的な手順は以下の記事をご参照ください。

今回は以下のマニフェストでTempoMonolithicインスタンスを作成しています。

TempoMonolithic-sample.yaml
apiVersion: tempo.grafana.com/v1alpha1
kind: TempoMonolithic
metadata:
  name: sample
  namespace: sample-tempo-monolithic
spec:
  jaegerui:
    enabled: true
    route:
      enabled: true
  storage:
    traces:
      backend: s3
      s3:
        secret: sample-tempo-monolithic-cos-secret
      size: 10Gi

3. 分散トレースデータ収集(OpenTelemetry)のインストール

(1) Red Hat build of OpenTelemetry Operatorの導入

分散トレースデータを収集するため、Red Hat build of OpenTelemetry Operatorを導入します。

OCP コンソールにcluster-admin roleのある管理者ユーザーでログインし、左側のメニューからOperator -> OperatorHubを選択します。

検索ボックスで「OpenTelemetry」という文字列を入力して、「Red Hat build of OpenTelemetry Operator」をクリックします。

2024-12-21-21-45-57.png

「Red Hat build of OpenTelemetry Operator」画面で、「インストール」をクリックします。

2024-12-21-21-46-34.png

「Operatorのインストール」ページで、「更新チャネル」や「バージョン」などのフィールドは以下のように設定しました。
設定をしたら「インストール」をクリックします。

設定項目 デフォルト値 設定値 備考
更新チャネル stable デフォルトのまま
バージョン 0.113.0-1 デフォルトのまま 2024/12/21の最新
インストールモード クラスターのすべてのnamespace (デフォルト) デフォルトのまま
インストール済みのnamespace Operator推奨のnamespace (openshift-opentelemetry-operator) デフォルトのまま
この namespace で Operator で推奨されるクラスターモニタリングを有効化する チェックされていない チェック Option
更新の承認 自動 手動 (※)実案件ではコンポーネントのバージョンは明確に管理する必要があったり、アップデートするタイミングを業務外にする必要があることがあります。
そのような場合には、自動でチャネル内の最新のパッチバージョンに更新されないようにするため「手動」にしたりします。

2024-12-21-21-48-15.png

「承認」をクリックします。

2024-12-21-21-48-39.png

openshift-opentelemetry-operator namespaceに Red Hat build of OpenTelemetry Operatorがインストールされたことを確認します。

2024-12-21-21-49-11.png
2024-12-21-21-49-29.png

Mac: ~ % oc get pod -n openshift-opentelemetry-operator
NAME                                                         READY   STATUS    RESTARTS   AGE
opentelemetry-operator-controller-manager-6d7c77b6bc-nzmtg   2/2     Running   0          5m27s
Mac: ~ %

4. サービスメッシュを使用した分散トレースデータ収集の設定

以下のリンクに従って、サービスメッシュを使用した分散トレースデータ収集の設定を実施します。

(1) OpenTelemetry Collectorの作成(kind: OpenTelemetryCollector)

OpenTelemetry Collectorの導入と設定をします。

Service MeshのControll Planeを導入したistio-system namespaceに「OpenTelemetry Collector」を導入します。

  • OpenTelemetryCollectorリソースをistio-sytem namespaceに作成します。

  • .spec.config.service.pipelines.tracesexportersreceiversotlpに設定しています。

  • .spec.config.exportersでは、otlpを指定し、endpointとして、「2-(2) TempoMoniliticインスタンスの作成」で導入したTempoMonoliticインスタンス(tempo-sample)のServiceのホスト名を指定します。

    Mac: ~ % oc get svc -n sample-tempo-monolithic
    NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                  AGE
    tempo-sample            ClusterIP   172.21.20.215   <none>        3200/TCP,4317/TCP,4318/TCP               44h
    tempo-sample-jaegerui   ClusterIP   172.21.225.7    <none>        16685/TCP,16686/TCP,16687/TCP,8443/TCP   44h
    Mac: ~ %
    

OpenTelemetry Collectorのマニフェストファイルのサンプルは以下になります。

OpenTelemetryCollector-otel.yaml
kind: OpenTelemetryCollector
apiVersion: opentelemetry.io/v1beta1
metadata:
  name: otel
  namespace: istio-system
spec:
  observability:
    metrics: {}
  deploymentUpdateStrategy: {}
  config:
    exporters:
      otlp:
        endpoint: 'tempo-sample.sample-tempo-monolithic.svc.cluster.local:4317'
        tls:
          insecure: true
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: '0.0.0.0:4317'
          http: {}
    service:
      pipelines:
        traces:
          exporters:
            - otlp
          receivers:
            - otlp

作成したマニフェストファイルを適用します。

Mac: Qiita-OTLM-Tempo % oc get OpenTelemetryCollector -n istio-system
No resources found in istio-system namespace.
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc apply -f OpenTelemetryCollector-otel.yaml
opentelemetrycollector.opentelemetry.io/otel created
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc get OpenTelemetryCollector -n istio-system
NAME   MODE         VERSION   READY   AGE   IMAGE                                                                                                                             MANAGEMENT
otel   deployment   0.113.0   1/1     28s   registry.redhat.io/rhosdt/opentelemetry-collector-rhel8@sha256:2656a6c8c4d499f64b331f4043b05147ad43a9cf1ba8d6ff97fdf0ac83680b6a   managed
Mac: Qiita-OTLM-Tempo %

OpenTelemetry Collectorが導入されました。

Mac: Qiita-OTLM-Tempo % oc get deploy -n istio-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
istiod           1/1     1            1           3d3h
kiali            1/1     1            1           3d1h
otel-collector   1/1     1            1           91s
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc get pod -n istio-system
NAME                              READY   STATUS    RESTARTS   AGE
istiod-54746b5db6-cqqzr           1/1     Running   0          3d3h
kiali-d4798656d-v7wsq             1/1     Running   0          3d1h
otel-collector-5d69c78c66-dc9v7   1/1     Running   0          101s
Mac: Qiita-OTLM-Tempo %

(2) Istio Controllerの設定(kind: Istio)

Istio Controllerで、トレーシングを有効にします。

1-(1) OpenShift Service Mesh 3.xの導入」欄のStep 2. Control Planeのセットアップのリンク先で作成したIstioリソースを編集します。

oc get Istio -n istio-system

編集内容は以下になります。

  • spec.values.meshConfigextentionsProvidersopentelemetryを指定することによってOpenTelemetry形式でのトレーシングを利用することができます。
  • OpenTelemetryのserviceとして、前の4-(1) OpenTelemetry Collectorの作成(kind: OpenTelemetryCollector)の手順で、istio-system namespaceに作成した、OpenTelemtry CollectorのService (otel-collector)を指定します。

実際に修正をします。修正箇所はコメントの部分になります。

Mac: ~ % oc edit Istio default -n istio-system
istio.sailoperator.io/default edited
apiVersion: sailoperator.io/v1alpha1
kind: Istio
metadata:
#(略)
  name: default
spec:
  namespace: istio-system
#(略)
  values:
    meshConfig:
      ### 以下のトレーシングに関する定義を追加する
      enableTracing: true
      extensionProviders:
      - name: otel-tracing
        opentelemetry:
          port: 4317
          service: otel-collector.istio-system.svc.cluster.local
      ### 追加はここまで

(3) Telemetry APIの設定(kind: Telemetry)

Istiospec.values.meshConfig.extentionsProvidersで設定した内容を、Telemetry APIを利用して有効化させます。

  • Istioと同じistio-systme namespaceにTelemetryリソースを作成します。
  • .spec.tracing.providersには、前の手順で指定したIstioextensionProvidernameを指定します。

マニフェストファイルのサンプルは以下になります。

Telemetry-otel-demo.yaml
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: otel-demo
  namespace: istio-system
spec:
  tracing:
    - providers:
        - name: otel-tracing
      randomSamplingPercentage: 100

トレースが表示されることを確認したら、randomSamplingPercentageの値を減らすか、defaultに設定してリクエストの数を減らすことができます。

作成したマニフェストファイルを適用します。

Mac: Qiita-OTLM-Tempo % oc get Telemetry -n istio-system
No resources found in istio-system namespace.
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc apply -f Telemetry-otel-demo.yaml
telemetry.telemetry.istio.io/otel-demo created
Mac: Qiita-OTLM-Tempo %
Mac: Qiita-OTLM-Tempo % oc get Telemetry -n istio-system
NAME        AGE
otel-demo   5s
Mac: Qiita-OTLM-Tempo %

5. 分散トレーシングの確認

OpenShift Service Mesh 3.x (Sail Operator) + Tempo Operator + Red Hat build of OpenTelemetryで、サービスメッシュを使用した分散トレースデータ収集の設定ができたので、実際にトレースが取得できているかを確認します。

(1) サンプルアプリのデプロイ(Bookinfo)

Istio Docs / Bookinfo Application」に記載のBookinfoのサンプルアプリをデプロイします。

1. アプリケーションのProject(Namespace)の作成

今回はIstioはInPlaceストラテジーで導入しているため、アプリケーションをデプロイするnamespaceにistio-injection=enabledのラベルを付与します。
(RevisionBasedストラテジーの場合は、3.1.1. サービスメッシュを使用した Red Hat OpenShift 分散トレースデータ収集の設定の手順5を参照。)

# Projectの作成
Mac: Qiita-bookinfo-test % oc new-project app-test
Now using project "app-test" on server "https://c100-e.jp-tok.containers.cloud.ibm.com:30595".
()

# istio-injectionラベルを付与
Mac: Qiita-bookinfo-test % oc label ns app-test istio-injection=enabled
namespace/app-test labeled

2. Deployment & Servcieの作成

以下のマニフェストファイルをダウンロードして適用します。

Mac: Qiita-bookinfo-test % oc apply -f bookinfo.yaml -n app-test
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

3. Gateway & VirtualServiceリソースの作成

以下のマニフェストファイルをダウンロードして適用します。
(今回はKubernetes Gateway APIではなく、IstioのGateway APIを使用しています。)

<アプリアクセスのためのFSQNを指定>の部分は環境に合わせて設定します。
(例: bookinfo-test.<ドメイン名>)

istio-gateway-http.yaml
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - <アプリアクセスのためのFSQNを指定>
    port:
      name: http2
      number: 80
      protocol: HTTP
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: bookinfo-test
spec:
  hosts:
  - <アプリアクセスのためのFSQNを指定>
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080

作成したマニフェストファイルを適用します。

Mac: Qiita-bookinfo-test % oc apply -f istio-gateway-http.yaml -n app-test
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo-test created
Mac: Qiita-bookinfo-test % oc get gateway -n app-test
NAME               AGE
bookinfo-gateway   34s
Mac: Qiita-bookinfo-test %
Mac: Qiita-bookinfo-test % oc get virtualservice -n app-test
NAME            GATEWAYS               HOSTS                             AGE
bookinfo-test   ["bookinfo-gateway"]   ["bookinfo-test.<domane name>"]   47s
Mac: Qiita-bookinfo-test %

4. Routeリソースの作成

本当はRouter経由で公開しなくても別途LBを立てて直接Ingress Gatewayにアクセスでも良いのですが、本記事ではRouter経由でアプリケーションにアクセスすることにします。

以下のようなyamlファイルを用意します。

route-bookinfo-test.yaml
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: bookinfo-gateway-test
  namespace: istio-ingress
spec:
  host: <アプリアクセスのためのFSQNを指定>
  to:
    kind: Service
    name: istio-ingressgateway
    weight: 100
  port:
    targetPort: http2
  wildcardPolicy: None

作成したマニフェストファイルを適用します。

Mac: Qiita-bookinfo-test % oc apply -f route-bookinfo-http.yaml
route.route.openshift.io/bookinfo-gateway-test created
Mac: Qiita-bookinfo-test %
Mac: Qiita-bookinfo-test % oc get route -n istio-ingress bookinfo-gateway-test
NAME                    HOST/PORT                     PATH   SERVICES               PORT    TERMINATION   WILDCARD
bookinfo-gateway-test   bookinfo-test.<domain name>          istio-ingressgateway   http2                 None
Mac: Qiita-bookinfo-test %

5. アプリケーションへのアクセス

トレースを生成するために、Route経由で何回かアプリに何回かアクセスしてみます。

  • URL: http://bookinfo-test.<domain name>/productpage

2024-12-21-21-51-06.png

(2) 分散トレーシングの確認(Jaeger UI)

トレースが取得できているかを確認します。

Tempo Operatorでは、TempoStackまたはTempoMonoliticリソースを導入する際にJaeger UIも一緒に導入できます。
今回は2-(2) TempoMoniliticインスタンスの作成の手順で作成したTempoMonoliticリソースで、すでにJaeger UIが有効化されRouteも作成されています。

apiVersion: tempo.grafana.com/v1alpha1
kind: TempoMonolithic
# (略)
spec:
  jaegerui:
    enabled: true
    route:
      enabled: true
# (略)

このJaeger UIを利用して、トレース情報が取得できているかを確認します。
Jaeger UIのRouteは、TempoMonoliticを導入したnamespaceにあります。

Mac: Qiita-bookinfo-test % oc get route -n sample-tempo-monolithic
NAME                    HOST/PORT                                                     PATH   SERVICES                PORT          TERMINATION   WILDCARD
tempo-sample-jaegerui   tempo-sample-jaegerui-sample-tempo-monolithic.<domain name>          tempo-sample-jaegerui   oauth-proxy   reencrypt     None

または、OCP コンソールの左側のメニューからネットワーク -> Routeを選択し、左上でプロジェクトをTempMonoliticリソースを作成したnamespaceに変更して、tempo-sample-jaegeruiのrouteのリンクをクリックします。

2024-12-21-21-51-28.png

Jaeger UIが表示されます。

2024-12-21-21-52-10.png

トレース情報が取得できている場合は、「Service」のプルダウンで、いくつかエントリーが表示されます。

2024-12-21-21-52-47.png

例として「productpage.app-test」や「details.app-test」などを選択して、「Find Trages」をクリックします。
それぞれトレース情報が表示されます。

「productpage.app-test」
2024-12-21-21-54-50.png
2024-12-21-21-55-11.png

「details.app-test」
2024-12-21-21-55-29.png
2024-12-21-21-55-44.png

まとめ

OpenShift Service Mesh 3.x + Tempo Operator + Red Hat build of OpenTelemetryで、分散トレーシングの設定をやってトレース情報が取得できることを確認しました。

Service Mesh 2.6からは、Tempo Operator + Red Hat build of OpenTelemetryが推奨になっていますが、今まですでにService Mesh 2.xを使われている方はJaeger + Elasticsearchで分散トレーシングを実装しているのではないかなと思います。

Tempo Operator + Red Hat build of OpenTelemetry導入や設定方法はドキュメントの場所がいくつかに分かれているので少し大変ですが、3.xのドキュメントは(まだTPですが)、設定方法が前よりもわかりやすく記載されていたので、実際にやってみて一連の流れが整理できたかなと思います。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?