[実践Istio] Egress Gatewayで外部トラフィックのセキュリティを確保する (feat. TLS発信設定)

こんにちは!👋 今日は、Kubernetes環境でIstioを使用する際に、外部サービスへのアウトバウンドトラフィックを安全かつ効率的に管理する方法について、詳しく掘り下げていきたいと思います。

提供されたコードは、Istioの目玉とも言えるEgress Gatewayを活用し、クラスター内部のアプリケーションが外部のYahoo Finance (finance.yahoo.com)にアクセスするシナリオを含んでいます。

しかし、ただアクセスするだけではありません!🤫 アプリケーションは気軽にHTTPでリクエストを送信しますが、クラスターから出る際にはIstioが自動的に安全なHTTPSにアップグレードしてくれるTLS Origination (TLS発信) の設定を扱っています。

この構成がどのように機能し、各YAMLファイルがどのような役割を果たすのか、一つずつ見ていきましょうか?🔍


🎯 目標シナリオ

  1. 私たちのアプリ(Pod)は、外部の世界であるhttp://finance.yahoo.com (ポート80)にリクエストを送信します。
  2. このリクエストはクラスターの外に直接出ず、門番の役割を果たすIstio Egress Gatewayにまず転送されます。
  3. Egress Gatewayは、このHTTPリクエストを受け取り、HTTPS(TLS) で暗号化した後、実際のYahooサーバー(ポート443)に送信します。

この方法により、アプリケーションは証明書管理や暗号化の複雑さなしに、外部と安全に通信できるようになります。素晴らしいでしょう?😎


🧩 コード詳細分析

提供されたYAMLコードは、合計4つのIstioリソースで構成されています。それぞれのパズルのピースがどのように組み合わされるか見ていきましょう。

1️⃣ ServiceEntry: “Yahoo! 君は私の管理対象だ”

最初に登場するのはServiceEntryです。Istioサービスメッシュは、デフォルトでは自身が知らない外部の世界へのトラフィックをブロックしたり、適切に管理できなかったりする可能性があります。

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: yahoo-ext
spec:
  hosts:
  - finance.yahoo.com
  location: MESH_EXTERNAL
  ports:
  - number: 80
    name: http
    protocol: HTTP
  - number: 443
    name: https
    protocol: HTTPS
  resolution: DNS
  • 役割: Istioの内部サービスレジストリに外部サービス(finance.yahoo.com)を登録します。
  • location: MESH_EXTERNAL: このサービスが私たちのメッシュ(クラスター)の外にあることを明示します。🌐
  • ports & resolution: DNS: Yahoo Financeが80(HTTP)と443(HTTPS)ポートを使用し、このアドレスを見つけるためにDNSクエリを使用する必要があることをIstioに伝えます。
  • 💡 要約: 「Istioよ、finance.yahoo.comという外部の友達がいるんだけど、こいつと通信するときは80番と443番ポートを使うから、ちゃんと管理してくれ!」

2️⃣ Gateway: “Egressの門番よ、この門を開けろ”

次はGatewayリソースです。ここで言うGatewayは、クラスターの外に出る専用の出口であるEgress Gateway Podに対する設定を意味します。

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
 name: yahoo-egressgateway
 namespace: default
spec:
 selector:
   istio: egressgateway
 servers:
 - port:
     number: 80
     name: http
     protocol: HTTP
   hosts:
   - finance.yahoo.com
  • 役割: 実際のトラフィックを処理するEgress Gateway (Envoyプロキシ)に、特定のポートを開いて待機するよう指示します。
  • selector: istio: egressgateway: この設定が誰に適用されるかを決めます。ラベルがistio: egressgatewayであるPod (実際のEgress Gatewayインスタンス)がこの設定を適用されます。🎯
  • servers: Egress Gatewayに「Yahoo Finance (finance.yahoo.com)へのトラフィックを処理するために、80番ポート(HTTP) を開いておけ」と命令します。
  • 💡 要約: クラスターの出口(Egress Gateway)に、Yahoo行きの80番トラフィックが通過できる門を大きく開きました。🚪

3️⃣ DestinationRule: “外出するときはHTTPSの服に着替えろ!” (核心 ⭐)

