Istio

IstioでmTLSを導入する手順とベストプラクティス – Kubernetes 1.28以上対応

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

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


スポンサードリンク

前提条件と環境準備

このセクションでは、Istio が期待どおりに動作するための Kubernetes バージョンCLI ツール のインストール手順を示します。バージョンが要件未満の場合、CRD の適用や Admission Webhook が失敗し、コントロールプレーンやサイドカーが正常に起動できません。

1. Kubernetes バージョンの確認

Istio は Kubernetes 1.24 以降 を公式にサポートしています(2024‑04 時点)。それ以前のバージョンでは、gateway.networking.k8s.io/v1beta1 など新しい API が利用できず、CRD の作成が失敗する可能性があります【¹】。実運用環境では、最低でも 1.24 以上 を推奨します。

ポイント:クラスターが要件を満たさない場合は、アップグレード手順(kubeadm upgrade やマネージドサービスのバージョン切替)を先に実施してください。

2. 必要な CLI ツールのインストール

以下のツールはすべて公式バイナリから取得することで、OS に依存せず同一バージョンを保証できます。パッケージマネージャー経由だとリポジトリ更新が遅れるケースがあるため、手動ダウンロードを推奨します。

ツール 推奨取得方法 確認コマンド
kubectl https://dl.k8s.io/release/ から最新安定版 (v1.28.x 等) をダウンロード kubectl version --client --short
helm Helm 公式スクリプト get-helm-3 を実行 helm version --short
istioctl Istio のリリースページから対象バージョンのスクリプトを取得 istioctl version

ポイント:インストール後はすべてのツールでバージョンが期待通りか再度確認し、要件を満たしていることを確実にしてください。


Istio コントロールプレーンのインストール

この章では、Istio のコントロールプレーンを デフォルトプロファイル でデプロイする手順と、istioctl と Helm の選択基準を比較します。どちらの方法でも同一の CRD が適用されますが、運用ポリシーに合わせて最適なツールを選んでください。

1. デフォルトプロファイルでのインストール

default プロファイルは、Pilot、IngressGateway、Telemetry のみを有効化した 最小構成 です。軽量かつ本番環境でも安全に使用できることが公式ドキュメントで推奨されています【²】。

  • autoInject=enabled:Namespace ラベルに基づく自動サイドカー注入を有効化
  • traceSampling=100:トレースデータの全件取得(テスト環境向け)

ポイント:インストール完了後は kubectl get pods -n istio-systemistiodistio-ingressgateway が稼働していることを確認します。

2. istioctl と Helm の比較

項目 istioctl Helm
手順の簡潔さ 単一コマンドで CRD・コンポーネント同時適用 Chart の追加・インストールが必要
バージョン管理 istioctl が内部的に同梱するバージョンを使用 Chart バージョンで柔軟に切り替え可能
カスタマイズ性 --set オプションは限定的 values.yaml で細部まで設定可能
アップグレード支援 istioctl upgrade が公式フロー helm upgrade に任せられる
推奨シナリオ ハンズオンや単一クラスターの高速導入 CI/CD パイプライン・マルチクラスター運用

結論:短期間で検証したい場合は istioctl、長期的に複数クラスタを統一管理したい場合は Helm が適しています。


Namespace への自動サイドカー注入とサンプルアプリのデプロイ

この章では、Namespace 単位での自動サイドカー注入 を有効化し、公式サンプル (httpbinsleep) を用いたマイクロサービス構成を実装します。Pod に istio-proxy が付与されていることを確認できれば、以降の mTLS 設定へスムーズに移行できます。

1. Namespace の自動注入を有効化

istio-injection=enabled ラベルが付与された Namespace は、新規作成 Pod に自動的に Envoy サイドカーを挿入します。手動で sidecar.istio.io/inject: "true" を記述する必要がなく、運用負荷が大幅に削減されます。

ポイント:ラベルが正しく設定されたことを必ず確認し、次のデプロイに進んでください。

2. サンプルアプリ (httpbin + sleep) のデプロイ

以下のマニフェストは公式リポジトリから直接取得する例です。両方の Pod に自動的に istio-proxy コンテナが付与されることを確認します。

確認手順:Pod が istio-proxy を含んでいるかを一覧表示します。

ポイントistio-injection=enabled が機能し、両アプリにサイドカーが注入されたことを確認できたら次の章へ進みます。


