Kubernetes 1.29 の SIG-Network の変更内容をまとめました。v1.29 ではアルファ機能として kube-proxy の nftables モードが追加されています。将来的に iptables モードを置き換えることが目標とされているため、個人的に注目しています。
過去の SIG-Network の変更内容
- Kubernetes 1.28: SIG-Network の変更内容
- Kubernetes 1.27: SIG-Network の変更内容
- Kubernetes 1.26: SIG-Network の変更内容
- Kubernetes 1.25: SIG-Network の変更内容
- Kubernetes 1.24: SIG-Network の変更内容
- Kubernetes 1.23: SIG-Network の変更内容
- Kubernetes 1.22: SIG-Network の変更内容
- Kubernetes 1.21: SIG-Network の変更内容
- Kubernetes 1.20: SIG-Network の変更内容
- Kubernetes 1.19: SIG-Network の変更内容
- Kubernetes 1.18: SIG-Network の変更内容
- Kubernetes 1.17: SIG-Network の変更内容
- Kubernetes 1.16: SIG-Network の変更内容
- Kubernetes 1.15: SIG-Network の変更内容
- Kubernetes 1.14: SIG-Network の変更内容
以下は、Kubernetes v1.29 の Changelog を和訳したものです。 の部分は筆者の補足になります。
Kubernetes 1.28 と 1.29 の API 差分
Kubernetes API (/api/
, /apis/
) から取得した情報を使って、Kubernetes 1.28 と 1.29 のデフォルトで有効な API の差分を確認しました。今回は v1.29 で GA となった API Priority and Fairness 機能 に関するオブジェクト FlowSchema
, PriorityLevelConfiguration
の変更のみです。
- API の追加:
- flowcontrol.apiserver.k8s.io/v1/flowschemas
- flowcontrol.apiserver.k8s.io/v1/prioritylevelconfigurations
- API の削除:
- flowcontrol.apiserver.k8s.io/v1beta2/flowschemas D
- flowcontrol.apiserver.k8s.io/v1beta2/prioritylevelconfigurations D
- Deprecation の指定:
- flowcontrol.apiserver.k8s.io/v1beta3/flowschemas D
- flowcontrol.apiserver.k8s.io/v1beta3/prioritylevelconfigurations D
各 Kubernetes の API バージョン対応表も、Kubernetes 1.29 時点での情報に更新しました。
デフォルトで有効な API の変遷
デフォルトで有効な Kubernetes API の v1.14 から v1.29 までの変遷を確認してみました。基本的に API の追加は少なく、削除の方が多いことがわかります (APIGroup もしくは Version が違うものは別 API としてカウント)。新規のベータ API はデフォルト無効とする方針が v1.24 から入ったこともあり、かなり安定していると感じます (KEP-3136: Beta APIs Are Off by Default)。
追加・削除の詳細を見ると、ほとんどはバージョンの昇格に伴うものでした。Kubernetes v1.14 と v1.29 の API を比べて、バージョンの変更を除いて新規に追加された API は、下記の 6 API だけでした。
API | 初出 | ベータ初出 |
---|---|---|
authentication.k8s.io/v1/selfsubjectreviews | v1.28 | ベータなし |
discovery.k8s.io/v1/endpointslices | v1.21 | v1.17 |
flowcontrol.apiserver.k8s.io/v1/flowschemas | v1.29 | v1.20 |
flowcontrol.apiserver.k8s.io/v1/prioritylevelconfigurations | v1.29 | v1.20 |
networking.k8s.io/v1/ingressclasses | v1.19 | v1.18 |
storage.k8s.io/v1/csistoragecapacities | v1.24 | v1.21 |
Deprecation (非推奨)
- Networking のアルファ API だった
ClusterCIDR
が削除されました。 (#121229, @aojea)- KEP-2593: Enhanced NodeIPAM to support Discontiguous Cluster CIDR で進められていた機能です。この KEP は取り下げられ、out-of-tree で開発される方針となりました。
API Change (API の変更)
-
新しく
ServiceCIDR
タイプが追加され、Service ClusterIP アドレスの割当に使用されるクラスタの範囲を動的に設定できるようになりました。(#116516, @aojea)- KEP-1880: Multiple Service CIDRs で進められているアルファの機能です。
-
type
をLoadBalancer
に設定している Service の.status
に、新しいipMode
フィールドを追加しました。この新しいフィールドはLoadBalancerIPMode
フィーチャーゲートによって有効になります。(#119937, @RyanAoh) [SIG API Machinery, Apps, Cloud Provider, Network and Testing] -
netfilter conntrack サブシステムの変数
nf_conntrack_udp_timeout
およびnf_conntrack_udp_timeout_stream
を設定するためのオプションを追加しました。(#120808, @aroradaman)-
kube-proxy に新しく
--conntrack-udp-timeout
,--conntrack-udp-timeout-stream
フラグが追加されました。
-
kube-proxy に新しく
-
kube-proxy のコマンドラインのドキュメントで
--bind-address
は実際にはアドレスのバインドはせず、多くの場合使用するべきでないことが明記されました。(#120274, @danwinship)-
--bind-address
は kube-proxy の認識する Node のプライマリ IP アドレスを上書き指定するものです。
-
-
kube-proxy
に新しく nftables ベースのモードが追加されました。次のように実行することで利用可能です。kube-proxy --feature-gates NFTablesProxyMode=true --proxy-mode nftables
現在はアルファ段階の機能であり、おそらくデータを食べてしまうことはありませんが、少しかじるようなことはあるかもしれません。(e2e テストは合格していますが実世界ではまだ使われていません)
現時点では、127.0.1.1 上の Service ノードポートをサポートをしない点を除けば、機能的にはほとんど iptables モードと同じはずです。(現在は nftables 固有のコマンドライン引数は存在しないため、
--iptables-xxx
引数に相当する値を設定したい場合は、設定ファイルを使う必要があります。)このコードは非常に新しいため、十分に最適化されていません。最終的には iptables バックエンドよりも高いパフォーマンスが期待されていますが、現時点ではほとんどパフォーマンステストは実施されていません。 (#121046, @danwinship)
-
kube-proxy
:nf_conntrack_tcp_be_liberal
sysctl (カーネルの netfilter conntrack サブシステムの一部) を設定するオプション・フラグを追加しました。これを有効にした場合、kube-proxy
は無効な conntrack 状態に対するDROP
ルールをインストールしなくなります。これにより、非対称ルーティングのユーザに影響を与えている問題が解決します。(#120354, @aroradaman)
kube-proxy の nftables モードが追加された背景
v1.29 でアルファとして追加された kube-proxy の nftables
モードは、最終的に iptables
と ipvs
バックエンドを置き換える機能として計画されています。KEP-3866: Add an nftables-based kube-proxy backend によれば次のような背景があるようです。
- iptables の修復できないパフォーマンス問題
- iptables はインクリメンタルな変更をサポートしないためルールセット全体の更新が必要
- このため Service 数などが増えルールのサイズが大きくなるに連れて遅くなる
- iptables から nftables への移行
- Linux カーネルでの iptables の開発はほぼ停止しており nftables に移行している
- Linux ディストリビューションで iptables のサポートが廃止される可能性がある
-
ipvs
モードでは解決しない問題- 様々な問題がありデフォルトとはならなかった
- iptables の API を多く使っているため iptables の廃止に対処できない
- IPVS 自体が現在は活発に開発されていない
- iptables の
nf_tables
モードでは解決しない問題- 多くの Linux ディストリビューションは iptables が内部的に nftable API を使う
nf_tables
モードになっている - しかしこのモードでは nftables の map のような新機能が使えない
- 多くの Linux ディストリビューションは iptables が内部的に nftable API を使う
-
iptables
モードは複雑となっている- 後方互換性のため微妙な機能が残っている
- 2 つのバックエンドを 1 つにしたい
- 最終的に
iptables
,ipvs
を非推奨としnftables
1 つにしたい
- 最終的に
- 新しいモードによってクリーンアップやリファクタリングが進む
- kube-proxy のライブラリ化(KEP-3786) に向けての話
nftables モードを kind で試す
nftables モードを kind で試す場合は、下記のような設定が必要でした(参考: Allow kubeProxyMode: "nftables" in the networking configuration #3434)。nft のバージョンによる問題か Docker for Mac 4.26.1 では動作しなかったため、Ubuntu 22.04 上で確認しました。
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
featureGates:
NFTablesProxyMode: true
nodes:
- role: control-plane
image: kindest/node:v1.29.0
- role: worker
image: kindest/node:v1.29.0
- role: worker
image: kindest/node:v1.29.0
kubeadmConfigPatches:
- |
kind: KubeProxyConfiguration
mode: "nftables"
nftables モードがの反映は kube-proxy のログから確認できます。
I0115 08:47:17.526453 1 server_others.go:307] "Using nftables Proxier"
Feature (機能追加)
-
kube-proxy
に新しく--init-only
コマンドラインフラグを追加しました。このフラグを設定すると、kube-proxy が特権が必要な初期設定を実行し終了します。--int-only
モードは特権を持った init container で実行することを意図しており、これによりメインのコンテナは厳格なsecurityContext
で実行されるようにできます。(#120864, @uablrek) [SIG Network and Scalability]-
メインの kube-proxy コンテナでは privileged が不要となり、
NET_ADMIN
,SYS_RESOURCE
の capabilities で動作するようになります。
-
メインの kube-proxy コンテナでは privileged が不要となり、
-
Node
オブジェクトのPodCIDR
が変更されたとき、kube-proxy
が終了時にパニックになる問題を修正しました。(#120375, @pegasas) -
PodHostIPs
がベータに昇格しました。(#120257, @wzshiming)- この PR は #121445 で revert されています。
-
PodHostIPs
がベータに昇格しました。(#121477, @wzshiming) -
ServiceNodePortStaticSubrange
が stable に昇格しデフォルトに固定されました。(#120233, @xuzhenglun)- この機能については Kubernetes: Service の静的ノードポート用レンジを分割する (ServiceNodePortStaticSubrange) にまとめています。
-
CloudDualStackNodeIPs
機能がベータとなりました。この機能をサポートするように更新された外部クラウドプロバイダを使用する場合、kubelet
にコンマ区切りのデュアルスタックの--node-ips
を渡すことで、クラウドプロバイダが両方の IP を考慮できるようになります。 -
kube-apiserver
は clusterIP と nodePort の割当ロジックにおけるエラーを知らせる 4 つの新しいメトリクスを公開しました。(#120843, @aojea)- 下記の 4 メトリクスです。ClucsterIP、NodePort それぞれの修復ループで発見したエラー数と修復に失敗した数です。
apiserver_clusterip_repair_ip_errors_total
apiserver_clusterip_repair_reconcile_errors_total
apiserver_nodeport_repair_port_errors_total
apiserver_nodeport_repair_reconcile_errors_total
-
kube-proxy
はnf_conntrack_tcp_be_liberal
が未設定のときのみ、無効なconntrack
状態に対するDROP
ルールをインストールするようになりました。 (#120412, @aojea) -
kubelet
がデフォルトで Pod のnet.ipv4.tcp_keepalive_time
sysctl の使用を許可するようになりました。カーネルの最低バージョンは 4.5 となります。Pod Security Admission はv1.29+
バージョンの baseline, restricted ポリシーでこの sysctl を許可します。(#118846, @cyclinder)
Failing Test (失敗しているテスト)
- Windows 向け
kubeproxy
のユニットテストでモックフレームワークをサポートしました。(#120105, @princepereira)
Bug or Regression (バグまたはリグレッション)
-
ExternalIPs
を持つService
にExternalTrafficPolicy
の指定を許可しました。(#119150, @tnqn) -
externalTrafficPolicy: Local
を指定した Service に対する readiness predicate を再導入することで、121094 の問題を修正しました。(#121116, @alexanderConstantinescu) - 負のインデックスの JSON パッチの処理に関する
v1.28
のリグレッションが修正されました。(#120327, @liggitt) - Service がファイナライザを使用しそのファイナライザが status サブリソースを使って削除された場合、
ClusterIP
およびNodePort
で割り当てられたリソースを期待より長く保持するバグを修正しました。(#120623, @aojea) -
TopologyCache
のHasPopulatedHints
メソッドの並列に map にアクセスする問題を修正しました。(#118189, @Miciah) -
kube-proxy
で、ノードがIPv4
とIPv6
の両方のを持ちシングルスタックのIPv6
設定が与えられた場合に起動しないリグレッションが修正されました。(#121008, @danwinship) -
kubeproxy
のモックテストフレームワークで、loadbalancer
,endpoint
に対する ID 生成の増加の問題を修正しました。(#120723, @princepereira) - KCCM: 変更が多い大規模クラスタでのロードバランサの同期中に、#121090 によって引き起こされる一時的なノードの追加・削除の問題を修正しました。(#121091, @alexanderConstantinescu)
- Service Controller: ノードの
ProviderID
が変更されたあと、ロードバランサのホストが更新されるようになりました。(#120492, @cezarygerard) -
--bind-address
パラメータは誤解を招きやすく、このアドレスでポートは開かれません。代わりに、内部的には "nodeIP" に変換されます。両方のファミリ( IPv4 / IPv6) に対する nodeIP は、--bind-address
が未指定もしくは "any" アドレス(0.0.0.0 または ::)が指定されたとき、Node オブジェクトから取得されるようになりました。--bind-address
を未指定にするとが推奨され、特に localhost (127.0.0.1 またh ::1) を設定しないように注意してください。(#119525, @uablrek) [SIG Network and Scalability]- kube-proxy についての話です
- デュアルスタッククラスタで片方の IP ファミリのみに問題がある場合に、
kube-proxy
はそのヘルス状態をより正確に報告するようになりました。(#118146, @aroradaman)
Other (Cleanup or Flake) (その他)
-
local-up-cluster.sh
で CNI バイナリを自動的にダウンロードするようになり、ローカルでのデバッグを容易にしました。 (#120312, @HirazawaUi) -
kube-proxy
の挙動を変更し、sysctl
の値を既存の値より低い値に設定できるようにしました。(#120448, @aroradaman) -
Service
が指定されたポートおよびプロトコルでのみトラフィックを転送することを検証するテストをコンフォーマンスに昇格しました。(#120069, @aojea)- 「コンフォーマンス」は Kubernetes クラスタの適合性を検証するための e2e テストのサブセットです。(参考: Conformance Testing in Kubernetes)
-
ComponentSLIs
フィーチャーゲートによって制御され、/metrics/slis
で提供されるメトリクスは、GA となり無条件に有効となりました。このフィーチャーゲートはv1.31
で削除されます。(#120574, @logicalhan)