😤

【Kubernetes】kube-proxyについてしっかりと理解する

に公開

はじめに

以下の記事にService・Endpoints/EndpointSliceについてまとめれているため、この記事を読んだ後にこの記事を読むと理解度が高まります。
https://zenn.dev/junc/articles/632690774159ff

kube-proxyとは

Service・Endpoints/EndpointSliceリソースを監視し、それらの変更(作成・更新・削除)を検知した場合にリソースに登録されている情報を元にノードのネットワーク設定を行う。

kube-proxyの役割

kube-proxyは、ServiceとPodの間の架け橋の役割を担う。

  • Service
    • クライアントがアクセスする仮想的な入り口
    • Podの集合に対する安定したIPアドレスを提供
    • これにより、アプリケーションはPodの再起動やスケールアウトに影響されずに通信が可能
  • kube-proxyの働き
    • kube-proxyはServiceのIPアドレス宛の通信を監視
    • このトラフィックを、Serviceに紐づいた正しいPodへ転送するためのルーティングルールをノードに設定する。

Endpoints/EndpointSliceとの連携

  • Endpoints/EndpointSlice
    • Serviceの裏側にあるPodのIPアドレスとポート番号のリスト
    • Kubernetesコントローラーが、Serviceのセレクターに一致するPodを自動的に検出し、このリストを最新の情報に保つ。
  • kube-proxyの監視対象
    • kube-proxyが実際に監視しているのはServiceではなく、Endpoints/EndpointSlice。
    • Endpoints/EndpointSliceに変更(Podの追加・削除など)があると、kube-proxyはそれを検知し、ノードのルーティングルールを即座に更新する。

kube-proxyがなくなるとどうなるのか

サービスが提供する仮想IPアドレスは意味をなさなくなり、外部からPodに直接アクセスすることは困難になる。各ノードが独自のPodの情報を個別に知る必要があるため、Podのスケールアウトや障害時の再起動に対応できず、サービスディスカバリが機能しなくなる。

トラフィック転送の仕組み

取得した情報に基づき、各ノードのネットワークスタックにルーティングルールを設定する。この設定には以下の2つのモードがある。

①iptablesモード(デフォルト)

  • 最も一般的なモード
  • kube-proxyは、ServiceのIPアドレスからPodのIPアドレスへのDNAT(送信先ネットワークアドレス変換)ルールをiptablesに書き込む。
  • これにより、Service宛の通信がランダムなPodにロードバランシングされる。

②ipvsモード

  • iptablesよりも高性能なモード
  • LinuxかネールのIPVS機能を利用し、より効率的にトラフィックをロードバランシングする
  • 多数のServiceやPodを扱う大規模なクラスターに適する。

iptablesとは

iptablesはロードバランシングだけのためのツールではなく、Linuxカーネルの基本的なファイアウォールであり、パケットフィルタリングやネットワークアドレス変換(NAT)のための多機能なツール。

機能①:セキュリティとパケットフィルタリング
iptablesの最も重要な役割は、特定のIPアドレスやポートからのアクセスをブロックするセキュリティの確保。IPVSはトラフィックをロードバランスすることに特化しており、IPVSにはない機能。

機能②:SNAT(送信元NAT)
NAT(Network Address Translation)機能を提供し、パケットのIPアドレスを書き換える。特に、SNAT(Source NAT)は、Podなどの内部ネットワークアドレスからインターネットへ通信する際に不可欠な機能。PodのプライベートIPアドレスをノードのグローバルIPアドレスに変換することで、外部のサービスが応答を正しくノードに返せるようにする。

機能③:複雑なネットワークルール
iptablesは、シンプルで汎用的なルールベースのシステムを提供。これにより、ポートリダイレクト、特定のパケットのヘッダー変更、ログ記録など、複雑で詳細なネットワークルールを柔軟に定義可能。汎用性の高さは、特定のユースケースに特化したIPVSよりも優れている。

IPVS(IP Virtual Server)とは

Linuxカーネルに組み込まれた高性能なレイヤー4ロードバランサー。TCPやUDPなどのプロトコルレベルで、ネットワークトラフィックを複数のサーバー(Pod)に分散させることに特化。

IPVSの仕組み

クライアントからのリクエストを仮想サービスIPアドレス(VIP)で受け取り、内部で管理している実サーバーのリストからヘルスチェックに合格したサーバーを1つ選び、そのサーバーにトラフィックを転送。

KubernetesにおけるIPVS

kube-proxyのロードバランシングモードとしてIPVSを使用できる。これは、ipdtablesモードよりもスケーラビリティとパフォーマンスに優れている。

  • スケーラビリティ:iptablesがPodごとに個別のルールを作成するのに対し、IPVSはサービスの数に比例してルールを管理。サービス数が増えてもルールの数が爆発的に増えることがないため、大規模クラスターに適している。
  • パフォーマンス:IPVSはハッシュテーブルを使って効率的にサーバーを検索する。これにより、トラフィックが多い環境でも、iptablesのようなルールリストを線形に走査する方式よりも高速に動作する。

まとめ

  • kube-proxyは、Kubernetesクラスター内の各ノードで動作し、ServiceやEndpoints/EndpointSliceと連携し、安定したServiceのIPを介してトラフィックを適切なPodに転送する。
  • kube-proxyのトラフィック転送のモードには、iptablesとIPVSがある。
  • iptablesは、ファイアウォールなどの機能を持つ一方で、IPVSはロードバランシングに特化している。

Discussion