このシナリオで最も重要な部分の一つであるTLS Originationを担当するDestinationRuleです。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: originate-tls-for-yahoo-com
spec:
  host: finance.yahoo.com
  trafficPolicy:
    portLevelSettings:
    - port:
        number: 443
      tls:
        mode: SIMPLE
  • 役割: 目的地(finance.yahoo.com)へトラフィックが出る際に、どのようなポリシーを適用するかを定義します。
  • portLevelSettings -> port: 443: 目的地の443ポートへ向かうトラフィックに対してのみ設定を適用します。
  • tls: mode: SIMPLE: ここが核心です!💥 「443ポートで出る際は、一般的なTLS(HTTPS)暗号化を開始せよ」という意味です。Egress Gatewayはこのルールを見て、HTTPリクエストをHTTPSリクエストにアップグレードします。
  • 💡 要約: 「Yahooの443ポートに接続するときは、必ず安全なHTTPSセキュリティコートを着て出かけなさい!」🔒

4️⃣ VirtualService: “トラフィックのナビゲーション経路”

最後に、最も複雑ですが重要なVirtualServiceです。これはトラフィックがどこから来てどこへ行くべきかを案内するナビゲーションの役割を果たします。ここでは2つの経路を定義します。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: direct-yahoo-through-egress-gateway
spec:
  hosts:
  - finance.yahoo.com
  gateways:
  - yahoo-egressgateway
  - mesh
  http:
  # ... (詳細は下記参照)
  • gateways: [yahoo-egressgateway, mesh]: このルーティングルールが2つの場所に適用されることを意味します。
  1. mesh: クラスター内部のアプリケーションサイドカー。
  2. yahoo-egressgateway: 上記で設定したEgress Gateway。

経路 1: アプリケーション → Egress Gateway (内部移動)

  - name: mesh
    match:
    - port: 80
      gateways:
      - mesh
    route:
    - destination:
        host: istio-egressgateway.istio-system.svc.cluster.local
        port:
          number: 80
  • 説明: メッシュ内部(mesh)のアプリケーションがfinance.yahoo.comの80ポートにリクエストを送信すると、これを傍受します。そして、このトラフィックを実際のYahooではなく、クラスター内部にあるEgress Gatewayサービスの80番ポートに転送します(Redirect)。
  • 💡 要約: 「アプリたちよ、お前たちがYahoo(HTTP)を呼んだら、私が一旦Egress Gatewayに送ってやるよ。」➡️

経路 2: Egress Gateway → 実際のYahooサーバー (外部移動)

  - name: yahoo-egressgateway
    match:
    - port: 80
      gateways:
      - yahoo-egressgateway
    route:
    - destination:
        host: finance.yahoo.com
        port:
          number: 443
  • 説明: トラフィックがyahoo-egressgatewayの80ポートに到着した際に適用されるルールです。ここで、本当の目的地である外部のfinance.yahoo.comに送信しますが、重要なことに目的地のポートを443(HTTPSポート)に変更します。
  • 💡 要約: 「Egress Gatewayよ、80番で入ってきたYahooトラフィックは、実際のYahooアドレスの443番ポートに最終転送せよ!」↗️

🚀 全体トラフィックフロー一目で見る

さて、このすべての設定が合わさって実際に何が起こるのか整理してみましょう。

  1. アプリケーションリクエスト: 内部Podがhttp://finance.yahoo.com (ポート80)を呼び出す。🗣️
  2. サイドカー介入 (VirtualService – 経路 1): Podの隣にあるEnvoyサイドカーがトラフィックを傍受し、istio-egressgatewayサービス(ポート80)に送信。
  3. Egress Gateway到着 (Gateway): Egress Gateway Podが80番ポートを開いて待ち、トラフィックを受信。👂
  4. 外部ルーティング決定 (VirtualService – 経路 2): Egress Gatewayがトラフィックを実際のfinance.yahoo.comの443ポートに送信することを決定。
  5. TLS暗号化 (DestinationRule): 443ポートで出ようとするとDestinationRuleが適用される。「待て!443はTLS(HTTPS)に変換して出なければならない!」とHTTPをHTTPSに暗号化。🔐
  6. 最終脱出: 暗号化されたHTTPSリクエストがインターネットを通じてYahooサーバーに安全に転送される。✈️

✨ まとめ

この構成により、アプリケーションコードを一切修正することなく、外部通信のセキュリティを向上させました。アプリケーションは単純にHTTP通信だけを気にすればよく、複雑な証明書管理やセキュリティ接続はインフラレベル(Istio)で集中管理されるようになったのです。

これこそがサービスメッシュを使用する強力な理由の一つです!👍

ご不明な点がございましたら、いつでもコメントを残してください!



Comments

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です