Istio

Istio Ingress Gateway のインストール・設定とTLS/mTLS構成ガイド

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

スポンサードリンク

前提条件と環境準備

このセクションでは、Istio Ingress Gateway を本番環境に導入するために最低限必要な Kubernetes クラスタのバージョンや、利用するツール(kubectlhelmistioctl)のインストール手順を確認します。適切なバージョンが揃っていないと、CRD の互換性エラーや API 変更による予期せぬ障害が発生しやすくなるため、最初に環境を整えることが重要です。

Kubernetes クラスタ要件

Kubernetes と Istio のバージョンは 公式でリリース済みの最新安定版 を使用します。2024 年 11 月時点では Istio 1.21.x が最新版であり、Kubernetes v1.26 以降を前提に動作が保証されています。

項目 推奨バージョン
Kubernetes v1.26 – v1.29
istioctl 1.21.x
Helm v3.12 以上
kubectl v1.26 以上

バージョン確認コマンド

kubectlhelm のインストール

公式リリースページからバイナリを取得し、実行権限とパス設定だけで完了します。

Namespace の作成

Istio 本体と Ingress Gateway を別々の名前空間に分離すると、権限管理やリソースの可視化が容易になります。


Istio 本体および Ingress Gateway のインストール

この章では、istioctl と Helm の二つの方法で Istio 本体と Ingress Gateway をデプロイする手順を示します。どちらの方法でも Sidecar 自動注入 を有効化し、アプリケーション Pod に istio-proxy が自動的に付与されるように設定します。

istioctl を使ったインストール手順

istioctl install は公式が提供する最もシンプルなインストールコマンドです。デフォルトプロファイルを利用すれば、Istio コアと Ingress Gateway が自動的に作成されます。

Sidecar 自動注入の有効化

istio-injection=enabled ラベルを付与した名前空間にデプロイされた Pod は、作成時に自動的に istio-proxy コンテナが追加されます。

ラベル付与後の確認方法は以下です。istio-proxy が表示されれば成功です。

Helm chart でのインストールとカスタム values.yaml 設定例

Helm を利用すると、CRD のバージョンや Service の種類などを細かく制御できます。以下は Istio 本体Ingress Gateway を別々のリリースとしてデプロイする構成です。

Helm インストールコマンド

Sidecar 注入の確認(Helm 版)


Gateway と VirtualService の作成と構造解説

Istio のトラフィック制御は GatewayVirtualService という二つの CRD によって実現します。この章では、最新安定版で推奨されている networking.istio.io/v1beta1 をベースに、それぞれの主要項目とサンプル YAML を解説します。

Gateway リソースの定義

以下は Ingress Gateway 用の最小構成です。v1beta1 がデフォルトで有効化されているため、互換性を保ちつつ新機能も利用できます。

  • selector は対象となる Envoy Pod(Ingress Gateway)をラベルで指定します。
  • servers 配列に公開したいポート・プロトコル・ホスト名を記述し、複数設定すれば HTTP と HTTPS を同時に提供できます。

VirtualService リソースの定義

VirtualService は実際のリクエスト振り分けロジックを記述します。以下は /api パスへのリクエストを my-service へ転送する例です。

  • gateways では先ほど作成した Gateway のフルネームを列挙し、どのゲートウェイがこの VirtualService を利用するかを明示します。
  • match / route によって URI パスとバックエンド Service の組み合わせを定義でき、ヘッダーやクエリパラメータでの高度なマッチングも可能です。

トラフィック公開と動作確認

この章では Ingress Gateway を外部に公開し、実際にリクエストが期待通りにルーティングされるかを検証します。LoadBalancer が利用できないオンプレミス環境向けの代替策も併せて紹介します。

Service タイプ選択と外部 IP の取得方法

istio-ingressgateway はデフォルトで LoadBalancer 種類の Service として作成されます。クラウドプロバイダーが自動的に外部 IP を割り当てる場合は次のコマンドで確認できます。

オンプレミス環境向け代替策

方法 説明 主な設定ポイント
NodePort 各ノードの固定ポートを公開し、外部ロードバランサーや DNS でルーティング type: NodePort に変更し、nodePort: を指定(例: 30080)
MetalLB オンプレミスでも LoadBalancer と同等の IP 割り当てが可能なオープンソース実装 MetalLB の ConfigMap に address-pool を設定し、Service は従来どおり LoadBalancer を使用
HostNetwork + DaemonSet Envoy がホストネットワーク上で直接リッスンし、NodePort 不要 Deployment の hostNetwork: truednsPolicy: ClusterFirstWithHostNet を設定(高度な運用が必要)

MetalLB の簡易インストール例:

エンドポイントのテスト例

外部 IP(または NodePort)取得後に、curl で実際にリクエストを投げます。

期待される JSON 応答例:

Istio 状態確認コマンド

  • proxy-status:Envoy の構成同期状態を即座に把握できます。

bash
istioctl proxy-status -n default

  • proxy-config:特定 Pod のリスナーやルーティングテーブルを詳細に表示。

bash
istioctl proxy-config listeners <pod-name> -n default

  • Prometheus メトリクス(導入済みの場合):

bash
kubectl -n istio-system port-forward svc/prometheus 9090:9090 &
curl -s "http://localhost:9090/api/v1/query?query=istio_requests_total{destination_service=\"my-service.default.svc.cluster.local\"}"


TLS/HTTPS と mTLS 設定、設定変更とロールバック

安全な通信を確保するために、Ingress Gateway の TLS 終端とサービス間の相互認証(mTLS)を有効化します。また、設定ミス時の迅速なロールバック手順も併せて紹介します。

TLS 終端用 Secret の作成と Gateway への適用

まずは証明書と秘密鍵を Kubernetes Secret に格納し、Gateway の tls セクションで参照させます。実運用では cert‑manager と連携させることが推奨されます。

次に HTTPS 用サーバー定義を Gateway に追加します(v1beta1 を使用)。

サービス間の mTLS 有効化

Namespace 全体で STRICT モードを適用すると、同一 Namespace 内のすべてのサービス間通信が自動的に暗号化されます。

設定変更の即時反映と安全なロールバック手順

Istio の CRD は kubectl apply によって即座に Envoy に配信されますが、万一不具合が発生した場合は以下のフローで元に戻します。

  1. 変更前 YAML を必ず保存(例: gateway_v1.yaml)。Git で管理すれば履歴が残ります。
  2. 新しい設定を適用

bash
kubectl apply -f gateway_v2.yaml

  1. 問題が判明したら直前のファイルで置き換える

bash
kubectl replace -f gateway_v1.yaml

kubectl rollout undo は Deployment 系リソース専用なので、CRD(Gateway・VirtualService)では replace が安全です。


トラブルシューティングとベストプラクティス

実運用でよく遭遇する障害シナリオを整理し、迅速に原因切り分けできるチェックリストと、安定運用のために推奨されるベストプラクティスをまとめます。

代表的な障害ケースと対処法

障害シナリオ 主な原因 確認・対処手順
Pod が Ready にならない Sidecar 注入失敗、イメージプルエラー、リソース不足 kubectl describe pod <pod> → イベントで istio-proxy の起動ログを確認。必要なら istio-injection=disabled に切り替えて Pod を再作成
Envoy 設定が反映されない Gateway / VirtualService の spec.gateways が不一致、CRD バージョンミスマッチ istioctl proxy-config listeners <pod> -n <ns> でリスナー一覧を確認。対象 Gateway 名が正しいかチェック
HTTPS アクセスで証明書エラー Secret 名の誤記、TLS モード設定ミス、証明書期限切れ kubectl get secret istio-ingressgateway-certs -n ingress-gateway -o yaml でデータが存在するか確認。mode: SIMPLE が正しく設定されていることも併せてチェック
mTLS が有効にならない PeerAuthentication が別 Namespace に限定、mtls.modeDISABLE になっている kubectl get peerauthentication -A で全体を一覧表示し、対象 Namespace の設定が STRICT か確認
LoadBalancer の外部 IP が取得できない クラウドプロバイダーの制限、Service Type 誤設定、MetalLB 未導入 kubectl describe svc istio-ingressgateway -n ingress-gateway → イベントでエラーを確認。オンプレミスなら NodePort または MetalLB に切り替え

運用上のベストプラクティスまとめ

  • Namespace 毎に Sidecar 注入を明示的に管理
  • 必要な Namespace にだけ istio-injection=enabled を付与し、テスト環境やバッチジョブは無効化してリソース消費を抑制。
  • GitOps による YAML 管理
  • 全 CRD(Gateway・VirtualService・PeerAuthentication 等)は Git リポジトリでバージョン管理し、kubectl apply -f 前に CI パイプラインで istioctl verify-install を走らせて構文エラーを防止。
  • Observability の標準化
  • Prometheus と Grafana は Istio デフォルトのダッシュボードを有効化し、istio_requests_total, istio_tcp_sent_bytes_total など主要メトリクスで SLA を監視。
  • TLS 証明書の自動更新
  • cert‑manager と Istio の credentialName を連携させ、証明書有効期限切れによるサービス停止を未然に防止。
  • ロードバランサーの冗長化
  • クラウド環境では複数リージョンに跨った LoadBalancer、オンプレミスでは MetalLB の layer2 モードと外部 HAProxy の組み合わせで可用性を確保。

上記手順とチェックポイントを遵守すれば、Istio Ingress Gateway の導入から本番運用までを安全かつ効率的に進められます。

スポンサードリンク

-Istio