LabHub

ブログ

Kubernetes Istio Ambientメッシュサイドカーレスガイド

한국어English日本語

Kubernetes Istio Ambient Mesh

はじめに

サービスメッシュ(Service Mesh)は、マイクロサービスアーキテクチャにおいてサービス間の通信を透過的に管理する中核的なインフラストラクチャレイヤーです。Istioはこの分野で最も広く使われているオープンソースプロジェクトですが、従来のサイドカープロキシモデルは、運用の複雑さとリソースオーバーヘッドという根本的な課題を抱えていました。

すべてのPodにEnvoyサイドカーを注入する方式は、Pod当たり50〜100MBのメモリオーバーヘッド、2〜5秒の起動遅延、サイドカーのアップグレード時にワークロード全体のローリングリスタートが必要になるなど、無視できないコストを伴います。数千個のPodを運用する大規模クラスタでは、サイドカー自体が相当なインフラコストになります。

Istio Ambient Meshはこの問題を根本から解決します。サイドカーを完全に排除し、ノードレベルの共有プロキシ(ztunnel)と選択的なL7プロキシ(waypoint proxy)という2層アーキテクチャを導入することで、メモリ使用量90%以上の削減、CPU使用量50%以上の削減を達成します。Istio 1.22でBetaに到達して以降、プロダクション環境での採用が急速に増えています。

本記事では、Ambient Meshのアーキテクチャ原理からインストール、トラフィックポリシー、オブザーバビリティ、サイドカーからの移行戦略、そしてプロダクション運用で遭遇する障害事例と復旧手順まで、実践中心に解説します。

Istio Ambient Meshのアーキテクチャを理解する

2層データプレーン

Ambient Meshの中核となる設計思想は 関心の分離(separation of concerns)です。従来のサイドカーモデルでは1つのEnvoyプロキシがL4からL7まですべての機能を処理していましたが、Ambient Meshはこれを2つの明確なレイヤーに分離します。

+------------------------------------------------------------------+
|                    Istio Ambient Mesh アーキテクチャ                |
+------------------------------------------------------------------+
|                                                                    |
|  [Service A Pod]    [Service B Pod]    [Service C Pod]             |
|       |                   |                   |                    |
|       v                   v                   v                    |
|  +----------------------------------------------------------+     |
|  |              ztunnel (DaemonSet, 各ノード)                 |     |
|  |  - mTLS トンネリング (HBONE)                              |     |
|  |  - L4 認証 / 認可                                         |     |
|  |  - L4 テレメトリ                                          |     |
|  |  - TCP 接続管理                                           |     |
|  +----------------------------------------------------------+     |
|       |                                                            |
|       | HBONE (HTTP CONNECT ベースのトンネリング)                  |
|       v                                                            |
|  +----------------------------------------------------------+     |
|  |         Waypoint Proxy (任意、ネームスペース/SA単位)         |     |
|  |  - HTTP ルーティング                                      |     |
|  |  - L7 認証 / 認可ポリシー                                 |     |
|  |  - L7 テレメトリ                                          |     |
|  |  - トラフィックミラーリング、カナリアデプロイ               |     |
|  |  - ヘッダーベースのルーティング                            |     |
|  +----------------------------------------------------------+     |
|       |                                                            |
|       | HBONE                                                      |
|       v                                                            |
|  +----------------------------------------------------------+     |
|  |              ztunnel (宛先ノード)                           |     |
|  +----------------------------------------------------------+     |
|       |                                                            |
|       v                                                            |
|  [Destination Pod]                                                 |
|                                                                    |
+------------------------------------------------------------------+

L4 Secure Overlay (ztunnel): すべてのメッシュトラフィックに対してデフォルトで有効になります。mTLS暗号化、L4アクセス制御、TCPレベルのテレメトリを提供します。極めて軽量なRustベースのプロキシとして実装されています。

L7 Processing (Waypoint Proxy): HTTPルーティング、ヘッダーベースのポリシー、gRPCメトリクスの収集など、L7機能が必要な場合にのみ選択的にデプロイされます。標準のEnvoyプロキシを使用します。

この設計により、L7機能を必要としないサービス(全サービスのかなりの割合)はztunnelだけでメッシュのセキュリティとオブザーバビリティを十分に確保でき、L7プロキシのコストを支払わずに済みます。

