Istio

Istio Ingress Gatewayの導入とクラスタへのデプロイガイド

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

スポンサードリンク

Istio Ingress Gatewayの導入とクラスターへのデプロイ

Istio Ingress Gatewayは、Kubernetesマイクロサービス環境におけるトラフィック制御基盤として不可欠なコンポーネントです。本セクションでは、既存のIstioコントロールプレーンが動作している前提で、Ingress Gatewayリソースをクラスター内に適切に展開する手順と注意点を解説します。

Istioコントロールプレーンの確認

Istio Ingress Gatewayは、Istioコントロールプレーン(Pilot、Galleyなど)が正常に動作している環境でしか機能しません。導入前の確認作業として、以下のコマンドでステータスを確認します。

  • istiod(Pilot)が起動していること
  • istio-ingressgatewayのPodが正常に実行されているか

重要: Istio Ingress Gatewayは、Istioコントロールプレーンと同一のNamespace(例: istio-system) にデプロイされるのが一般的です。ただし、セキュリティの観点から別のNamespaceに分離する場合も可能ですが、通信制御設定が複雑になるため注意が必要です。

Ingress Gatewayリソースのデプロイ方法

Istio Ingress Gatewayは、HelmチャートまたはYAMLファイルでクラスター内に展開できます。以下に代表的な手順を示します。

Helmチャートによるインストール(例)

  1. Istio Helmリポジトリを追加
    bash
    helm repo add istio https://istio-release.storage.googleapis.com/charts

  2. Ingress Gatewayのデプロイ
    bash
    helm install istio-ingressgateway istio/istio-ingressgateway -n istio-system

YAMLファイルによる手動インストール

Istio公式リポジトリ(https://github.com/istio/istio)のsamples/gateway/ディレクトリにあるYAMLを適用します。

注意: YAMLファイルはIstioバージョンに依存するため、使用しているクラスタのバージョンと一致させる必要があります。


Gateway/VirtualServiceリソースの基本構成

Istio Ingress Gatewayを効果的に運用するには、GatewayリソースVirtualServiceリソースの正しい構成が不可欠です。このセクションでは、HTTPベースのトラフィックルーティングを実現するためのYAMLテンプレートと設定例を紹介します。

GatewayリソースのYAML例

Gatewayは外部からのアクセスを受け取るインターフェースとして機能し、TLSやドメインの定義を行います。以下は基本的な構成です。

  • selectorでIstio Ingress GatewayのPodを指定
  • hostsにルーティング対象ドメインを定義

補足: TLS設定が必要な場合は、portsセクションにnumber: 443とし、tlsブロックで証明書情報を指定します(後述のTLSセクション参照)。

VirtualServiceリソースのルーティング設定

VirtualServiceは、Gatewayが受け取ったトラフィックをマイクロサービスにルーティングするためのポリシーです。以下はHTTPパスベースのルーティング例です。

  • hostsでGatewayのhostsと一致させる
  • gatewaysに適用するGateway名を記載(例: http-gateway

実践ポイント: リバースプロキシ(Nginxなど)を使用している場合は、Hostヘッダーが正しく伝搬することを確認してください。


TLS証明書のインポートとmTLS構成

セキュリティ強化のためにIstio Ingress GatewayではTLS証明書の導入mTLS(mutual TLS)の設定が必要です。以下に具体的な手順を解説します。

証明書ファイルのクラスター内配布

Istioでは、証明書ファイルをKubernetes Secretリソースとして登録し、Gatewayで参照する必要があります。以下はLet's Encrypt証明書を使用した例です。

  1. Secretリソースを作成(istio-secretsNamespaceに作成)
    bash
    kubectl create secret tls example-com-tls --cert=example.com.crt --key=example.com.key -n istio-secrets

  2. GatewayリソースでSecretを参照
    yaml
    spec:
    servers:

    • port:
      number: 443
      name: https
      protocol: HTTPS
      tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
      hosts:

      • "example.com"

補足: 自作証明書を使用する場合、CA認証局が発行した証明書でなければならない点に注意してください。自作証明書ではクライアント側にも信頼設定が必要です。

mTLSセキュリティポリシーの適用

mTLSは、クライアントとサーバー間での双方向認証を実現します。以下はIstioのデフォルト設定を変更する手順です。

  1. MeshセキュリティポリシーをConfigMapで定義(例)
    yaml
    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
    name: default
    namespace: istio-system
    spec:
    mtls:
    mode: PERMISSIVE

  2. GatewayでmTLSを有効化(例)
    yaml
    spec:
    servers:

    • port:
      number: 443
      name: https
      protocol: HTTPS
      tls:
      mode: MUTUAL
      clientCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
      hosts:

      • "example.com"

ポイント: mTLSを有効にした場合、クライアント側(ブラウザやアプリケーション)にも証明書の導入が必要になります。


外部アクセス時のルーティング最適化

Istio Ingress Gatewayは、複数ドメインやサービスを1つのGatewayで管理するための機能を提供します。ここでは、ホストヘッダーによる分離とトラフィック分割のベストプラクティスについて解説します。

Hostヘッダーよるドメイン分離

IstioはHTTPリクエストに含まれるHostヘッダーを使って、どのVirtualServiceが適用されるかを決定します。以下は2つのドメインを1つのGatewayで処理する例です。

注意点: リバースプロキシ(Nginxなど)を使用している場合、Hostヘッダーが適切に書き換えられているかを確認する必要があります。

トラフィック分割のベストプラクティス

トラフィックを特定のサービスやバージョンに分割するには、VirtualServiceのhttp.route.weightパラメータを使用します。以下はA/Bテスト用の設定です。

効果: 上記設定では、サービスAに70%、Bに30%のトラフィックが割り当てられます。


設定確認とトラブルシューティング

Istio Ingress Gatewayを正しく動作させるには、設定の適用状態の確認アクセスログの分析が不可欠です。ここでは具体的なコマンドと手順を紹介します。

istioctlコマンドによるステータス確認

istioctlはIstioの運用ツールであり、GatewayやVirtualServiceの設定状況を確認できます。以下のコマンドで情報を取得してください。

  • Gatewayが正常にデプロイされているか
  • Secretリソースが正しい証明書を参照しているか
    をチェック可能です。

アクセスログの分析手順

Istio Ingress Gatewayのアクセスログは、EnvoyプロキシのログとしてKubernetesノード上に出力されます。以下はログ確認手順です。

  1. ログを収集するPod名を取得
    bash
    kubectl get pods -n istio-system | grep ingressgateway

  2. Envoyプロキシのログを表示(例)
    bash
    kubectl logs [pod-name] -n istio-system --tail=50 | grep "HTTP"

よくあるエラー例:

  • 404 Not Found: VirtualServiceのhostsとGatewayの設定が不一致
  • 503 Service Unavailable: サービスPodが起動していない、またはリソース制限が発生

記事の要点まとめ

  • Istio Ingress GatewayはIstioコントロールプレーンと連携してトラフィック制御を行う
  • Gatewayリソースで外部アクセスを受け取り、VirtualServiceでサービスへのルーティングを定義する
  • TLS証明書はKubernetes Secretに登録し、mTLSを有効化してセキュリティ強化
  • Hostヘッダーやweightパラメータを使って複数ドメインやトラフィックの分割を実現可能
  • istioctl describeやEnvoyログで設定状態とトラブルシューティングを行う

Istio Ingress Gatewayを導入することで、Kubernetesクラスタ内のマイクロサービスに対する柔軟なトラフィック制御セキュリティ強化が可能です。上記の手順に沿って設定を行い、運用環境に合わせたカスタマイズを行いましょう。

スポンサードリンク

-Istio