Contents
Istio Ingress Gatewayの導入とクラスターへのデプロイ
Istio Ingress Gatewayは、Kubernetesマイクロサービス環境におけるトラフィック制御基盤として不可欠なコンポーネントです。本セクションでは、既存のIstioコントロールプレーンが動作している前提で、Ingress Gatewayリソースをクラスター内に適切に展開する手順と注意点を解説します。
Istioコントロールプレーンの確認
Istio Ingress Gatewayは、Istioコントロールプレーン(Pilot、Galleyなど)が正常に動作している環境でしか機能しません。導入前の確認作業として、以下のコマンドでステータスを確認します。
|
1 2 |
kubectl get pods -n istio-system | grep -E 'istiod|gateway' |
istiod(Pilot)が起動していることistio-ingressgatewayのPodが正常に実行されているか
重要: Istio Ingress Gatewayは、Istioコントロールプレーンと同一のNamespace(例: istio-system) にデプロイされるのが一般的です。ただし、セキュリティの観点から別のNamespaceに分離する場合も可能ですが、通信制御設定が複雑になるため注意が必要です。
Ingress Gatewayリソースのデプロイ方法
Istio Ingress Gatewayは、HelmチャートまたはYAMLファイルでクラスター内に展開できます。以下に代表的な手順を示します。
Helmチャートによるインストール(例)
-
Istio Helmリポジトリを追加
bash
helm repo add istio https://istio-release.storage.googleapis.com/charts -
Ingress Gatewayのデプロイ
bash
helm install istio-ingressgateway istio/istio-ingressgateway -n istio-system
YAMLファイルによる手動インストール
Istio公式リポジトリ(https://github.com/istio/istio)のsamples/gateway/ディレクトリにあるYAMLを適用します。
|
1 2 |
kubectl apply -f samples/gateway/istio-gateway.yaml -n istio-system |
注意: YAMLファイルはIstioバージョンに依存するため、使用しているクラスタのバージョンと一致させる必要があります。
Gateway/VirtualServiceリソースの基本構成
Istio Ingress Gatewayを効果的に運用するには、GatewayリソースとVirtualServiceリソースの正しい構成が不可欠です。このセクションでは、HTTPベースのトラフィックルーティングを実現するためのYAMLテンプレートと設定例を紹介します。
GatewayリソースのYAML例
Gatewayは外部からのアクセスを受け取るインターフェースとして機能し、TLSやドメインの定義を行います。以下は基本的な構成です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: http-gateway namespace: istio-namespace spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "example.com" |
selectorでIstio Ingress GatewayのPodを指定hostsにルーティング対象ドメインを定義
補足: TLS設定が必要な場合は、
portsセクションにnumber: 443とし、tlsブロックで証明書情報を指定します(後述のTLSセクション参照)。
VirtualServiceリソースのルーティング設定
VirtualServiceは、Gatewayが受け取ったトラフィックをマイクロサービスにルーティングするためのポリシーです。以下はHTTPパスベースのルーティング例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: http-vs namespace: istio-namespace spec: hosts: - "example.com" gateways: - http-gateway http: - route: - destination: host: my-service.default.svc.cluster.local port: number: 80 |
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証明書を使用した例です。
-
Secretリソースを作成(
istio-secretsNamespaceに作成)
bash
kubectl create secret tls example-com-tls --cert=example.com.crt --key=example.com.key -n istio-secrets -
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"
- "example.com"
- port:
補足: 自作証明書を使用する場合、CA認証局が発行した証明書でなければならない点に注意してください。自作証明書ではクライアント側にも信頼設定が必要です。
mTLSセキュリティポリシーの適用
mTLSは、クライアントとサーバー間での双方向認証を実現します。以下はIstioのデフォルト設定を変更する手順です。
-
MeshセキュリティポリシーをConfigMapで定義(例)
yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: istio-system
spec:
mtls:
mode: PERMISSIVE -
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"
- "example.com"
- port:
ポイント: mTLSを有効にした場合、クライアント側(ブラウザやアプリケーション)にも証明書の導入が必要になります。
外部アクセス時のルーティング最適化
Istio Ingress Gatewayは、複数ドメインやサービスを1つのGatewayで管理するための機能を提供します。ここでは、ホストヘッダーによる分離とトラフィック分割のベストプラクティスについて解説します。
Hostヘッダーよるドメイン分離
IstioはHTTPリクエストに含まれるHostヘッダーを使って、どのVirtualServiceが適用されるかを決定します。以下は2つのドメインを1つのGatewayで処理する例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: multi-domain-gateway spec: selector: istio: ingressgateway servers: - port: number: 80 name: http protocol: HTTP hosts: - "example.com" - "another-example.com" |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: example-vs spec: hosts: - "example.com" gateways: - multi-domain-gateway http: - route: - destination: host: service-a.default.svc.cluster.local |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: another-vs spec: hosts: - "another-example.com" gateways: - multi-domain-gateway http: - route: - destination: host: service-b.default.svc.cluster.local |
注意点: リバースプロキシ(Nginxなど)を使用している場合、
Hostヘッダーが適切に書き換えられているかを確認する必要があります。
トラフィック分割のベストプラクティス
トラフィックを特定のサービスやバージョンに分割するには、VirtualServiceのhttp.route.weightパラメータを使用します。以下はA/Bテスト用の設定です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
spec: hosts: - "example.com" gateways: - multi-domain-gateway http: - route: - destination: host: service-a.default.svc.cluster.local weight: 70 - destination: host: service-b.default.svc.cluster.local weight: 30 |
効果: 上記設定では、サービスAに70%、Bに30%のトラフィックが割り当てられます。
設定確認とトラブルシューティング
Istio Ingress Gatewayを正しく動作させるには、設定の適用状態の確認とアクセスログの分析が不可欠です。ここでは具体的なコマンドと手順を紹介します。
istioctlコマンドによるステータス確認
istioctlはIstioの運用ツールであり、GatewayやVirtualServiceの設定状況を確認できます。以下のコマンドで情報を取得してください。
|
1 2 |
istioctl describe gateway http-gateway -n istio-namespace |
- Gatewayが正常にデプロイされているか
- Secretリソースが正しい証明書を参照しているか
をチェック可能です。
アクセスログの分析手順
Istio Ingress Gatewayのアクセスログは、EnvoyプロキシのログとしてKubernetesノード上に出力されます。以下はログ確認手順です。
-
ログを収集するPod名を取得
bash
kubectl get pods -n istio-system | grep ingressgateway -
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クラスタ内のマイクロサービスに対する柔軟なトラフィック制御とセキュリティ強化が可能です。上記の手順に沿って設定を行い、運用環境に合わせたカスタマイズを行いましょう。