トラフィックフローの詳細

Ambient Meshでトラフィックが処理される過程を段階的に見ていきます。

L4のみのフロー (Waypointなし):
  Pod A ---> ztunnel(ノード1) ===HBONE===> ztunnel(ノード2) ---> Pod B

L7処理が必要なフロー:
  Pod A ---> ztunnel(ノード1) ===HBONE===> Waypoint Proxy ===HBONE===> ztunnel(ノード2) ---> Pod B
  1. 送信元Podから出ていくトラフィックを、同じノードのztunnelが透過的にインターセプトします
  2. ztunnelはHBONE(HTTP CONNECTベース)プロトコルでトラフィックを暗号化してトンネリングします
  3. L7ポリシーが設定された宛先であれば、まずwaypoint proxyへ転送します
  4. waypoint proxyでL7ポリシー(ルーティング、認可など)を適用したうえで、宛先ノードのztunnelへ転送します
  5. 宛先ノードのztunnelが復号して宛先Podへ転送します

ztunnel: L4処理レイヤー

ztunnelとは

ztunnel(Zero Trust Tunnel)は、Ambient Meshの基盤レイヤーを構成する軽量プロキシです。各ノードにDaemonSetとしてデプロイされ、そのノードのすべてのワークロードトラフィックを処理します。

主な特性:

ztunnelの機能詳細

# ztunnelが提供する機能の範囲
ztunnel_capabilities:
  security:
    - mTLSの自動暗号化/復号
    - SPIFFEベースのワークロードID発行
    - L4 AuthorizationPolicyの適用
  networking:
    - TCP接続のプロキシ
    - HBONEトンネリング
    - ロードバランシング (L4)
  observability:
    - TCP接続メトリクス (バイト、接続数、継続時間)
    - L4アクセスログ
    - Prometheusメトリクスの公開
  not_supported:
    - HTTPルーティング
    - ヘッダーベースのポリシー
    - gRPCプロトコルのパース
    - トラフィックのミラーリング/分割

ztunnelのリソースプロファイル

ztunnelはサイドカーEnvoyとは比較にならないほど軽量です。一般的なプロダクション環境でのリソース使用量を比較すると、次のようになります。

項目Envoyサイドカー (Pod当たり)ztunnel (ノード当たり)
メモリ基本50〜100MB20〜40MB
CPU基本10〜50m10〜30m
100個Podクラスタの総コスト5〜10GBメモリ60〜120MB (3ノード基準)
バイナリサイズ約40MB約10MB

ztunnelの状態確認

# ztunnel DaemonSetの状態確認
kubectl get daemonset -n istio-system ztunnel

# ztunnel Podのログ確認
kubectl logs -n istio-system -l app=ztunnel --tail=50

# ztunnelプロキシの状態確認 (特定ノード)
kubectl exec -n istio-system $(kubectl get pod -n istio-system -l app=ztunnel --field-selector spec.nodeName=worker-1 -o jsonpath='{.items[0].metadata.name}') -- curl -s localhost:15000/config_dump

# ztunnelが管理するワークロード一覧の確認
kubectl exec -n istio-system $(kubectl get pod -n istio-system -l app=ztunnel -o jsonpath='{.items[0].metadata.name}') -- curl -s localhost:15020/debug/workloadz

Waypoint Proxy: L7処理レイヤー

Waypoint Proxyの役割

Waypoint Proxyは、L7レベルのトラフィック管理が必要な場合にのみデプロイするオプションのコンポーネントです。標準のEnvoyプロキシエンジンを使用し、ネームスペースまたはサービスアカウント単位でデプロイされます。

ztunnelとの主な違いは次のとおりです。

Waypoint Proxyのデプロイ

# ネームスペースにwaypoint proxyをデプロイ
istioctl waypoint apply -n my-namespace

# 特定のサービスアカウント用のwaypointをデプロイ
istioctl waypoint apply -n my-namespace --name sa-waypoint --for service

# waypoint proxyの状態確認
kubectl get gateway -n my-namespace

Waypoint ProxyはKubernetes Gateway APIのGatewayリソースとして管理されます。