mTLS 設定と検証

このセクションでは、デフォルトの PERMISSIVE モードから STRICT への切り替え手順、サービス単位での強制適用例、および実際に暗号化が有効かどうかを確認するツール群を紹介します。

1. 全 Namespace を STRICT に変更

PeerAuthentication リソースは Namespace レベル のデフォルト TLS モードを定義します。以下のマニフェストで demo Namespace 全体に対し mTLS を必須 (STRICT) とします【³】。

モード確認

ポイントPeerAuthentication が適用された Namespace では、平文通信がブロックされ、すべてのサービス間トラフィックが mTLS に強制変換されます。

2. Service 単位で DestinationRule により明示的に mTLS を指定

個別サービスだけを対象にしたい場合は DestinationRuletls.mode: ISTIO_MUTUALSTRICT と同等)を利用します。以下は httpbin サービスへの適用例です。

ポイントPeerAuthentication が上位レベルで PERMISSIVE のままであっても、DestinationRule により対象サービスだけを強制的に mTLS 化できます。

3. 動作検証ツールの活用

ツール 主な用途 実行例
istioctl authn tls-check 単一リクエストの TLS モードを即時確認 istioctl authn tls-check demo httpbin
Kiali (Web UI) サービス間リンクが緑(TLS)か可視化 kubectl -n istio-system port-forward svc/kiali 20001:20001 → http://localhost:20001
Prometheus メトリクスで mTLS 状態を集計 istio_requests_total{mtls="true"} で成功率確認

ベストプラクティス:CLI で即時チェックし、Kiali と Prometheus のダッシュボードで継続的に mTLS が有効であることをモニタリングします。


段階的マイグレーションと Ingress Gateway の TLS/mTLS 設定

外部トラフィックは HTTPS で受け付け、内部通信は mTLS に統一する構成例を示します。段階的にポリシーを適用すれば、既存サービスへの影響を最小限に抑えられます。

1. 公式ガイドに沿ったマイグレーション手順

Istio は Mesh → Namespace → Service の順でポリシーの粒度を細かくしていくことを推奨しています【⁴】。以下は 4 フェーズに分割した例です。

フェーズ 適用対象 ポリシー例 検証ポイント
1 Mesh 全体 (デフォルト) PeerAuthentication mode: PERMISSIVE(既定) 既存通信はそのまま
2 特定 Namespace PeerAuthentication mode: STRICT を対象 Namespace に適用 該当 Namespace のみ TLS 必須
3 個別 Service DestinationRuletls.mode: ISTIO_MUTUAL 設定 サービス単位の暗号化確認
4 Mesh 全体に統一 PeerAuthentication を全クラスター対象に STRICT に変更 すべてのトラフィックが mTLS

各フェーズで istioctl authn tls-check と Kiali の可視化を行い、障害が出たら直前の段階にロールバックします。

2. Ingress Gateway 用 TLS 証明書の作成・適用

外部から HTTPS 接続を受け付けるため、IngressGateway に Kubernetes Secret として証明書を登録し、Gateway リソースで参照させます。以下は自己署名証明書の簡易例です(実運用では cert-manager などと連携してください)。

ポイントmode: SIMPLE は外部 → IngressGateway のみ TLS を行い、内部は mTLS に切り替える前提です。

3. VirtualService で内部トラフィックを mTLS 化

Ingress が TLS 終端した後も、Envoy サイドカー同士の通信は暗号化されたままとするために VirtualService 側で tls.mode: ISTIO_MUTUAL を指定します。

ポイント:外部から https://example.com/ にアクセスすると、Ingress が TLS 復号し、その後 Envoy サイドカー同士が相互認証(mTLS)で httpbin へリクエストを転送します。


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

導入段階でよく遭遇する問題と、安定運用のために抑えておきたいチェックポイントをまとめます。問題が起きた際は 「原因特定 → 再適用 → 検証」 の順序で対処すると効率的です。

1. サイドカー未注入の主な原因と対策

原因 確認手順 対応
Namespace ラベル欠如 kubectl get namespace demo --show-labels kubectl label namespace demo istio-injection=enabled --overwrite
Admission Webhook エラー kubectl logs -n istio-system -l app=istiod | grep admission Webhook のエラーログを確認し、証明書や API サーバとの通信が正常か点検
明示的に無効化 (sidecar.istio.io/inject: "false") が付与されている kubectl get pod -n demo -o yaml | grep sidecar.istio.io/inject 該当アノテーションを削除し、Pod を再作成

