Oracle Cloud Hangout Cafe Season6 #1「Service Mesh がっつり入門!」(2022年9月7日開催)
Istioを構成するカスタムリソース群
ここからは、Istioを構成するカスタムリソース(CRD)を見ていきます。
Istioは大小含めるとかなりの数のカスタムリソースで構成されていますが、ここでは代表的な4つをピックアップして紹介します。ここで登場するカスタムリソースは後述でも登場します。
- Gateway
- MeshへのInbound/Outboundトラフィックを管理
- VirtualService
- DestinationRuleとともにルーティング機能を構成する要素
- Kubernetes標準リソースのServiceに紐付き、Deployment(Pod)のバージョニング、負荷分散ポリシーやリトライ/タイムアウト設定を適用
- DestinationRule
- VirtualServiceとともにルーティング機能を構成する要素
- VirtualServiceの後に適用され、ラベルなどを利用してルーティング先を決定。負荷分散ポリシーやサーキットブレイカーを適用
- ServiceEntry
- Mesh内部でのサービスレジストリを登録
- 主にはMesh内にVMを包含する場合やMesh外のAP/DB、外部APIを定義
- Gateway(Egress)と併用
Istioのインストール構成
Istioはインストール時にプロファイルを指定することでインストール構成を選択できます。指定できるプロファイルには、以下のものがあります。
- default:商用やマルチクラスタ構成のプライマリクラスタ用に構成
- demo:デモアプリケーション用に構成
- minimal:データプレーン(Gatewayなど)はユーザが個別に構成
- empty:全ての構成をユーザが個別に構成
- external:コントロールプレーンを外部化している場合に構成
- preview:Istioのプレビュー機能を試す場合に構成
- ambient(α版):前述したambient meshを構成
Istioを利用して実現できること
ここからは、Istioを利用して実現できることを見ていきます。今回は、以下の4つの観点で説明します。
- トラフィック制御(デプロイ戦略)
- 耐障害性
- Observability
- セキュリティ
・トラフィック制御(デプロイ戦略)
トラフィック制御では、以下の要素があります。
- トラフィックルーティング
- DestinationRuleで定義したサブセットに対してVirtualServiceによる振り分けを実施
- HTTPヘッダーや重みづけなどのポリシーによってルーティング
- トラフィックミラーリング
- サブセット(ex.v1/v2)に対して、v1に流れてきたトラフィックをv2にミラーリングできる
- v2へのルーティングは“fire-and-forget”(流しっぱなし)
- 本番環境で本番トラフィックを利用したテスト目的での利用
- サブセット(ex.v1/v2)に対して、v1に流れてきたトラフィックをv2にミラーリングできる
・耐障害性
耐障害性では、以下の要素があります。
- リトライ回数制限、タイムアウト
- VirtualServiceを利用してリトライ条件*9と上限回数を設定したり、タイムアウトを設定できる
*9:リトライ時の戦略には、Exponential Backoff and Jitterと呼ばれるものがあり、EnvoyFilter(後述)を利用してリトライ時のBackoff(リトライ間隔)を延伸したり、ランダムに時間を加算できる
- コネクションプール
- DestinationRuleを利用して、あらかじめコネクションプールの閾値を定義しておき、その閾値を超過したリクエストはエラーで返却
- 外れ値検出
- DestinationRuleを利用して、外れ値を定義し、閾値を超過したサービスを排除(遮断)できる
- 前述したサーキットブレイカーに相当
- リトライの仕組みの中で“Exponential Backoff and Jitter”パターンを利用している*9
・Observability
ここでは、前述したObservabilityの3要素のうち、メトリクスとトレーシングについて説明します。アクセスログは、サイドカープロキシが標準出力にログを出力するというシンプルな仕組みなので、ここでの説明は割愛します。
- メトリクス
- サイドカープロキシであるEnvoyが様々なメトリクスを自動的にエクスポート
- Prometheus/Grafanaを利用してメトリクスを即時に可視化
- Envoyはメトリクスを15090ポートで公開
- EnvoyFilter(後述)を利用して独自のメトリクスを定義できる
- サイドカープロキシであるEnvoyが様々なメトリクスを自動的にエクスポート
- トレーシング
- サイドカープロキシであるEnvoyが自動的にヘッダー(b3-propagation*10)の付与とスパン(トレース間隔)作成を実施
- Jaegerなどでトレーシング情報を即時に可視化
- システム全体のトレースするにはアプリケーション側でHTTPヘッダーの伝播が必須
- サイドカープロキシであるEnvoyが自動的にヘッダー(b3-propagation*10)の付与とスパン(トレース間隔)作成を実施
*10:“b3”および“x-b3-”で始まるヘッダーの仕様であり、サービス境界を越えたトレースコンテキストの伝播に使用される
・セキュリティ
セキュリティでは、以下の要素があります。
- サービス間認証(mTLS)
- PeerAuthenticationを利用し、プロキシ(Envoy)が注入されているサービス間のトラフィックは自動的にmTLSで通信できる
- 証明書の発行やローテーションは自動で実施
- Mesh内のサービス間ではワークロードIDをもとにmTLSで通信
- ワークロードIDはSPIFFE(後述)が発行するID(
spiffe://<TRUST_DOMAIN>/ns/<NAMESPACE>/sa/<SERVICE_ACCOUNT>
)を利用。実体はService Account(SA)での認証 - ポートレベルで設定が可能(一部ポートのmTLS通信の除外設定に便利)
- ワークロードIDはSPIFFE(後述)が発行するID(
- PeerAuthenticationを利用し、プロキシ(Envoy)が注入されているサービス間のトラフィックは自動的にmTLSで通信できる
- エンドユーザ認証/認可
- 認証
- RequestAuthenticationを利用し、クレデンシャル(JWT)を発行したサーバに対して検証するようにEnvoyを構成(jwksでの検証)
- 認可
- AuthorizationPolicyを利用し、RequestAuthenticationと“rules”フィールドに基づき認可を実施
- “requestPrincipals”とHTTPメソッド(GET)を許可ルールに指定
- “requestPrincipals”はJWT Claimの
<ISSUE>/<SUBJECT>
かSPIFFE ID(後述)のいずれかを利用
- “requestPrincipals”はJWT Claimの
- “requestPrincipals”とHTTPメソッド(GET)を許可ルールに指定
- AuthorizationPolicyを利用し、RequestAuthenticationと“rules”フィールドに基づき認可を実施
- 認証
【参考】SPIFFE(Secure Production Identity Framework For Everyone)
ここで、何度か登場したSPIFFE(Secure Production Identity Framework For Everyone)について補足します。
SPIFFEはCNCF Incubating Projectの1つであり、“A universal identity control plane for distributed systems”というコンセプトで策定されているゼロトラストネットワークに基づくサービス間認証の標準仕様です。分散システム(マイクロサービス)における多様なワークロード(コンテナ/VM/FaaS)や環境(クラウド/オンプレ)に依存することなく、同一インタフェースで利用できます。X.509とJWTをサポートしています。
また、SPIFFEを実装したプロダクトとしては、SPIRE(参照実装)、前述したIstio、HashiCorp Consulなどがあります。詳細はこちらをご確認ください。
【参考】Istioの拡張
最後に、Istioの拡張について少しだけ触れておきます。Istioの拡張には、EnvoyFilterとプラグインの実装の2通りがあります。
EnvoyFilterはカスタムリソース(CRD)を利用します。HttpConnectionManager(HCM)というネットワークフィルターを利用することで、以下のようなことを実現できます。
- HTTPヘッダーやペイロードをL7に基づいてルーティング
- CORS/CSRF対策/外部認証/流入制限/フォールトインジェクション
プラグインの実装は、Luaスクリプト/WebAssembly(Wasm)を利用するか、前述したEnvoyFilterにインラインで実装することで実現できます。これにより、外部サービスの呼び出しやカスタムコードを実行できます。
ここまでIstioを利用して実現できることを見てきましたが、発表当日はこれらを一通りデモンストレーションしています。当日のデモの様子は、動画で見ることができますので、興味がある方はぜひご覧ください。
おわりに
今回は、マイクロサービス運用時の課題とその解決策の1つであるService Meshについて見てきました。Service Meshはデプロイ戦略、耐障害性、Observability、セキュリティとあらゆる場面で活躍するテクノロジーです。
NIST SP 800-204や、最近ではDX白書2023でもService Meshに言及されています。今後の分散システムやマイクロサービスには欠かせないテクノロジーの一つになる可能性も十分あると考えます。
本記事の内容が、読者の皆様がService Meshを理解する手助けとなれば幸いです。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Keycloakと認可プロダクトを利用したマイクロサービスにおける認証認可の実現
- All Things OpenからSolo.ioのBrian Gracely氏にインタビュー。サイドカーレスサービスメッシュとは?
- コンテナをさらに活用しよう! 「マイクロサービス」と「サーバーレス」
- 注目のSPIFFE、その概要とKubernetesへの導入方法
- サービスメッシュのLinkerd 2.9を紹介。EWMA実装のロードバランサー機能とは
- 「KubeCon NA 2022」から、サイドカーレスを実装したサービスメッシュのIstioのセッションを紹介
- サービスメッシュを使ってみよう
- Oracle Cloud Hangout Cafe Season4 #4「Observability 再入門」(2021年9月8日開催)
- KubeCon Europeでサービスメッシュの標準化を目指すSMIを発表。Istioの動向にも注目
- KubeCon Europe 2023から、Linkerdの最新情報とeBPFがサービスメッシュに使えない理由を解説したセッションを紹介