# waypoint proxy Gatewayリソースの例
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: my-namespace-waypoint
  namespace: my-namespace
  labels:
    istio.io/waypoint-for: service
spec:
  gatewayClassName: istio-waypoint
  listeners:
    - name: mesh
      port: 15008
      protocol: HBONE

Waypoint Proxyのスケーリング

プロダクション環境では、waypoint proxyのリソースとレプリカ数を適切に調整する必要があります。

# waypoint proxyに対するHPA設定
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-namespace-waypoint
  namespace: my-namespace
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-namespace-waypoint
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80

SidecarとAmbientの比較

2つのモードをさまざまな観点から比較します。同じクラスタでサイドカーモードとambientモードをネームスペース単位で混在させることはできますが、同じネームスペースに2つのモードを同時に適用してはいけません。

比較項目サイドカーモードAmbientモード
プロキシ配置Pod当たりEnvoy 1個ノード当たりztunnel + 選択的なwaypoint
メモリオーバーヘッドPod当たり50〜100MBノード当たり20〜40MB (ztunnel)
CPUオーバーヘッドPod当たり10〜50mノード当たり10〜30m (ztunnel)
100 Podの総コスト5〜10GBメモリ60〜120MB (3ノード基準)
ネットワーク遅延送信/受信で各1ホップ追加L4: 同程度、L7: waypointの追加ホップ
Pod起動への影響2〜5秒の遅延 (サイドカー初期化)影響なし
メッシュへの追加方法Podの再起動が必要 (サイドカー注入)ネームスペースのラベル追加のみ
メッシュからの除外方法Podの再起動が必要ラベルの削除 (再起動不要)
L7ポリシーの適用すべてのトラフィックにデフォルト適用waypointのデプロイ後にのみ適用
ワークロードの分離Pod単位で完全に分離ノード単位で共有 (ztunnel)
EnvoyFilterのサポート完全サポート限定的 (waypointでのみ可能)
マルチクラスタ完全サポート改善中
成熟度GA (プロダクションで安定)Beta (v1.22+、プロダクション推奨)
アップグレード方式Podのローリングリスタートが必要ztunnel DaemonSetのローリングアップデート

どちらのモードを選ぶべきか

Ambientモードが適しているケース:

サイドカーモードが適しているケース:

インストールと構成

事前要件

# Kubernetesクラスタのバージョン確認 (1.27+ 推奨)
kubectl version --short

# istioctlのインストール (最新バージョン)
curl -L https://istio.io/downloadIstio | sh -
cd istio-*
export PATH=$PWD/bin:$PATH

# istioctlのバージョン確認
istioctl version

AmbientプロファイルでIstioをインストール

# ambientプロファイルでIstioをインストール
istioctl install --set profile=ambient --skip-confirmation

# インストールの確認
kubectl get pods -n istio-system

# 想定される出力:
# NAME                      READY   STATUS    RESTARTS   AGE
# istiod-xxxx               1/1     Running   0          2m
# ztunnel-xxxxx             1/1     Running   0          2m
# ztunnel-yyyyy             1/1     Running   0          2m
# ztunnel-zzzzz             1/1     Running   0          2m
# istio-cni-node-xxxxx      1/1     Running   0          2m
# istio-cni-node-yyyyy      1/1     Running   0          2m
# istio-cni-node-zzzzz      1/1     Running   0          2m

ambientプロファイルは次のコンポーネントをインストールします:

ネームスペースをメッシュに追加

# ネームスペースをambientメッシュに追加 (Podの再起動は不要!)
kubectl label namespace my-app istio.io/dataplane-mode=ambient

# ラベルの確認
kubectl get namespace my-app --show-labels

# 特定のPodだけをメッシュから除外
kubectl label pod my-pod -n my-app istio.io/dataplane-mode=none

# メッシュからネームスペースを除外 (Podの再起動は不要!)
kubectl label namespace my-app istio.io/dataplane-mode-

注意事項: 1つのネームスペースに、サイドカーモード(istio-injection=enabled)とambientモード(istio.io/dataplane-mode=ambient)のラベルを同時に適用してはいけません。

Helmを使ったインストール

プロダクション環境では、Helmを使ってきめ細かく設定を管理することが推奨されます。

# Istio Helmリポジトリの追加
helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update

