1. Kubernetesのネットワーク基盤と主要ポートの役割
    1. Kubernetesネットワークモデルの理解とPod間通信の仕組み
    2. ServiceとIngressによる通信抽象化と負荷分散
    3. 主要コントロールプレーンおよびワーカーノードポートの役割とセキュリティ
  2. 実践!Kubernetes環境におけるポートとネットワークの設定手順
    1. NetworkPolicyによるPod間アクセス制御のホワイトリスト化
    2. ServiceリソースとNodePort・ClusterIP・LoadBalancerの使い分け
    3. Ingressコントローラーの導入と外部公開設定の実践
  3. ユースケース別:通信パターンとレイヤー7ロードバランシング活用例
    1. マイクロサービス間通信におけるService Meshの導入効果
    2. E-commerceサイト向け:IngressとWeb Application Firewall (WAF) の連携
    3. マルチテナント環境におけるL7ルーティングとテナント分離戦略
  4. Kubernetesネットワーク構築で避けるべき落とし穴と解決策
    1. NetworkPolicy未設定によるデフォルト全許可状態のリスク
    2. 不適切なポート管理が招くセキュリティホールと運用課題
    3. 責任共有モデルの誤解とクラウドプロバイダとの連携不足
  5. 【ケース】サービス間通信障害の原因特定と改善プロセス
    1. 架空のケース:マイクロサービス連携におけるタイムアウト障害の原因特定
    2. 通信障害発生時のデバッグフローと監視ツール活用術
    3. NetworkPolicyとService設定の見直しによる恒久対策
  6. まとめ
  7. よくある質問
    1. Q: Kubernetesで使われる主要ポートの役割は?
    2. Q: KubernetesとDocker内部ネットワークの関係は?
    3. Q: Layer 7ロードバランシングの利点は何ですか?
    4. Q: 10.96.0.1のようなIPアドレスは何を指しますか?
    5. Q: Kubernetesでポート競合を防ぐ方法は?

Kubernetesのネットワーク基盤と主要ポートの役割

Kubernetesネットワークモデルの理解とPod間通信の仕組み

Kubernetesのネットワークは、従来の仮想マシン環境とは一線を画す「Kubernetes Network Model」に基づいています。このモデルでは、各Podに固有のIPアドレスが割り当てられ、NAT(Network Address Translation)を介さずにクラスタ内のすべてのPodと直接通信できることが基本原則です。これにより、アプリケーションがネットワークアドレス変換を意識することなく、シンプルかつ効率的な通信を実現します。このPod間通信は、CNI(Container Network Interface)プラグインによって実現されます。CNIプラグインは、各ノード上で動作し、Podの作成時にネットワークインターフェースを割り当て、IPアドレスを設定し、ルーティングテーブルを更新することで、マルチホスト環境下でもPod同士が直接通信可能なオーバーレイネットワークや直接接続ネットワークを構築します。この基盤があるからこそ、Kubernetes上でのマイクロサービス間の連携が容易になります。

ServiceとIngressによる通信抽象化と負荷分散

Kubernetes環境では、PodのIPアドレスはデプロイや再起動のたびに変更されるため、PodのIPを直接参照して通信することは現実的ではありません。そこで登場するのが、`Service`リソースです。Serviceは、複数のPodを論理的なグループとして抽象化し、固定のIPアドレス(ClusterIP)やDNS名を提供することで、動的なPod群へのアクセスを安定化させます。これにより、クライアントはPodの具体的なIPアドレスを知ることなく、サービス名を通じて通信が可能となり、クラスタ内部での負荷分散も実現します。さらに、クラスタ外部からアクセスを可能にするのが`Ingress`です。Ingressは、外部からのHTTP/HTTPSトラフィックを適切なServiceにルーティングする役割を担い、L7(アプリケーション層)での柔軟なルーティングやSSL/TLSターミネーションを提供します。これにより、従来のロードバランサーやプロキシサーバーの機能をKubernetes上で効率的に管理できます。

主要コントロールプレーンおよびワーカーノードポートの役割とセキュリティ

Kubernetesクラスタの安定稼働とセキュリティには、主要なネットワークポートの適切な管理が不可欠です。コントロールプレーンにおいては、APIサーバーがデフォルトで6443番ポートを使用して外部からのAPIリクエストを受け付けます。このポートはクラスタの制御拠点であり、厳重なアクセス制御が求められます。また、クラスタの状態を保存するetcdは2379-2380番ポートを使用しており、これらの通信も保護する必要があります。ワーカーノード側では、Kubeletが10250番ポートでAPIを提供し、コントロールプレーンからの指示を受け取ります。NodePortタイプのServiceを使用する場合、デフォルトで30000-32767番ポートの範囲がノード上に開放され、外部から直接アクセスできるようになります。これらのポートが不適切に開放されていると、セキュリティ上の脆弱性につながる可能性があるため、必要な範囲でのみ許可し、アクセス元を制限するなどの対策が重要です。

