Istio

Istioで実現するVirtualServiceとDestinationRuleによるカナリアリース手順

ⓘ本ページはプロモーションが含まれています

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

Istio の基本概念とアーキテクチャ

Istio は Kubernetes 上で動作するサービスメッシュで、マイクロサービス間の通信を 統一的に制御 しながら可観測性やセキュリティ機能を提供します。データプレーンは Envoy が担い、制御プレーンは istiod(旧 Pilot)が設定配信・サービスディスカバリを行います。本節では各コンポーネントの役割と、Mixer が Telemetry と Policy に分離された現状について整理します。

Envoy – サイドカー型データプレーン

Envoy は各 Pod にサイドカーとして注入され、インバウンド・アウトバウンドすべてのトラフィックをプロキシします。TLS 終端、リクエスト/レスポンスの観測、ヘッダー操作、フェイルオーバーなど、データプレーンに必要な機能はすべて Envoy が実装しています。

istiod(旧 Pilot) – 制御プレーンの中核

istiod は CRD(VirtualService・DestinationRule など)を解析し、XDS API を通じて Envoy にリアルタイムで設定情報を配信します。加えて、Telemetry APIAuthorizationPolicy の評価ロジックも統合され、ポリシーやメトリクスの処理は istiod が担当します。

Telemetry(旧 Mixer) – 分散されたテレメトリ機構

Mixer は 1.5 系まで単体コンポーネントとして提供されましたが、現在は Telemetry 機能が Envoy と istiod に分散 しています。Envoy がローカルでアクセスログやサイドカー統計情報を収集し、istiod が集約・転送先(Prometheus や Stackdriver 等)へプッシュします。そのため、Mixer を別途デプロイする必要はなくなりました。

Istio の現行アーキテクチャは「Envoy + istiod」のみで完結し、旧 Mixer に相当する機能はすでに内部に統合されています。


VirtualService と DestinationRule の概要と構成要素

VirtualService と DestinationRule は Istio が提供する トラフィック制御の宣言的設定 です。本節では両リソースの主要フィールドを解説し、実際に使用する際のベストプラクティスを示します。

VirtualService の主要フィールドとルーティングロジック

VirtualService は「トラフィックはどこへ送るか」を定義します。以下に典型的な構成要素をまとめました。

  • hosts – 対象となる Service 名(FQDN でも可)。
  • http / tcp – プロトコル別に配列で記述し、route, mirror, fault, retry などのサブフィールドを組み合わせます。
  • route.destination.subset – DestinationRule の subset 名を参照し、バージョン単位の振り分けが可能です。
  • weight – 複数の destination がある場合にトラフィック比率(0〜100)で指定します。

DestinationRule と subset によるバージョン管理

DestinationRule は「どのインスタンスを指すか」を決め、subset ごとにラベルセレクタや接続ポリシー(タイムアウト・回路遮断)を付与します。

  • host – 対象 Service 名。
  • subsetsnamelabels の組み合わせでバージョンやロールを定義。
  • trafficPolicy – subset 単位でリトライやタイムアウトなどのポリシーを設定できます。

VirtualService が「どこへ送るか」、DestinationRule が「どのインスタンスに届くか」を明確に分離することで、トラフィックシフトを安全・柔軟に実施できます。


Weight ベースで実現するトラフィックシフト手順

Weight パラメータを段階的に変更しながら新バージョンへ流入させる方法を解説します。ここでは 0 % → 100 % を 5 段階(20 % 刻み)でロールアウトする例を示し、環境依存の sed/yq に代わる汎用的な手順も併せて紹介します。

初期設定と段階的シフトの考え方

まずは v2 の weight を 0 % とした VirtualService を作成し、DestinationRule は一度だけ適用します。その後は kubectl patch(JSONPatch)や istioctl experimental replace で weight を上書きすることで段階的にシフトできます。

ステップ v2 の weight 推奨更新方法
1 0 % kubectl apply -f reviews-vs.yaml(初回)
2 20 % kubectl patch virtualservice reviews-vs --type=json -p='[{"op":"replace","path":"/spec/http/0/route/1/weight","value":20}]'
3 40 % 同上(value を 40 に変更)
4 60 % 同上(value を 60 に変更)
5 80 % 同上(value を 80 に変更)
6 100 % 同上(value を 100 に変更)

ポイント
- kubectl patch は JSONPatch 形式で対象フィールドだけを書き換えるため、YAML 全体を手動で編集する必要がなく、どのシェル環境でも同一のコマンドで実行できます。
- パス /spec/http/0/route/1/weight は「最初の http ルート配列の 2 番目(v2)の weight」を指します。VirtualService の構造が変わった場合は kubectl get virtualservice reviews-vs -o yaml で確認してください。

