ポイント: Kubernetesネットワーキングは、クラスター内での通信に不可欠で、コンテナ間の相互作用を管理します。さまざまなネットワーキングタイプと、トラフィックをルーティングするサービスの役割を含みます。
- ネットワーキングタイプは、NATなしでシームレスな通信を確保します。
- サービスはトラフィックをポッドにルーティングし、柔軟性を向上させます。
- CiliumやFlannelなどのツールはKubernetesネットワーキングを最適化します。
Kubernetesネットワーキングは、Kubernetesクラスター内での通信を管理し、容易にする重要な要素です。内部のコンテナ間の通信を処理するなど、幅広い操作を管理します:
- 内部コンテナ通信の処理
- コンテナをインターネットに公開
この記事では、主要なKubernetesネットワーキングの概念を紹介します。
Kubernetesにおけるネットワーキング
まず、Kubernetesクラスター内の基本的なネットワーキングタイプを見てみましょう:
- コンテナ間ネットワーキング
- ポッド間ネットワーキング
- ポッドとサービス間のネットワーキング
- インターネットとサービス間のネットワーキング
次に、それぞれのタイプがクラスター内での接続性を提供する方法を見てみましょう。
コンテナ間ネットワーキング
最も基本的な構成では、単一ポッド内のコンテナ間の通信はlocalhostとポート番号を介して行われます。これは、ポッド内のコンテナが同じネットワークネームスペースにあるためです。ネットワークネームスペースは、ルート、ファイアウォールルール、およびネットワークデバイスを含む論理的なネットワーキングスタックであり、ネームスペース内のプロセスに完全なネットワークスタックを提供します。同じ仮想マシン内に複数のネームスペースが存在する可能性があります。Kubernetesでは、すべてのポッドで実行されるpauseコンテナという隠れたコンテナがあります。このコンテナは、ポッド内の他のコンテナが機能しなくてもネームスペースを開いたままにします。新しいネットワークネームスペースは作成される各ポッドに割り当てられます。ポッド内のコンテナはこのネットワークネームスペースをlocalhostを介して使用できます。ただし、ユーザーはポートの競合に注意する必要があります: コンテナが同じポートを使用すると、ネットワーキングの問題が発生します。
ポッド間ネットワーキング
Kubernetesノード内の各ポッドには、専用のIPアドレスと専用のネームスペースが割り当てられます。自動割り当てにより、ユーザーはポッド間のリンクを明示的に作成する必要がありません。これにより、ポッドのネットワーキング操作(ポート割り当て、負荷分散、名前付けなど)を仮想マシンや物理ホストに似た形で処理できます。Kubernetesは任意のネットワークに対して3つの基本的な要件を課します。
- ノード上のポッドは、NATなしですべてのノードのすべてのポッドと通信できます。
- ノード上のエージェント(システムデーモン、kubelet)は、その特定のノード上のすべてのポッドと通信できます。
- ノードのホストネットワーク内のポッドは、NATなしですべてのノードのすべてのポッドと通信できます(ホストネットワークでポッドが実行されることをサポートするLinuxなどのプラットフォームのみ)。
同じノード内のポッド間通信
Kubernetesは、各ポッドに仮想イーサネットアダプターを作成し、ノードのネットワークアダプターに接続します。ネットワークリクエストが行われると、ポッドはポッドに関連付けられた仮想イーサネットデバイスを介して接続し、トラフィックをノードのイーサネットデバイスにトンネルします。Kubernetesノード内には、ノード内のポッド間の通信を促進するcbr0というネットワークブリッジがあります。すべてのポッドはこのネットワークブリッジの一部です。ネットワークリクエストが行われると、ブリッジは正しい宛先(ポッド)をチェックし、トラフィックを指示します。
異なるノード間のポッド間通信
要求されたIPアドレスがポッド内で見つからない場合、ネットワークブリッジはトラフィックをデフォルトゲートウェイに指示します。これにより、クラスター全体でIPを検索します。Kubernetesは各ノードに関連付けられたすべてのIP範囲の記録を保持します。次に、ノード内のポッドには、ノードに割り当てられた範囲からIPアドレスが割り当てられます。クラスター内のIPアドレスにリクエストが行われると、それは:
- 要求されたIPのIP範囲を探します。
- それを特定のノードに指示し、正しいポッドに指示します。
ポッドとサービス間のネットワーキング
サービスは、トラフィックを一連のポッドにルーティングする抽象化です。言い換えれば、サービスは単一のIPアドレスを一連のポッドにマッピングします。ネットワークリクエストが行われると、サービスは必要なポッドにリクエストをプロキシします。このプロキシサービスは、各ノード内で実行されるKube-proxyというプロセスを介して行われます。サービスは、最初にサービスIPに到達したリクエストに応じて、クラスター内でIPを取得します。その後、ポッドの実際のIPに転送されます。これはKubernetesにおいて重要な機能であり、各ポッドへのネットワーキングの依存性を切り離します。ポッドは、ネットワーク接続を心配することなく作成されたり削除されたりできます。これは、サービスがポッドが変更されると、自動的にポッドのIPでエンドポイントを更新するためです。サービスは、ターゲットとするポッドをラベルセレクターを使用して知っています。ラベルセレクターはKubernetesにおけるコアのグループ化原則です。ラベルセレクターを介して、クライアントやユーザーはオブジェクトのセットを特定できます。
- ラベルセレクターは、各ポッド内の指定されたラベルを探し、それに応じてサービスと一致させます。
- セレクターがないと、適切に構成されたサービスはポッドを追跡できず、クラスター内で通信の問題を引き起こします。
Kubernetesクラスター内の内部ルーティングのためのDNS
各クラスターにはDNS解決のための組み込みサービスがあります。
- 各サービスにはクラスター内にドメイン名が割り当てられています。
- ポッドにはDNS名が割り当てられています。
(これらは、ホスト名とサブドメインフィールドを使用してYAMLファイルを介して手動で構成できます。) ドメイン名を介してリクエストが行われると、Kubernetes DNSサービスはリクエストを解決し、必要な内部サービスにポイントします。Kube-proxyプロセスは、それをエンドポイントポッドに指示します。
インターネットとサービス間のネットワーキング
上記のセクションでは、Kubernetesクラスターの内部ネットワーキングの基本をカバーしました。次のステップは、コンテナ化されたアプリケーションをインターネットに公開することです。前述のネットワーキングタイプとは異なり、Kubernetesクラスターをインターネットに公開するには、両方が必要です:
- 基盤となるクラスターインフラストラクチャ
- ネットワーク構成
トラフィックを処理するために最も一般的に使用される方法は、ロードバランサーを使用することです。Kubernetesでは、ロードバランサーを構成できます。サービスが作成されると、ユーザーは:
- ロードバランサーのIPアドレスを公開するロードバランサーを指定できます。
- ロードバランサーにトラフィックを直接送信し、サービスと通信します。
Kubernetesネットワーキングのためのツール
Kubernetes内でネットワーキングを構成するために使用できるツールは多数あり、クラスターが課すすべてのガイドラインと要件を遵守しています。
- Ciliumは、アプリケーションコンテナ間のネットワーク接続を提供し、保護するためのオープンソースソフトウェアです。CiliumはL7/HTTP対応であり、アイデンティティベースのセキュリティモデルを使用してL3-L7からネットワークポリシーを強制できます。
- Flannelは、Kubernetesの要件を満たすシンプルなネットワークオーバーレイです。
- Kube-routerは、Kubernetesネットワーキングのためのターンキーソリューションです。Kube-routerは、デフォルトのKubernetesネットワークコンポーネントの代わりとして、単一のDaemonSet/バイナリからのスリムで強力な代替手段を提供します。
- Antreaは、Open vSwitchをネットワーキングデータプレーンとして活用するKubernetesネイティブのオープンソースネットワーキングソリューションです。
そして、ここにクラウドベンダー固有のコンテナネットワークインターフェースがあります:
- AWS VPC CNI for Kubernetesは、Amazon Web Services特有のCNIです。
- Azure CNI for Kubernetesは、Microsoft Azure特有のCNIです。
公式のKubernetesドキュメントを参照して、利用可能なネットワークツールの完全なリストを確認してください。
K8sネットワーキングはパフォーマンスを最適化
Kubernetesクラスターのネットワーキングは、ユーザーの要件に合わせて構成でき、コンテナ化されたアプリケーションとクラスターのパフォーマンスを最適化します。
関連資料
Kubernetesガイド
- Kubernetesとは (K8s)? Kubernetes基礎チュートリアル
- Kubernetesのベストプラクティスによるクラスタ効率の向上
- ベストプラクティス: Kubernetes向けのアプリケーション設計
- Kubernetes Pods: 入門
- Kubernetes ReplicaSets: 簡単な紹介
- Kubernetes Deploymentsの完全な説明
- Kubernetes DaemonSetsの使用と管理
- Kubernetesサービスの仕組み
- KubernetesのPort、TargetPort、およびNodePortの使用
- KubernetesにおけるConfigMapsの作成と使用
- Kubernetes Secretsの紹介
- Kubernetesネットワーキングの基本
- Kubernetes Ingressの説明
- Kubernetes Helm Chartsの紹介
- Kubernetesオペレーターパターンとは?
- KubernetesでのStatefulSetとしてのPostgreSQLのデプロイ
- Kubernetesカスタムリソース定義 (CRD) の説明
- クラウドネイティブアプリケーションのための3つのKubernetesパターン
- Kubernetesコンピュートリソースの説明
- DevOpsパイプラインのためのKubernetesセキュリティ
- Kubernetesでの継続的デリバリーのためのSpinnakerの使用
- Kubernetesマルチクラスター: 使用方法と理由
- Kubernetesモニタリング: 包括的ガイド
- KubernetesとDocker: 簡単な比較
- KubernetesとDocker Swarm: コンテナオーケストレーションツールの比較
- KubernetesとOpenShift: 何が違うのか?
- Kubernetes認定: どのようにして認定を取得するか
これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも反映しているわけではありません。