# istio-base (CRDs) のインストール
helm install istio-base istio/base -n istio-system --create-namespace

# istiodのインストール (ambientプロファイル)
helm install istiod istio/istiod -n istio-system \
  --set profile=ambient \
  --set pilot.resources.requests.memory=256Mi \
  --set pilot.resources.requests.cpu=200m

# ztunnelのインストール
helm install ztunnel istio/ztunnel -n istio-system \
  --set resources.requests.memory=64Mi \
  --set resources.requests.cpu=50m

# istio-cniのインストール
helm install istio-cni istio/cni -n istio-system \
  --set ambient.enabled=true

トラフィックポリシーの構成

L4 AuthorizationPolicy

ztunnelで処理されるL4レベルのアクセス制御ポリシーです。Waypoint proxyがなくても動作します。

# L4 AuthorizationPolicy: 特定のサービスにだけアクセスを許可
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: my-app
spec:
  targetRefs:
    - kind: Service
      group: ''
      name: backend
  action: ALLOW
  rules:
    - from:
        - source:
            principals:
              - 'cluster.local/ns/my-app/sa/frontend'
      to:
        - operation:
            ports: ['8080']
---
# L4のデフォルト拒否ポリシー
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: deny-all
  namespace: my-app
spec:
  targetRefs:
    - kind: Service
      group: ''
      name: backend
  action: DENY
  rules: []

L7 AuthorizationPolicy (Waypointが必要)

HTTPパスやメソッドに基づくきめ細かいアクセス制御は、waypoint proxyをデプロイした後に利用できます。

# まずwaypoint proxyをデプロイ
# istioctl waypoint apply -n my-app

# L7 AuthorizationPolicy: HTTPパスに基づく制御
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: api-access-control
  namespace: my-app
spec:
  targetRefs:
    - kind: Service
      group: ''
      name: api-server
  action: ALLOW
  rules:
    - from:
        - source:
            principals:
              - 'cluster.local/ns/my-app/sa/web-frontend'
      to:
        - operation:
            methods: ['GET']
            paths: ['/api/v1/products/*']
    - from:
        - source:
            principals:
              - 'cluster.local/ns/my-app/sa/admin-service'
      to:
        - operation:
            methods: ['GET', 'POST', 'PUT', 'DELETE']
            paths: ['/api/v1/*']

VirtualServiceを活用したトラフィック分割

# カナリアデプロイのためのトラフィック分割 (Waypointが必要)
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: reviews-canary
  namespace: my-app
spec:
  hosts:
    - reviews
  http:
    - match:
        - headers:
            x-canary:
              exact: 'true'
      route:
        - destination:
            host: reviews
            subset: v2
          weight: 100
    - route:
        - destination:
            host: reviews
            subset: v1
          weight: 90
        - destination:
            host: reviews
            subset: v2
          weight: 10
---
apiVersion: networking.istio.io/v1
kind: DestinationRule
metadata:
  name: reviews-dr
  namespace: my-app
spec:
  host: reviews
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

PeerAuthenticationの設定

# Strict mTLSの適用 (ambientモードではデフォルトで有効)
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: strict-mtls
  namespace: my-app
spec:
  mtls:
    mode: STRICT

オブザーバビリティの統合

Prometheusメトリクスの収集

Ambient Meshは、ztunnelとwaypoint proxyの両方がPrometheusメトリクスを公開します。

# Prometheus ServiceMonitor for ztunnel
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: ztunnel-monitor
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: ztunnel
  endpoints:
    - port: http-monitoring
      path: /metrics
      interval: 15s
---
# Prometheus ServiceMonitor for waypoint proxies
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: waypoint-monitor
  namespace: my-app
spec:
  selector:
    matchLabels:
      gateway.istio.io/managed: istio.io-mesh-controller
  endpoints:
    - port: http-envoy-prom
      path: /stats/prometheus
      interval: 15s

主要メトリクスのモニタリング

# ztunnelメトリクスの確認
kubectl exec -n istio-system $(kubectl get pod -n istio-system -l app=ztunnel -o jsonpath='{.items[0].metadata.name}') -- curl -s localhost:15020/metrics | grep istio_tcp