ポイント:ラベルやアノテーションの状態は必ず kubectl describe namespace|pod で確認し、問題が解消したら Pod を再起動してサイドカー注入を検証します。

2. 証明書ローテーション時の注意点

Istio の自動ローテーションは 30 日ごと に行われますが、手動で Secret を差し替える場合は Envoy の再ロード が必要です。以下のフローを参考にしてください。

ポイント:Secret 更新後は必ず IngressGateway と少なくとも 1 つのサイドカー Pod を再起動し、istioctl authn tls-check で新証明書が使用されていることを確認します。

3. ポリシー競合と優先順位のチェック方法

PeerAuthenticationDestinationRule が同一サービスに対して異なる mTLS モードを指定すると、最も具体的なポリシー が適用されます(Service > Namespace > Mesh)。しかし、DISABLE が上書きされないケースがあるため注意が必要です【⁵】。

競合が見つかったら、不要なリソースを削除 するか 設定を統一 してください。

4. ベストプラクティスチェックリスト

項目 推奨アクション
二重検証 istioctl authn tls-check → Kiali の TLS アイコン → Prometheus メトリクスで一致を確認
段階的マイグレーション Namespace → Service → DestinationRule の順に STRICT に移行し、各フェーズで回帰テスト実施
証明書自動管理 cert-manager と Istio の Certificate CRD を連携させ、手作業による更新リスクを排除
監視アラート Prometheus で istio_tcp_connections_closed_total{reason="tls_error"}istio_requests_total{mtls!="TRUE"} に基づく Alertmanager アラートを設定
CI/CD 統合 デプロイ前に helm lint と同様に istioctl validate -f <manifest> を実行し、ポリシー違反を早期検出
ドキュメント整備 各環境(dev / staging / prod)ごとに PeerAuthentication のスコープと適用対象を Markdown で管理

最終的な結論:上記手順とチェックリストに沿って導入すれば、Istio の mTLS は安全かつ確実に本番環境へ展開できます。定期的な検証と自動化された監視を組み合わせることで、長期運用時のリスクも最小限に抑えることが可能です。


参考文献

  1. Istio Documentation – Supported Kubernetes Versions, https://istio.io/latest/docs/setup/install/kubernetes/
  2. Istio Docs – Profiles Overview, https://istio.io/latest/docs/setup/additional-setup/config-profiles/
  3. Istio Security – PeerAuthentication, https://istio.io/latest/docs/reference/config/security/peer_authentication/
  4. Istio Migration Guide – Mutual TLS Migration, https://istio.io/latest/docs/tasks/security/authentication/mutual-tls/
  5. Istio Policy Precedence, https://istio.io/latest/docs/ops/configuration/traffic-management/#policy-precedence
スポンサードリンク

もっとスキルを活かしたいエンジニアへ

スポンサードリンク
働き方から選べる

無料で使えて良質な案件の情報収集ができるサービス

エンジニアの世界では、「いつでも動ける状態を作っておけ」とよく言われます。
技術やポートフォリオがあっても、自分に合う案件情報を日常的に見れていないと、いざ動こうと思った時に比較や判断が難しくなってしまいます。
普段から案件情報が集まる環境を作っておくと、良い案件が出た時にすぐ動きやすくなりますよ。
筆者自身も、メガベンチャー勤務時代に年収1,500万円を超えた経験があります。振り返ると、技術だけでなく「どんな案件や働き方があるか」を日頃から見ていたことが、キャリアの選択肢を広げるきっかけになりました。
このブログを読んでくれた方に感謝を込めて、実際に使っている情報収集サービスを紹介します。

フルリモート・週3日・高単価、どんな条件も妥協したくないなら

フリーランスボードに無料会員登録する

利用者10万人以上。業界最大規模45万件の案件。AIマッチ機能や無料の相場情報が人気。

年収800万円以上のキャリアアップ・ハイクラス正社員を視野に入れているなら

Beyond Careerに無料相談する

内定獲得率90%以上。紹介先企業とは役員クラスのコネクションがある安心と信頼できるエージェント。


-Istio