この投稿は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に切り替える必要があるとの記載があります。
- OCP 4.17 Docs / Service Mesh 2.x / Service Mesh リリースノート / 2.2.14.4. Red Hat OpenShift 分散トレーシングプラットフォーム (Tempo) と Red Hat build of OpenTelemetry との統合
- OCP 4.17 Docs / Service Mesh 2.x / Service Mesh リリースノート / 2.2.14.5. Red Hat OpenShift 分散トレーシングプラットフォーム (Jaeger) のデフォルト設定の変更
- OCP 4.17 Docs / Service Mesh 2.x / Service MEsh リリースノート / 2.2.22.1. Red Hat OpenShift Service Mesh 2.5 で非推奨化および削除された機能
今回は、Tempo Operator + Red Hat build of OpenTelemetryによる分散トレーシングの設定を実施するにあたり、せっかくなので、Service Mesh 2.xではなく、Service Mesh 3.xで、実施しています。
参考リンク
Qiita
- Qiita / もうそろそろ Openshift ServiceMesh v3 が出てきそうだし、導入してみる
- Qiita / OpenShiftでTempo Operatorを使った分散トレーシングを実現する
OpenShift Service Mesh 3.x Document
- Red Hat OpenShift Service Mesh 3.0.0tp1
- Red Hat OpenShift Service Mesh 3.0.0tp1 / 分散トレースと Service Mesh
OpenShift 4.17 Document
- OCP 4.17 Docs / Service Mesh
- OCP 4.17 Docs / 分散トレーシング / 3. distributed tracing platform (Tempo)
- OCP 4.17 Docs / Red Hat build of OpenTelemetry
Red Hat Blog
- Red Hat Blog / Red Hat OpenShift Service Mesh 3: Now technology preview
- Red Hat Blog / Red Hat OpenShift Service Mesh 3: Frequently asked questions
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分散トレースデータ収集の設定
- (1) OpenTelemetry Collectorの作成(kind: OpenTelemetryCollector)
- (2) Istio Controllerの設定(kind: Istio)
- (3) Telemetry APIの設定(kind: Telemetry)
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
で導入しています。
また、TempoStack
、TempoMonolitic
のいずれの場合も、分散トレースデータの保存先としてオブジェクトストレージが必要です。
サポートされるオブジェクトストレージは、現在は、Red Hat OpenShift Data Foundation、MinIO、Amazon S3、Azure Blob Storage、Google Cloud Storage となります。
(TempoMonolitic
の場合は、オブジェクトストレージ以外にも、インメモリーストレージ、永続ボリュームも利用可能。)
- OCP 4.17 Docs / 分散トレーシング / 3. distributed tracing platform (Tempo) / 3.1.2. TempoStack インスタンスのインストール
- OCP 4.17 Docs / 分散トレーシング / 3. distributed tracing platform (Tempo) / 3.1.3. TempoMonolithic インスタンスのインストール
今回はIBM CloudのROKS環境を使っているため、(サポートはないですが)IBM Cloud Object Storage(ICOS)をTempoのバックエンドのストレージとして構成して検証しました。
具体的な手順は以下の記事をご参照ください。
今回は以下のマニフェストでTempoMonolithic
インスタンスを作成しています。
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」をクリックします。
「Red Hat build of OpenTelemetry Operator」画面で、「インストール」をクリックします。
「Operatorのインストール」ページで、「更新チャネル」や「バージョン」などのフィールドは以下のように設定しました。
設定をしたら「インストール」をクリックします。
設定項目 | デフォルト値 | 設定値 | 備考 |
---|---|---|---|
更新チャネル | stable |
デフォルトのまま | |
バージョン | 0.113.0-1 |
デフォルトのまま | 2024/12/21の最新 |
インストールモード | クラスターのすべてのnamespace (デフォルト) | デフォルトのまま | |
インストール済みのnamespace | Operator推奨のnamespace (openshift-opentelemetry-operator ) |
デフォルトのまま | |
この namespace で Operator で推奨されるクラスターモニタリングを有効化する | チェックされていない | チェック | Option |
更新の承認 | 自動 | 手動 | (※)実案件ではコンポーネントのバージョンは明確に管理する必要があったり、アップデートするタイミングを業務外にする必要があることがあります。 そのような場合には、自動でチャネル内の最新のパッチバージョンに更新されないようにするため「手動」にしたりします。 |
「承認」をクリックします。
openshift-opentelemetry-operator
namespaceに Red Hat build of OpenTelemetry Operator
がインストールされたことを確認します。
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. サービスメッシュを使用した分散トレースデータ収集の設定
以下のリンクに従って、サービスメッシュを使用した分散トレースデータ収集の設定を実施します。
- Red Hat OpenShift Service Mesh 3.0.0tp1 / 3. 分散トレースと Service Mesh / 3.1. Service Mesh を使用した Red Hat OpenShift 分散トレースプラットフォームの設定
- Red Hat OpenShift Service Mesh 3.0.0tp1 / 3. 分散トレースと Service Mesh / 3.1. Service Mesh を使用した Red Hat OpenShift 分散トレースプラットフォームの設定 / 3.1.1. サービスメッシュを使用した Red Hat OpenShift 分散トレースデータ収集の設定
(1) OpenTelemetry Collectorの作成(kind: OpenTelemetryCollector)
OpenTelemetry Collectorの導入と設定をします。
Service MeshのControll Planeを導入したistio-system
namespaceに「OpenTelemetry Collector」を導入します。
-
OpenTelemetryCollector
リソースをistio-sytem
namespaceに作成します。 -
.spec.config.service.pipelines.traces
のexporters
とreceivers
をotlp
に設定しています。 -
.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のマニフェストファイルのサンプルは以下になります。
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.meshConfig
のextentionsProviders
でopentelemetry
を指定することによって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)
Istio
のspec.values.meshConfig.extentionsProviders
で設定した内容を、Telemetry APIを利用して有効化させます。
-
Istio
と同じistio-systme
namespaceにTelemetry
リソースを作成します。 -
.spec.tracing.providers
には、前の手順で指定したIstio
のextensionProvider
のname
を指定します。
マニフェストファイルのサンプルは以下になります。
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.<ドメイン名>)
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ファイルを用意します。
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
(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のリンクをクリックします。
Jaeger UIが表示されます。
トレース情報が取得できている場合は、「Service」のプルダウンで、いくつかエントリーが表示されます。
例として「productpage.app-test」や「details.app-test」などを選択して、「Find Trages」をクリックします。
それぞれトレース情報が表示されます。
まとめ
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ですが)、設定方法が前よりもわかりやすく記載されていたので、実際にやってみて一連の流れが整理できたかなと思います。