# 主要なztunnelメトリクス:
# istio_tcp_connections_opened_total     - オープンしたTCP接続数
# istio_tcp_connections_closed_total     - クローズしたTCP接続数
# istio_tcp_sent_bytes_total             - 送信バイト
# istio_tcp_received_bytes_total         - 受信バイト
# istio_tcp_connection_duration_seconds  - 接続の継続時間

# waypoint proxyメトリクスの確認 (L7メトリクスを含む)
kubectl exec -n my-app $(kubectl get pod -n my-app -l gateway.istio.io/managed=istio.io-mesh-controller -o jsonpath='{.items[0].metadata.name}') -- curl -s localhost:15090/stats/prometheus | grep istio_request

# 主要なwaypointメトリクス:
# istio_requests_total                   - 総リクエスト数 (L7)
# istio_request_duration_milliseconds    - リクエスト遅延 (L7)
# istio_request_bytes                    - リクエストサイズ
# istio_response_bytes                   - レスポンスサイズ

Kialiの統合

KialiはAmbient Meshに対応しており、ztunnelとwaypoint proxyを含むサービスグラフを可視化できます。

# Kialiのインストール (Ambient対応を含む)
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/kiali.yaml

# Kialiダッシュボードへのアクセス
istioctl dashboard kiali

Grafanaダッシュボード

# Grafana + Prometheusスタックのインストール
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/prometheus.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/grafana.yaml

# Grafanaダッシュボードへのアクセス
istioctl dashboard grafana

Ambient Mesh用のGrafanaダッシュボードで確認すべき主要パネル:

移行戦略

サイドカーからAmbientモードへの移行

既存のIstioサイドカーモードからAmbientモードへの移行は、段階的に実施する必要があります。2つのモードは同じクラスタで共存できるため、ネームスペース単位で段階的に移行できます。

ステップ1: 事前準備

# 現在のIstioバージョンがambientをサポートしているか確認 (1.22+)
istioctl version

# ambientプロファイルのコンポーネントをインストール (既存のistiodは維持)
istioctl install --set profile=ambient --skip-confirmation

# ztunnelとistio-cniが正常に動作しているか確認
kubectl get daemonset -n istio-system ztunnel
kubectl get daemonset -n istio-system istio-cni-node

ステップ2: 重要度の低いネームスペースから移行

# テスト用ネームスペースでまず検証
# 1. サイドカーラベルの削除
kubectl label namespace test-app istio-injection-

# 2. ambientラベルの追加
kubectl label namespace test-app istio.io/dataplane-mode=ambient

# 3. 既存のサイドカーを削除するためPodを再起動
kubectl rollout restart deployment -n test-app

# 4. サイドカーが削除されztunnel経由で通信しているか確認
kubectl get pods -n test-app
# すべてのPodが1/1 (サイドカーなし) と表示されるはず

# 5. mTLS通信の確認
istioctl proxy-status

ステップ3: L7機能が必要なネームスペースにWaypointをデプロイ

# これまでL7ポリシーを使っていたネームスペースにwaypointをデプロイ
istioctl waypoint apply -n test-app

# VirtualService、AuthorizationPolicyなど既存のL7ポリシーが
# waypoint経由で正常に動作するか確認
kubectl get gateway -n test-app

ステップ4: 検証後にプロダクションのネームスペースを移行

# プロダクションのネームスペースを移行 (同じ手順)
kubectl label namespace production istio-injection-
kubectl label namespace production istio.io/dataplane-mode=ambient
kubectl rollout restart deployment -n production

# waypointが必要な場合はデプロイ
istioctl waypoint apply -n production

移行時の注意事項

HBONE互換性: サイドカーモードのPodがambientモードのPodと通信するには、サイドカーに ENABLE_HBONE フラグが設定されている必要があります。移行前にサイドカーをHBONE対応バージョンに更新し、再起動する必要があります。

Waypointの認識: サイドカーはwaypoint proxyを認識しません。サイドカーモードのクライアントがambientモードのサーバーへリクエストを送ると、waypointを迂回することがあります。可能な限り、同じ通信経路上のサービスを同じモードへ移行することが推奨されます。

CNI互換性: CiliumをCNIとして使う場合、Ciliumはデフォルトで他のCNIプラグインを削除しようとします。cni.exclusive=false を設定してこれを防ぐ必要があります。

