Contents
Linkerd v2でのサービスミラーリングとは
Kubernetes環境における「サービスミラーリング」は、既存のサービスにトラフィックをコピーして別のターゲットへ送信する機能です。この技術は、A/Bテストやバージョン比較、ロギング・メトリクスの収集などに活用され、リリース前のリスク検証と運用安定性向上を目的としています。Linkerd v2では、サービスミラーリングをポリシー定義で柔軟に制御できる仕組みが提供されており、KubernetesのDeploymentやServiceの拡張機能として導入可能です。
Kubernetes Deploymentへの導入手順
Linkerd v2でのサービスミラーリングは、CRD(Custom Resource Definition)を用いた設定方法が主流です。ここでは、クラスタにLinkerdをインストールし、ミラーリング機能を有効にする手順を解説します。
Linkerdのインストール
Linkerd v2をKubernetes環境に導入するには、公式リポジトリからHelmチャートを使用します。以下のコマンドで初期設定を行います。
-
Helmリポジトリを追加
bash
helm repo add linkerd https://linkerd.io/charts
helm repo update -
Linkerdのインストール(クラスタにNamespace
linkerdが存在する前提)
bash
helm install linkerd/linkerd --namespace linkerd --set profile=ambient
注意事項:
-linkerdnamespaceが存在しない場合は、以下のコマンドで作成してください。
bash
kubectl create namespace linkerd
- インストール時にエラーが出る場合、RBAC設定やクラスタバージョンとの互換性を確認し、--dry-runオプションで事前検証を行ってください。
ミラーリング機能を有効化する準備
Linkerdはデフォルトでサービスミラーリングを無効にしています。以下のコマンドで、ConfigMapやServiceMonitorなどのリソースを作成し、ミラーリングの基盤となる設定を構築します。
ConfigMapとServiceMonitorの作成手順
- Namespaceスコープの設定ファイル(例:
mirroring-config.yaml)を作成して適用。
|
1 2 3 4 5 6 7 8 |
apiVersion: v1 kind: ConfigMap metadata: name: mirroring-config namespace: linkerd data: mirror-ratio: "0.5" |
- ServiceMonitorリソースの作成
yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: linkerd-metrics
namespace: linkerd
spec:
endpoints:- port: metrics
path: /metrics
selector:
matchLabels:
app: linkerd-proxy
- port: metrics
MirroringポリシーのYAML定義例
サービスミラーリングの動作は、MirroringPolicyリソースで制御されます。以下に代表的なYAMLテンプレートを示します。
トラフィック分割比率の設定方法
トラフィック分割はmirrorRatioパラメータで定義し、0.0〜1.0の範囲で指定可能です。例えば、50%のトラフィックをミラー先へ送信する場合は以下のようになります。
|
1 2 3 4 5 6 7 8 |
apiVersion: linkerd.io/v1alpha2 kind: MirroringPolicy metadata: name: example-mirror-policy namespace: default spec: mirrorRatio: 0.5 |
ターゲットサービスの指定方法
ミラーリング先となるターゲットサービスはtargetRefで指定します。以下は、example-serviceというServiceをミラー先として設定する例です。
|
1 2 3 4 5 |
spec: targetRef: name: example-service namespace: default |
注意事項:
-targetRefに指定するServiceは、Kubernetesクラスタ内に存在し、Linkerdがアクセスできる必要があります。外部サービスや別のクラスタのリソースはサポートされていません。
トラフィック分割の実証テスト手順
ミラーリングポリシーを適用した後、実際にトラフィックが分離されているか確認します。
テスト用ポッドの準備
テストのために、アプリケーションポッドとログ出力ポッドを作成します。以下は簡単なDeployment例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
apiVersion: apps/v1 kind: Deployment metadata: name: test-app spec: replicas: 1 selector: matchLabels: app: test-app template: metadata: labels: app: test-app spec: containers: - name: app image: nginx |
リクエスト分離の検証方法
ポリシーを適用後、以下のようにcurlコマンドやkubectl logsで確認します。
-
ミラーリング先のログチェック
bash
kubectl logs -l app=test-app -n default --tail=50
ミラーされたリクエストは、対象Serviceが処理するため、ログに反映されます。 -
トラフィック比率の確認
ポリシーでmirrorRatio: 0.5を設定すると、50%のリクエストがミラー先へ送信されることをテスト用負荷ツールで検証します。 -
負荷テストツール例:
-
ab(Apache Benchmark):
bash
ab -n 1000 http://test-app.default.svc.cluster.local/ -
wrk:
bash
wrk -t4 -c100 -d10s http://test-app.default.svc.cluster.local/
-
メトリクス監視のベストプラクティス
サービスミラーリングを運用する際には、パフォーマンスや異常検知に向けたメトリクス監視が不可欠です。
Linkerd Dashboardの活用法
Linkerdは組み込みでDashboardを提供しており、以下のように確認できます。
- ミラーリング経路の遅延(Latency)や成功率(Success Rate)をリアルタイムで監視
- 特定のServiceに集約されたリクエスト数をグラフ化
Prometheusとの連携設定
LinkerdはPrometheusと連携し、カスタムメトリクスを収集できます。
ServiceMonitor設定例(最新仕様確認済)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: linkerd-metrics spec: endpoints: - port: metrics path: /metrics selector: matchLabels: app: linkerd-proxy |
確認事項:
Linkerd v2の公式ドキュメントによると、メトリクスポートは9090が標準です。もし誤って指定された場合、Prometheusからの収集に失敗する可能性があります。
実際にクラスタ環境でサービスミラーリングを試してみましょう
本記事で説明した手順に従い、ローカルKubernetes環境(例: minikubeやKind)でサービスミラーリングを検証してください。以下がキックオフの参考情報です。
手順概要とチェックリスト
| 項目 | 内容 |
|---|---|
| 準備 | Docker Desktop for Mac/Windowsにminikubeをインストールし、Linkerdとテスト用アプリケーションをデプロイ |
| 手順 | 「MirroringポリシーのYAML定義例」で示した設定ファイルを使用して、ミラーリングを有効化 |
| 確認方法 | kubectl logsやLinkerd Dashboardでトラフィックが分離されているか検証 |
サービスミラーリングは、Kubernetesにおける安定したリリース戦略の核です。ぜひ実環境で導入し、運用体制を強化してください。