安全に適用するための検証コマンド

設定変更前に構文エラーや互換性問題をチェックし、障害リスクを低減させます。

検証を通過したら kubectl apply または kubectl patch を実行し、段階的シフトを進めます。


モニタリング・障害検知と自動ロールバック

トラフィックシフト中は エラーレートレイテンシ の変化をリアルタイムで監視し、閾値超過時に即座に weight を 0 % に戻す仕組みが不可欠です。本節では Prometheus/Grafana/Kiali を用いた可視化と、シンプルな自動ロールバックスクリプトの実装例を示します。

Prometheus / Grafana / Kiali で取得できる指標

指標 説明 推奨 PromQL
istio_requests_total リクエスト総数(ステータス別にラベル付) sum(rate(istio_requests_total{destination_service="reviews"}[1m]))
エラー率 5xx 系レスポンスの割合 sum(rate(istio_requests_total{destination_service="reviews",response_code=~"5.."}[1m])) / sum(rate(istio_requests_total{destination_service="reviews"}[1m]))
レイテンシ(95 パーセンタイル) 応答時間の上位 5 % histogram_quantile(0.95, sum(rate(istio_request_duration_seconds_bucket{destination_service="reviews"}[1m])) by (le))
  • Grafana:公式 Istio Service Dashboard をインポートすれば、v2 subset のトラフィック比率・エラー率・レイテンシが一目で把握できます。
  • Kiali:サービスマップ上にルーティング割合を可視化し、クリックで該当 VirtualService へジャンプできるため、障害発生時の原因特定が迅速です。

自動ロールバックの実装例(bash + curl)

以下は Prometheus の HTTP API をポーリングし、閾値を超えたら kubectl patch で weight を 0 % に戻すスクリプトです。CronJob または外部監視エージェントから実行できます。

CronJob 定義例(Kubernetes)

このように Prometheus の指標と kubectl patch を組み合わせるだけで、障害発生時の自動ロールバックが実装できます。


ベストプラクティスと CI/CD パイプラインへの統合

安全なカナリアリリースを継続的に行うためには リトライ・タイムアウト・CircuitBreaker の設定と、GitOps/CI ツールでの自動化が鍵となります。本節では推奨設定例と、Argo CD と Tekton を用いたデプロイパイプラインを紹介します。

リトライ・タイムアウト・CircuitBreaker の推奨設定

フィールド 推奨値(例) 効果
retries.attempts 3 一時的な失敗を自動再試行
retries.perTryTimeout 2s 各リトライの最大待機時間
timeout (HTTP) 5s 全体リクエストの上限
outlierDetection.consecutive5xxErrors 5 5xx エラーが連続したインスタンスを除外
outlierDetection.interval 10s 判定間隔
outlierDetection.baseEjectionTime 30s 除外期間

GitOps と Tekton でカナリアデプロイを自動化

Argo CD(GitOps)

Argo CD がリポジトリの差分を検知すると自動的に kubectl apply を実行します。以下は reviews/ ディレクトリ配下にある VirtualService と DestinationRule を管理する ApplicationSet の例です。

Tekton Pipeline(CI 側)

Tekton のタスクで kubectlyq(または jq)を組み合わせ、段階的に weight を上げるジョブを作成します。以下は「20 % → 40 % → … → 100 %」まで自動シフトするパイプライン例です。

上記の構成により、コード変更 → Git にマージ → Argo CD が自動デプロイ → Tekton が段階的シフトとロールバック監視まで一連のフローが 完全に自動化 されます。


まとめ

  • Istio のコアは Envoy + istiod(Pilot) で構成され、旧 Mixer に相当する機能は Telemetry と Policy がそれぞれ Envoy・istiod に分散しています。
  • VirtualService が「トラフィックの行き先」、DestinationRule が「バックエンドインスタンス」を定義し、weight で段階的にシフトできる点がカナリアリリースの鍵です。
  • kubectl patch(JSONPatch)を用いた 汎用的な weight 更新手順istioctl analyze による事前検証で、環境依存性を排除しつつ安全にロールアウトできます。
  • Prometheus / Grafana / Kiali を活用したリアルタイム指標取得と、閾値超過時の自動ロールバックスクリプトにより、障害時の影響範囲を最小化します。
  • リトライ・タイムアウト・CircuitBreaker のベストプラクティス と、Argo CD/Tekton を組み合わせた GitOps パイプラインで、手作業ミスを防ぎつつ継続的なカナリアデプロイが実現できます。

これらの手順と設定を体系化すれば、Kubernetes 上の Istio 環境でも 安全・高速・自動化 されたトラフィックシフトが可能となり、サービス品質を保ったまま新機能やバージョンアップを本番に展開できるようになります。

スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Istio