トラブルシューティング

よくある問題と解決方法

問題1: Pod間の通信失敗(mTLSハンドシェイクエラー)

# 症状: Pod間の接続が拒否される、またはタイムアウトする
# 原因: ztunnelが正常に動作していない、または証明書の問題

# 診断1: ztunnelの状態確認
kubectl get pods -n istio-system -l app=ztunnel
kubectl logs -n istio-system -l app=ztunnel --tail=100 | grep -i error

# 診断2: 証明書の状態確認
istioctl proxy-status

# 診断3: ワークロードIDの確認
kubectl exec -n istio-system $(kubectl get pod -n istio-system -l app=ztunnel -o jsonpath='{.items[0].metadata.name}') -- curl -s localhost:15020/debug/workloadz

# 解決: ztunnelの再起動
kubectl rollout restart daemonset ztunnel -n istio-system

問題2: L7ポリシーが適用されない

# 症状: AuthorizationPolicyのHTTPパス/メソッドに基づくルールが無視される
# 原因: waypoint proxyがデプロイされていない、または正しく接続されていない

# 診断1: waypoint proxyの有無を確認
kubectl get gateway -n my-app
istioctl waypoint list -n my-app

# 診断2: waypoint proxy Podの状態確認
kubectl get pods -n my-app -l gateway.istio.io/managed=istio.io-mesh-controller

# 診断3: waypoint proxyのログ確認
kubectl logs -n my-app -l gateway.istio.io/managed=istio.io-mesh-controller --tail=100

# 解決: waypointの再デプロイ
istioctl waypoint delete -n my-app
istioctl waypoint apply -n my-app

問題3: CNIプラグインの競合

# 症状: ztunnelがトラフィックをインターセプトできず、Podがメッシュ外のように動作する
# 原因: istio-cniと既存のCNIプラグインの競合

# 診断: istio-cniのログ確認
kubectl logs -n istio-system -l k8s-app=istio-cni-node --tail=100

# 解決 (Cilium環境):
# Ciliumのexclusive CNI設定を無効化
helm upgrade cilium cilium/cilium -n kube-system \
  --set cni.exclusive=false

# istio-cniの再起動
kubectl rollout restart daemonset istio-cni-node -n istio-system

問題4: メッシュ外部のサービスとの通信問題

# 症状: ambientメッシュ内のPodがメッシュ外部のサービスにアクセスできない
# 原因: ztunnelが外部トラフィックもインターセプトしてHBONEトンネリングを試みる

# 診断: ztunnelのログで外部宛先に関するエラーを確認
kubectl logs -n istio-system -l app=ztunnel --tail=200 | grep "external"

# 解決: ServiceEntryで外部サービスを明示的に登録
cat <<EOF | kubectl apply -f -
apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-api
  namespace: my-app
spec:
  hosts:
    - api.external-service.com
  location: MESH_EXTERNAL
  ports:
    - number: 443
      name: https
      protocol: TLS
  resolution: DNS
EOF

問題5: ztunnelのメモリ使用量が急増

# 症状: ztunnel Podのメモリ使用量が継続的に増加する
# 原因: 大量の同時接続、またはメモリリーク

# 診断: 現在のメモリ使用量を確認
kubectl top pods -n istio-system -l app=ztunnel

# 診断: 接続数の確認
kubectl exec -n istio-system $(kubectl get pod -n istio-system -l app=ztunnel -o jsonpath='{.items[0].metadata.name}') -- curl -s localhost:15020/metrics | grep tcp_connections

# 解決: ztunnelのリソース制限を調整
helm upgrade ztunnel istio/ztunnel -n istio-system \
  --set resources.limits.memory=256Mi \
  --set resources.requests.memory=128Mi

プロダクションチェックリスト

Ambient Meshをプロダクション環境にデプロイする前に、必ず確認すべき項目です。

インストール前の確認

ネットワーク設定

セキュリティ設定

オブザーバビリティ

高可用性

移行(サイドカーから切り替える場合)

障害事例と復旧手順

事例1: ztunnel DaemonSetの更新中にサービスが中断

状況: ztunnel DaemonSetを更新する際、特定のノードで新しいztunnel Podが起動する前に既存のztunnel Podが終了し、そのノードのすべてのメッシュトラフィックが中断した。

原因: maxUnavailableの設定が高すぎる、または新しいztunnel Podの起動が遅延した。

復旧手順:

# 1. 影響を受けるノードの確認
kubectl get pods -n istio-system -l app=ztunnel -o wide

# 2. 更新の一時停止 (可能な場合)
kubectl rollout pause daemonset ztunnel -n istio-system

# 3. 影響を受けるノードでztunnelを手動で復旧
kubectl delete pod -n istio-system $(kubectl get pod -n istio-system -l app=ztunnel --field-selector spec.nodeName=affected-node -o jsonpath='{.items[0].metadata.name}')

# 4. ztunnelの復旧確認
kubectl get pods -n istio-system -l app=ztunnel -o wide

# 予防措置: maxUnavailableを1に設定
kubectl patch daemonset ztunnel -n istio-system -p '{"spec":{"updateStrategy":{"rollingUpdate":{"maxUnavailable":1}}}}'

事例2: Waypoint Proxyの過負荷によるL7ポリシーの遅延

状況: 特定のネームスペースのwaypoint proxyにトラフィックが集中し、レスポンス遅延が急増した。

原因: waypoint proxyのレプリカ数がトラフィック量に対して不足していた。

復旧手順:

# 1. waypoint proxyの状態確認
kubectl get pods -n affected-namespace -l gateway.istio.io/managed=istio.io-mesh-controller
kubectl top pods -n affected-namespace -l gateway.istio.io/managed=istio.io-mesh-controller

# 2. 即時のスケールアウト
kubectl scale deployment -n affected-namespace $(kubectl get deployment -n affected-namespace -l gateway.istio.io/managed=istio.io-mesh-controller -o jsonpath='{.items[0].metadata.name}') --replicas=5

# 3. HPA設定で自動スケーリングを適用 (上記のHPA例を参照)

# 4. 必要に応じて一時的にL7ポリシーをL4へ緩和
# waypointを削除するとL7ポリシーが無効になりL4(ztunnel)へフォールバック
# istioctl waypoint delete -n affected-namespace
# (注意: L7ポリシーがすべて無効になる)

事例3: サイドカーとAmbientの混在モードでの通信障害

状況: 移行中、サイドカーモードのネームスペースのサービスがambientモードのネームスペースのサービスを呼び出す際に、断続的に失敗した。

原因: サイドカーがHBONEプロトコルに対応していない古いバージョンであるか、サイドカーがwaypoint proxyを認識できずトラフィックを直接バックエンドへ送っていた。

復旧手順:

# 1. サイドカーのHBONE対応可否を確認
kubectl exec -n sidecar-namespace deployment/my-app -c istio-proxy -- pilot-agent request GET /debug/config_dump | grep ENABLE_HBONE

# 2. HBONEが無効な場合、サイドカーを再起動して最新設定を反映
kubectl rollout restart deployment -n sidecar-namespace

# 3. それでも問題が続く場合は、当該ネームスペースもambientモードへ移行
kubectl label namespace sidecar-namespace istio-injection-
kubectl label namespace sidecar-namespace istio.io/dataplane-mode=ambient
kubectl rollout restart deployment -n sidecar-namespace

事例4: istiod障害時のambientメッシュへの影響

状況: istiod Podがすべて異常になり、証明書の更新が停止した。

原因: istiodのリソース不足、etcd接続の問題、またはWebhook設定の誤り。

復旧手順:

# 1. istiodの状態確認
kubectl get pods -n istio-system -l app=istiod
kubectl logs -n istio-system -l app=istiod --tail=200

# 2. istiodの再起動
kubectl rollout restart deployment istiod -n istio-system

# 3. 証明書の更新状態を確認
istioctl proxy-status

# 参考: istiodがダウンしても既存のmTLS接続は証明書の有効期限まで維持される
# デフォルトの証明書TTLは24時間なので、istiodは24時間以内に復旧する必要がある

# 予防措置: istiodのHA構成
helm upgrade istiod istio/istiod -n istio-system \
  --set pilot.replicaCount=3 \
  --set pilot.resources.requests.memory=512Mi \
  --set pilot.resources.requests.cpu=500m

参考資料

コメント

まだコメントはありません。

ログインするとコメントできます