Service Mesh(ASM)インスタンスのバージョンが v1.18.0.124 より前の場合、トレースデータは Zipkin と互換性のあるセルフマネージドシステムにのみエクスポートできます。ASMインスタンスのバージョンが v1.18.0.124 以降の場合、トレースデータは Managed Service for OpenTelemetry にのみエクスポートできます。このトピックでは、Zipkin または Managed Service for OpenTelemetry と互換性のあるセルフマネージドシステムに ASM トレースデータをエクスポートする方法について説明します。
前提条件
Zipkin と互換性のあるセルフマネージドシステムが構築されており、Zipkin サーバーのポート 9411 でリッスンしています。Jaeger を使用する場合は、Zipkinコレクターをデプロイする必要があります。
セルフマネージドシステムは、データプレーンのクラスターにデプロイされています。
ASMインスタンスが作成され、KubernetesクラスターがASMインスタンスに追加されています。詳細については、「ASMインスタンスへのクラスターの追加」をご参照ください。
イングレスゲートウェイがASMインスタンスに作成されています。詳細については、「イングレスゲートウェイの作成」をご参照ください。
手順
ASMインスタンスのバージョンに基づいて操作を実行します。
v1.18.0.124 以降の ASM インスタンスの場合
ステップ 1:Zipkin をデプロイする
次のコマンドを実行して、Zipkin をデプロイするための zipkin という名前のネームスペースを作成します。
kubectl create namespace zipkin
次のコマンドを実行して、Helm を使用して Zipkin をインストールします。
helm install --namespace zipkin my-zipkin carlosjgp/zipkin --version 0.2.0
次のコマンドを実行して、Zipkin が正しく実行されているかどうかを確認します。
kubectl -n zipkin get pods
期待される出力:
NAME READY STATUS RESTARTS AGE
my-zipkin-collector-79c6dc9cd7-jmswm 1/1 Running 0 29m
my-zipkin-ui-64c97b4d6c-f742j 1/1 Running 0 29m
ステップ 2:OpenTelemetry Operator をデプロイする
kubeconfig ファイルの情報に基づいて、kubectl を使用して ACK クラスターに接続します。次に、次のコマンドを実行して opentelemetry-operator-system ネームスペースを作成します。
kubectl create namespace opentelemetry-operator-system
次のコマンドを実行して、Helm を使用して opentelemetry-operator-system ネームスペースに OpenTelemetry Operator をインストールします。
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
helm install --namespace=opentelemetry-operator-system opentelemetry-operator open-telemetry/opentelemetry-operator \
--set "manager.collectorImage.repository=otel/opentelemetry-collector-k8s" \
--set admissionWebhooks.certManager.enabled=false \
--set admissionWebhooks.autoGenerateCert.enabled=true
次のコマンドを実行して、OpenTelemetry Operator が正しく動作しているかどうかを確認します。
kubectl get pod -n opentelemetry-operator-system
期待される出力:
NAME READY STATUS RESTARTS AGE
opentelemetry-operator-854fb558b5-pvllj 2/2 Running 0 1m
出力は、ステータスが実行中であることを示しています。これは、OpenTelemetry Operator が正しく動作していることを意味します。
ステップ 3:OpenTelemetry Collector を作成する
コードブロックに示されている次の内容を含む collector.yaml ファイルを作成します。
YAML ファイルの ${ENDPOINT}
を、gRPC プロトコルをサポートする仮想プライベートクラウド(VPC)エンドポイントに置き換えます。${TOKEN}
を認証トークンに置き換えます。Managed Service for OpenTelemetry でサポートされているエンドポイントと認証トークンの取得方法については、「Managed Service for OpenTelemetry を使用する準備」をご参照ください。
collector.yaml ファイルを表示する
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
labels:
app.kubernetes.io/managed-by: opentelemetry-operator
name: default
namespace: opentelemetry-operator-system
annotations:
sidecar.istio.io/inject: "false"
spec:
config: |
extensions:
memory_ballast:
size_mib: 512
zpages:
endpoint: 0.0.0.0:55679
receivers:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
exporters:
debug:
zipkin:
endpoint: http://my-zipkin-collector.zipkin.svc.cluster.local:9411/api/v2/spans
service:
pipelines:
traces:
receivers: [otlp]
processors: []
exporters: [zipkin, debug]
ingress:
route: {}
managementState: managed
mode: deployment
observability:
metrics: {}
podDisruptionBudget:
maxUnavailable: 1
replicas: 1
resources: {}
targetAllocator:
prometheusCR:
scrapeInterval: 30s
resources: {}
upgradeStrategy: automatic
kubeconfig ファイルの情報に基づいて、kubectl を使用して Container Service for Kubernetes(ACK)クラスターに接続し、次のコマンドを実行してクラスターに OpenTelemetry Collector をデプロイします。
kubectl apply -f collector.yaml
次のコマンドを実行して、OpenTelemetry Collector が起動されているかどうかを確認します。
kubectl get pod -n opentelemetry-operator-system
期待される出力:
NAME READY STATUS RESTARTS AGE
opentelemetry-operator-854fb558b5-pvllj 2/2 Running 0 3m
default-collector-5cbb4497f4-2hjqv 1/1 Running 0 30s
出力は、OpenTelemetry Collector が正常に起動したことを示しています。
次のコマンドを実行して、OpenTelemetry Collector のサービスが作成されているかどうかを確認します。
kubectl get svc -n opentelemetry-operator-system
期待される出力:
opentelemetry-operator ClusterIP 172.16.138.165 <none> 8443/TCP,8080/TCP 3m
opentelemetry-operator-webhook ClusterIP 172.16.127.0 <none> 443/TCP 3m
default-collector ClusterIP 172.16.145.93 <none> 4317/TCP 30s
default-collector-headless ClusterIP None <none> 4317/TCP 30s
default-collector-monitoring ClusterIP 172.16.136.5 <none> 8888/TCP 30s
出力は、OpenTelemetry Collector のサービスが作成されていることを示しています。
ステップ 4:テストアプリケーションをデプロイする
Bookinfo アプリケーションと sleep アプリケーションをデプロイします。詳細については、「ASM インスタンスに追加された ACK クラスターにアプリケーションをデプロイする」をご参照ください。
bookinfo.yaml
sleep.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: sleep
---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
service: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
terminationGracePeriodSeconds: 0
serviceAccountName: sleep
containers:
- name: sleep
image: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
command: ["/bin/sleep", "infinity"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /etc/sleep/tls
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: sleep-secret
optional: true
---
ステップ 5:productpage アプリケーションにアクセスし、トレースデータを表示する
次のコマンドを実行して、productpage アプリケーションにアクセスします。
kubectl exec -it deploy/sleep -c sleep -- curl productpage:9080/productpage?u=normal
アクセスが成功したら、OpenTelemetry Collector のログと debug exporter によって出力された出力を表示します。
2023-11-20T08:44:27.531Z info TracesExporter {"kind": "exporter", "data_type": "traces", "name": "debug", "resource spans": 1, "spans": 3}
ステップ 6:ASM ゲートウェイを設定し、Zipkin サービスでトレースデータを表示する
Istio ゲートウェイを作成します。
次の内容を使用して ingressgateway.yaml ファイルを作成します。
展開して ingressgateway.yaml ファイルを表示する
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: ingressgateway
namespace: istio-system
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: http
number: 80
protocol: HTTP
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: ingressgateway
namespace: istio-system
spec:
gateways:
- ingressgateway
hosts:
- '*'
http:
- route:
- destination:
host: my-zipkin-collector.zipkin.svc.cluster.local
port:
number: 9411
kubeconfig ファイルの情報に基づいて、kubectl を使用して ASM インスタンスに接続します。次に、次のコマンドを実行して、ASM ゲートウェイがポート 80 でリッスンするようにし、Zipkin サービスへのルートを設定します。
kubectl apply -f ingressgateway.yaml
ASM ゲートウェイの IP アドレスを使用して Zipkin サービスにアクセスし、トレースデータを表示します。

v1.18.0.124 より前の ASM インスタンスの場合
ステップ 1:ASM インスタンスのトレース機能を有効にする
ASM インスタンスのバージョンが v1.17.2.28 より前の場合、次の操作を実行してトレース機能を有効にできます。ASM コンソールにログインします。ASM インスタンスの [基本情報] ページで、[設定] をクリックします。表示されるページで、[トレース分析を有効にする] を選択し、関連パラメーターを設定して、[OK] をクリックします。
ASM インスタンスのバージョンが v1.17.2.28 以降の場合、「可観測性設定の構成」の「トレース分析設定の説明」セクションを参照して、トレース機能を有効にできます。
ステップ 2:データプレーンの Kubernetes クラスターに Zipkin をデプロイする
次の内容を使用して zipkin-server.yaml ファイルを作成します。
展開して zipkin-server.yaml ファイルを表示する
apiVersion: apps/v1
kind: Deployment
metadata:
name: zipkin-server
namespace: istio-system
spec:
replicas: 1
selector:
matchLabels:
app: zipkin-server
component: zipkin
template:
metadata:
labels:
app: zipkin-server
component: zipkin
spec:
containers:
- name: zipkin-server
image: openzipkin/zipkin
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
path: /health
port: 9411
initialDelaySeconds: 5
periodSeconds: 5
説明 カスタム YAML ファイルを使用して Zipkin をデプロイする場合は、Zipkin が istio-system ネームスペースにデプロイされていることを確認してください。
次のコマンドを実行して、データプレーンの Kubernetes クラスターに Zipkin をデプロイします。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f zipkin-server.yaml
説明 このトピックのサンプルコードを使用する場合は、コマンドの ${DATA_PLANE_KUBECONFIG}
をデータプレーンの Kubernetes クラスターの kubeconfig ファイルへのパスに置き換えます。また、${ASM_KUBECONFIG}
を ASM インスタンスの kubeconfig ファイルへのパスに置き換えます。
上記のデプロイが完了したら、Zipkin サーバーがデプロイされているポッドが正しく起動できることを確認します。
ステップ 3:Zipkin サーバーを公開するサービスを作成する
ASM トレースデータを受信するために、istio-system ネームスペースに zipkin という名前のサービスを作成します。
この例では、zipkin-svc-expose-public.yaml ファイルを使用して Zipkin サーバーをインターネットに公開し、トレースデータを簡単に表示できるようにします。
説明 作成されるサービスの名前は zipkin である必要があります。
ビジネス要件に基づいて次のコードを使用して YAML ファイルを作成します。
説明 カスタム YAML ファイルを使用して zipkin サービスをデプロイする場合は、このサービスが istio-system ネームスペースにデプロイされていることを確認してください。
次のコマンドを実行して、データプレーンの Kubernetes クラスターに zipkin サービスをデプロイします。
# Zipkin サーバーを内部ネットワークに公開するために zipkin サービスをデプロイします。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f zipkin-svc.yaml
# Zipkin サーバーをインターネットに公開するために zipkin サービスをデプロイします。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f zipkin-svc-expose-public.yaml
ステップ 4:Bookinfo アプリケーションをデプロイする
次のコマンドを実行して、Bookinfo アプリケーションをデータプレーンの Kubernetes クラスターにデプロイします。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml
展開して bookinfo.yaml ファイルを表示する
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
labels:
account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: docker.io/istio/examples-bookinfo-details-v1:1.16.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
labels:
account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
labels:
app: ratings
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: ratings
version: v1
template:
metadata:
labels:
app: ratings
version: v1
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: docker.io/istio/examples-bookinfo-ratings-v1:1.16.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
labels:
account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v1
labels:
app: reviews
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v1
template:
metadata:
labels:
app: reviews
version: v1
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v1:1.16.2
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v2
labels:
app: reviews
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v2
template:
metadata:
labels:
app: reviews
version: v2
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v2:1.16.2
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v3
labels:
app: reviews
version: v3
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v3
template:
metadata:
labels:
app: reviews
version: v3
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v3:1.16.2
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
labels:
app: productpage
version: v1
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}
---
kubectl クライアントで次のコマンドを実行して、Bookinfo の仮想サービスをデプロイします。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml
展開して virtual-service-all-v1.yaml ファイルを表示する
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
---
kubectl クライアントで次のコマンドを実行して、Bookinfo の宛先ルールをデプロイします。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml
展開して destination-rule-all.yaml ファイルを表示する
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: productpage
spec:
host: productpage
subsets:
- name: v1
labels:
version: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: ratings
spec:
host: ratings
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v2-mysql
labels:
version: v2-mysql
- name: v2-mysql-vm
labels:
version: v2-mysql-vm
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: details
spec:
host: details
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
---
kubectl クライアントで次のコマンドを実行して、Bookinfo のゲートウェイをデプロイします。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml
展開して bookinfo-gateway.yaml ファイルを表示する
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
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
ステップ 5:トレースデータを生成する
次のコマンドを実行して、イングレスゲートウェイの IP アドレスをクエリします。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} get svc -n istio-system|grep ingressgateway|awk -F ' ' '{print $4}'
ブラウザーのアドレスバーに イングレスゲートウェイの IP アドレス/productpage
と入力して、Bookinfo にアクセスします。
ステップ 6:トレースデータを表示する
次のコマンドを実行して、zipkin サービスのアドレスを取得します。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG}get svc -n istio-system|grep zipkin|awk -F ' ' '{print $4}'
ブラウザーのアドレスバーに zipkin サービスの IP アドレス:9411
と入力して、Zipkin コンソールにアクセスします。Zipkin コンソールで、トレースデータを表示できます。