Oracle Cloud Hangout Cafe Season6 #1「Service Mesh がっつり入門!」(2022年9月7日開催)

2023年6月22日(木)
仁井田 拓也
連載第6回の今回は、2022年9月7日に開催された「Oracle Cloud Hangout Cafe Season6 #1『Service Mesh がっつり入門!』」の発表内容に基づいて紹介していきます。

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 Operatorを利用してManifestで柔軟にカスタマイズできます。  

Istioを利用して実現できること

ここからは、Istioを利用して実現できることを見ていきます。今回は、以下の4つの観点で説明します。

  • トラフィック制御(デプロイ戦略)
  • 耐障害性
  • Observability
  • セキュリティ

・トラフィック制御(デプロイ戦略)
トラフィック制御では、以下の要素があります。

  • トラフィックルーティング
    • DestinationRuleで定義したサブセットに対してVirtualServiceによる振り分けを実施
    • HTTPヘッダーや重みづけなどのポリシーによってルーティング
  • トラフィックミラーリング
    • サブセット(ex.v1/v2)に対して、v1に流れてきたトラフィックをv2にミラーリングできる
      • v2へのルーティングは“fire-and-forget”(流しっぱなし)
      • 本番環境で本番トラフィックを利用したテスト目的での利用

・耐障害性
耐障害性では、以下の要素があります。

  • リトライ回数制限、タイムアウト
    • 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が自動的にヘッダー(b3-propagation*10)の付与とスパン(トレース間隔)作成を実施
      • Jaegerなどでトレーシング情報を即時に可視化
      • システム全体のトレースするにはアプリケーション側でHTTPヘッダーの伝播が必須

*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通信の除外設定に便利)
  • エンドユーザ認証/認可
    • 認証
      • RequestAuthenticationを利用し、クレデンシャル(JWT)を発行したサーバに対して検証するようにEnvoyを構成(jwksでの検証)
    • 認可
      • AuthorizationPolicyを利用し、RequestAuthenticationと“rules”フィールドに基づき認可を実施
        • “requestPrincipals”とHTTPメソッド(GET)を許可ルールに指定
          • “requestPrincipals”はJWT Claimの<ISSUE>/<SUBJECT>かSPIFFE ID(後述)のいずれかを利用

【参考】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を理解する手助けとなれば幸いです。

日本オラクル株式会社

Oracle Groundbreaker Advocate
Senior Cloud Solution Engineer

日本オラクル株式会社所属。SIerにて様々なOSSを活用したシステム開発を経験し現職。現在は、SIer時代の知見を活かし、ソリューションアーキテクトとしてクラウドでのアプリケーション開発やクラウドネイティブ技術に関する技術/案件支援に従事。

Community:
Oracle Cloud Hangout Cafe メンバー(#ochacafe)

連載バックナンバー

仮想化/コンテナ技術解説
第6回

Oracle Cloud Hangout Cafe Season6 #1「Service Mesh がっつり入門!」(2022年9月7日開催)

2023/6/22
連載第6回の今回は、2022年9月7日に開催された「Oracle Cloud Hangout Cafe Season6 #1『Service Mesh がっつり入門!』」の発表内容に基づいて紹介していきます。
仮想化/コンテナ技術解説
第5回

Oracle Cloud Hangout Cafe Season5 #5「実験! カオスエンジニアリング」(2022年5月11日開催)

2023/5/18
連載第5回の今回は、2022年5月11日に開催された「Oracle Cloud Hangout Cafe Season5 #5『実験! カオスエンジニアリング』」の発表内容に基づいて紹介していきます。
仮想化/コンテナ技術解説
第4回

Oracle Cloud Hangout Cafe Season5 #3「Kubernetes のセキュリティ」(2022年3月9日開催)

2023/4/18
連載第4回の今回は、2022年3月9日に開催された「Oracle Cloud Hangout Cafe Season5 #3『Kubernetes のセキュリティ』」の発表内容に基づいて紹介していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています