View a markdown version of this page

nftables モードで kube-proxy を実行する - Amazon EKS

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

nftables モードで kube-proxy を実行する

kube-proxy が nftables モードの場合、Amazon EKS は iptables モードで kube-proxy を実行する 1,000 を超えるサービスを持つ大規模なクラスターで一般的なネットワークレイテンシーの問題を解決できます。Iptables モードは、各接続の最初のパケットに対してパケットフィルタリングルールを順番に処理するため、このパフォーマンスの問題が発生します。nftables は iptables の後継であり、nftables kube-proxy バックエンドは、クラスターサイズに関係なくほぼ一定時間でパケットを処理することで、このレイテンシーの問題に対処します。この問題を回避するには、kube-proxynftables モードで実行するようにクラスターを設定します。

概要

nftables kube-proxyバックエンドは、Kubernetes バージョン 1.33 以降、一般公開 (GA) されています。1.29 ではアルファ、1.31 ではベータとして利用可能でした。iptables バックエンドは、サービスごとに 1 つのルールをインストールし、ルールを順番に評価します。これにより、O(n) パケット処理時間がサービス数とともに増加します。対照的に、nftables は判定マップを使用して、約 O(1) 時間でパケットをディスパッチします。これにより、数万のサービスを持つクラスターでもパケットあたりのレイテンシーがほぼ一定に保たれ、数千のノードとサービスを持つクラスターに効率を提供します。

注記

nftables バックエンドは GA ですが、互換性上の理由から、 はデフォルトkube-proxyモードiptablesのままです。nftables モードに明示的にオプトインする必要があります。

ロードバランサーとして設計され、ラウンドロビンや最小接続などのスケジューリングアルゴリズムを公開する IPVS バックエンドとは異なり、nftables バックエンドは設定可能なスケジューリングアルゴリズムを提供しません。サービスに複数のバッキングポッドがある場合、nftables モードはバックエンドポッドをランダムに選択します。

要件

nftables kube-proxyバックエンドでは、ワーカーノードに Linux カーネル 5.13 以降が必要です。Amazon Linux 2023 および Ubuntu の最新バージョンは、この最小要件を満たしています。kube-proxy はカーネルの netfilter サブシステムを介してルールを直接移植するため、サポートされているカーネルを超えて追加のユーザースペースパッケージ ( などipvsadm) やカーネルモジュールをロードする必要はありません。

注記

カーネル 5.13 は、nftables モードを実行するために必要な最小値です。大規模なクラスターでルール同期のパフォーマンスを向上させるには、より新しいカーネルとkube-proxyバージョンをお勧めします。詳細については、「パフォーマンスに関する考慮事項」を参照してください。

重要

nftables バックエンドは、すべてのネットワークプラグインと互換性がない可能性があります。nftables モードを有効にする前に、CNI プロバイダーのドキュメントを参照してください。Amazon VPC CNI は、バージョン 以降の nftables モードと互換性がありますv1.23.0

実装

kube-proxy mode を に設定して、クラスターの kube-proxy DaemonSet を nftables モードで実行するように設定しますnftables

警告

これは破壊的な変更です。影響を最小限に抑えるために、オフ時間または最初の EKS クラスター作成時に実行することをお勧めします。

kube-proxy EKS アドオンを更新することで、AWS コマンドラインインターフェイス (AWS CLI) コマンドを発行して nftables を有効にできます。これには、Kubernetes 1.33 以降を実行する EKS クラスターが必要です。

aws eks update-addon --cluster-name $CLUSTER_NAME --addon-name kube-proxy \ --configuration-values '{"mode": "nftables"}' \ --resolve-conflicts OVERWRITE

または、クラスターの ConfigMap kube-proxy-config を変更することでこれを行うことができます。

kubectl -n kube-system edit cm kube-proxy-config

デフォルト設定が である mode設定を見つけiptables、値を に変更しますnftables。どちらのオプションの結果も、次の設定のようになります。

mode: "nftables" nftables: masqueradeAll: false masqueradeBit: 14 minSyncPeriod: 1s syncPeriod: 30s kind: KubeProxyConfiguration metricsBindAddress: 0.0.0.0:10249 nodePortAddresses: null oomScoreAdj: -998 portRange: ""

これらの変更を行う前にワーカーノードがクラスターに結合されている場合は、kube-proxy DaemonSet を再起動します。

kubectl -n kube-system rollout restart ds kube-proxy

パフォーマンスに関する考慮事項

nftables モードは Kubernetes バージョン から一般利用可能ですがv1.33、このモードは からのみ使用することをお勧めしますv1.36kube-proxy v1.36.0 では、Kubernetes プロジェクトは nftables マップとルールの構築方法に多くのパフォーマンス強化を行いました。これらの変更により、チェーンやjumpルールの数が大幅に減少しgoto、大規模な同期パフォーマンスが大幅に向上します。

これらの機能強化は、主に多数のエンドポイント (サービスをサポートする Pod) を持つクラスターにメリットをもたらします。v1.36.0 kube-proxy 以前は、数十万のエンドポイントを持つクラスターでは、nftables ルールの同期時間や CPU ソフトロックアップが非常に遅くなる可能性があります。これは、Linux カーネルが、 がkube-proxy生成するチェーンとジャンプにループが含まれていないことを確認するために発生します。

この動作は Linux カーネルバージョンによっても影響を受けます。基盤となるカーネルの改善は Linux カーネルに含まれています 6.18 (以前の安定したカーネルにバックポートされています)。以前の Linux カーネルバージョンで nftables モードを使用すると、ルールの同期時間が遅くなり、CPU ソフトロックアップが発生する可能性があります。大規模なクラスターで最高のパフォーマンスを得るには、最近の Linux カーネルを kube-proxy v1.36.0 以降と共に実行することをお勧めします。詳細については、GitHub ウェブサイトの「kube-proxy nftables performance issue (kubernetes/kubernetes#135639)」を参照してください。