出典:Kubernetes 公式ドキュメント:ポートとプロトコル

実践!Kubernetes環境におけるポートとネットワークの設定手順

NetworkPolicyによるPod間アクセス制御のホワイトリスト化

KubernetesはデフォルトでPod間の通信をすべて許可していますが、これはセキュリティ上のリスクを伴います。ゼロトラストネットワークの原則に基づき、必要な通信のみを許可する「ホワイトリスト方式」へと移行するために、`NetworkPolicy`を導入しましょう。NetworkPolicyは、Podや名前空間(Namespace)のラベルを基に、Pod間のL3/L4(IPアドレスとポート)レベルでの通信を制御するKubernetesリソースです。設定手順としては、まず対象のNamespaceにNetworkPolicyを適用できるCNIプラグインが導入されているかを確認します。次に、特定のPodからのEgress(送信)通信やIngress(受信)通信を許可するYAML定義を作成し、`kubectl apply -f your-networkpolicy.yaml`コマンドで適用します。例えば、データベースPodへのアクセスはアプリケーションPodからのみ許可し、他のPodからのアクセスは拒否するといったきめ細やかな制御が可能です。これにより、不正なアクセス経路を最小限に抑え、セキュリティ体制を強化できます。

ServiceリソースとNodePort・ClusterIP・LoadBalancerの使い分け

KubernetesのServiceリソースには、主に`ClusterIP`、`NodePort`、`LoadBalancer`の3つのタイプがあり、それぞれ異なるユースケースで使い分けます。`ClusterIP`はクラスタ内部からのみアクセス可能な仮想IPアドレスを割り当て、主にマイクロサービス間の内部通信に利用されます。最も一般的なタイプで、安定したサービスディスカバリを実現します。`NodePort`は、各ワーカーノードの特定のポート(デフォルト30000-32767)を介してサービスを公開します。これは開発環境での一時的な外部アクセスや、既存のロードバランサーと連携させる場合に有用ですが、ポート管理が煩雑になりがちです。`LoadBalancer`は、クラウドプロバイダが提供する外部ロードバランサーを自動的にプロビジョニングし、サービスをインターネットに公開します。本番環境で外部からのアクセスを受け付けるアプリケーションに適しており、最もシンプルに外部公開が可能です。これらのServiceタイプを適切に選択することで、アプリケーションの通信経路を最適化し、運用の効率を高めることができます。

Ingressコントローラーの導入と外部公開設定の実践

Webアプリケーションを外部に公開し、L7レベルの高度なルーティングやSSL/TLS終端を実現するには、`Ingress`リソースとそれに対応する`Ingressコントローラー`の導入が不可欠です。Ingressコントローラー(Nginx Ingress ControllerやTraefikなど)は、Kubernetesクラスタ内で動作する特殊なロードバランサーであり、Ingressリソースで定義されたルールに基づいて外部からのHTTP/HTTPSトラフィックを適切なServiceに転送します。導入手順としては、まず選択したIngressコントローラーをクラスタにデプロイし、外部からアクセスできるようService `LoadBalancer`タイプで公開します。次に、IngressリソースのYAMLファイルを作成し、ホスト名、パス、ルーティング先のService、TLS設定などを定義します。これにより、例えば`example.com/app1`は`service-app1`に、`example.com/app2`は`service-app2`にトラフィックを振り分けたり、特定のドメインに対するSSL証明書を自動的に管理したりすることが可能になります。これにより、柔軟かつセキュアな外部公開を実現できます。

出典:Kubernetes 公式ドキュメント:ネットワークポリシー

ユースケース別:通信パターンとレイヤー7ロードバランシング活用例

マイクロサービス間通信におけるService Meshの導入効果

マイクロサービスアーキテクチャでは、多数のサービスが相互に通信するため、通信の管理は複雑になります。このような環境でL7ロードバランシングを高度に活用し、通信の信頼性、監視性、セキュリティを向上させるのがService Mesh(例: Istio, Linkerd)です。Service Meshを導入すると、各Podにサイドカープロキシがデプロイされ、このプロキシがサービス間のすべてのトラフィックをインターセプトします。これにより、アプリケーションコードを変更することなく、トラフィックルーティング(カナリアリリース、A/Bテスト)、リトライ、タイムアウト、サーキットブレーカーなどの高度なL7トラフィック管理機能を実現できます。また、サービス間の認証・認可、メトリクス収集、分散トレーシングも可能になり、複雑なマイクロサービス環境における運用上の課題を大幅に軽減します。

E-commerceサイト向け:IngressとWeb Application Firewall (WAF) の連携

E-commerceサイトのようなインターネットに直接公開されるアプリケーションは、SQLインジェクションやクロスサイトスクリプティング(XSS)といったWebアプリケーション層の攻撃に常に晒されています。これらの脅威からKubernetes上のサービスを保護するために、IngressとWeb Application Firewall(WAF)の連携は非常に有効です。具体的には、Ingressコントローラーの前面にクラウドプロバイダが提供するマネージドWAFサービスや、Kubernetes環境にデプロイ可能なWAFソリューションを配置します。WAFはL7レベルでHTTP/HTTPSリクエストの内容を詳細に検査し、不正なパターンを検出・ブロックすることで、アプリケーション層の脆弱性を狙った攻撃からKubernetesクラスタを守ります。この構成により、Kubernetesの柔軟なデプロイメントとWAFの強固なセキュリティ機能を両立させ、安全なE-commerceサイト運用を実現します。

マルチテナント環境におけるL7ルーティングとテナント分離戦略

単一のKubernetesクラスタで複数の顧客(テナント)のアプリケーションをホスティングするマルチテナント環境では、テナント間の通信分離と効率的なルーティングが重要な課題です。ここでL7ロードバランシング、特にIngressのホストベースまたはパスベースのルーティングが非常に役立ちます。例えば、`tenantA.example.com`からのリクエストはテナントAのServiceに、`tenantB.example.com`からのリクエストはテナントBのServiceに振り分けることができます。さらに、パスベースのルーティングを利用して`example.com/tenantA`と`example.com/tenantB`で異なるテナントのアプリケーションにアクセスさせることも可能です。これに加えて、`NetworkPolicy`を各テナントのNamespaceに適用し、テナント内Pod間の通信のみを許可し、他のテナントのPodとの通信を厳しく制限することで、L7ルーティングと組み合わせた多層的なセキュリティとテナント分離戦略を構築できます。

Kubernetesネットワーク構築で避けるべき落とし穴と解決策

NetworkPolicy未設定によるデフォルト全許可状態のリスク

Kubernetesの初期設定では、クラスタ内のすべてのPodが相互に通信できる「デフォルト全許可状態」となっています。これは開発・検証段階では便利ですが、本番環境でこの状態を維持することは重大なセキュリティリスクを伴います。不要な通信経路が存在することで、脆弱性が露呈したPodから他の機密性の高いPodへ攻撃が広がる可能性があります。実際、IDC Japanの2021年の調査では、国内企業のコンテナ導入における課題として「セキュリティ対策」が30.2%と高い割合を占めています。この落とし穴を避けるためには、クラスタデプロイの初期段階から`NetworkPolicy`を導入し、最小権限の原則に基づき、必要な通信のみを明示的に許可する「ホワイトリスト方式」へと移行することが不可欠です。各アプリケーションの通信要件を洗い出し、段階的にNetworkPolicyを適用していく計画を立てましょう。

チェックリスト

  • 利用しているCNIプラグインがNetworkPolicyに対応しているか確認しましたか?
  • 各アプリケーションの通信要件(Ingress/Egress)を明確に定義しましたか?
  • 開発/ステージング環境でNetworkPolicyをテストしましたか?
  • 本番環境への適用前にNetworkPolicyのインパクトを評価しましたか?

不適切なポート管理が招くセキュリティホールと運用課題

Kubernetes環境におけるポートの不適切な管理は、セキュリティホールを作り出すだけでなく、運用上の混乱も招きます。例えば、開発・検証目的で安易にNodePortを広範囲に開放したり、コントロールプレーンのポート(特にKubelet API 10250番ポート)へのアクセス制限が不十分であったりすると、外部からの不正アクセスや、クラスタ設定の改ざんといった深刻なリスクにつながります。Kubelet APIはワーカーノードの深い部分にアクセスできるため、その保護は特に重要です。この落とし穴を避けるためには、まずサービスに必要なポートのみを最小限に開放することを徹底しましょう。次に、これらのポートへのアクセス元IPアドレスを厳しく制限し、可能であればVPNや踏み台サーバーを介したアクセスのみを許可するなど、多層的な防御策を講じるべきです。また、定期的なポートスキャンやセキュリティ監査を実施し、意図しないポート開放がないか確認する運用プロセスを確立することも重要です。

責任共有モデルの誤解とクラウドプロバイダとの連携不足

クラウド環境でKubernetesを利用する場合、クラウドプロバイダとの「責任共有モデル」を正しく理解していないと、セキュリティリスクを見落とすことがあります。IPAの情報セキュリティ白書でも示されているように、クラウド環境においては、基盤となるインフラストラクチャのセキュリティはクラウドプロバイダが責任を持つ一方、その上で動作するアプリケーションや、ネットワークの設定、アクセス制御といったKubernetes層のセキュリティは利用者側の責任となります。この落とし穴を避けるためには、クラウドプロバイダが提供するネットワーク機能(VPC、セキュリティグループ、ロードバランサーなど)とKubernetesのネットワークリソース(Service、Ingress、NetworkPolicy)を密接に連携させることが重要です。例えば、VPCのサブネット設計、セキュリティグループでのノードへのアクセス制限、クラウドロードバランサーとIngressの統合などを適切に行うことで、Kubernetesクラスタ全体のセキュリティとネットワークの整合性を保つことができます。マネージドKubernetesサービス(EKS、GKE、AKSなど)を活用すれば、プラットフォーム層の運用負荷を低減し、利用者側はアプリケーションとKubernetesネットワーク設計に注力しやすくなります。

出典:IDC Japan (2021/04)、独立行政法人情報処理推進機構 (IPA) 情報セキュリティ白書 2025

【ケース】サービス間通信障害の原因特定と改善プロセス

架空のケース:マイクロサービス連携におけるタイムアウト障害の原因特定

ここでは架空のケースとして、とあるECサイトのバックエンドで「注文履歴サービス(Service A)が商品情報サービス(Service B)にリクエストを送信する際に、頻繁にタイムアウトが発生する」というシナリオを想定します。このような通信障害が発生した場合、まず`kubectl logs`で関連するPodのログを確認し、エラーメッセージからヒントを探します。次に、`kubectl describe pod `や`kubectl describe service `でPodやServiceの状態、イベントを確認し、デプロイや設定の問題がないかを検証します。特にService BのPodが`Ready`状態であるか、IPアドレスが正常に割り振られているか、Serviceのセレクターが正しくPodをターゲットにしているかを確認します。さらに、`kubectl exec -it — ping `や`curl :`を実行し、Service AのPodからService BへのL3/L4レベルでの到達性や疎通性を確認することが、原因特定に向けた重要なステップとなります。

通信障害発生時のデバッグフローと監視ツール活用術

通信障害発生時には、体系的なデバッグフローを確立し、監視ツールを効果的に活用することが原因特定を迅速化します。一般的なデバッグフローとしては、まずPodのステータス確認(`kubectl get pods`)、関連ログの分析(`kubectl logs`)、ServiceおよびEndpointの確認(`kubectl describe service`, `kubectl get endpoints`)を行います。次に、NetworkPolicyによるブロックがないか確認し、`kubectl exec`で対象Pod内に入り、`nslookup`や`ping`、`curl`を使ってDNS解決やIPアドレスレベルの疎通を確認します。

重要ポイント
監視ツールは障害検知と原因特定に不可欠です。PrometheusでCPU、メモリ、ネットワークI/Oなどのメトリクスを収集し、Grafanaで可視化することで、リソース枯渇や異常なトラフィックパターンを早期に発見できます。また、分散トレーシングツール(Jaeger, Zipkinなど)を導入すれば、マイクロサービス間のリクエストパスと各ステップでのレイテンシを可視化し、ボトルネックを特定しやすくなります。

これらのツールを組み合わせることで、通信障害がネットワーク層、サービス層、アプリケーション層のどこで発生しているかを効率的に絞り込むことが可能になります。

NetworkPolicyとService設定の見直しによる恒久対策

デバッグによって通信障害の原因が特定されたら、その原因に応じた恒久的な対策を講じます。もし原因が`NetworkPolicy`による意図しない通信ブロックであれば、対象のNetworkPolicyを修正するか、必要な通信を許可する新たなNetworkPolicyを追加します。例えば、Service AからService Bへの特定のポートでの通信を明示的に許可するルールを追加します。Service設定に問題があった場合は、Serviceのセレクターが正しいラベルを持つPodをターゲットにしているか、ポートマッピングがアプリケーションの待ち受けポートと一致しているか、ヘルスチェック設定が適切であるかを確認し、修正します。また、Podのヘルスチェック(Liveness/Readinessプローブ)が適切に設定されていないために、ReadyではないPodにトラフィックがルーティングされていた場合は、これらのプローブ設定を見直します。これらの変更を適用する前に、テスト環境で十分な検証を行い、期待通りの動作と副作用がないことを確認することが重要です。これにより、再発防止とサービスの可用性向上を図ります。