Kubernetes 1.24: SIG-Network 更新了哪些内容?
我总结了 Kubernetes 1.24 SIG-Network 的更改内容。我个人觉得,ServiceIPStaticSubrange 这个用于分割 Service 的静态 IP 范围的 Alpha 功能很有意思。关于这个功能,我已经整理在以下的单独文章中。
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.24 版本的 Changelog 日志的中文译文。其中的 “の部分は筆者の補足になります。” 是作者补充的说明。
主要主题
避免服务的IP分配冲突
Kubernetes 1.24 新增了一项自愿选择的新功能,用于优先保留(软预留)为 Service 静态 IP 地址分配的范围。手动启用此功能后,集群将优先从 Service IP 地址池中进行自动分配,以减少冲突风险。
可以将Service的ClusterIP分配如下。
-
- 動的: 設定した Service IP のレンジ内で、クラスタが自動的に空いている IP を選択します
- 静的: 設定した Service IP のレンジ内で、利用者が任意の IP を選択します
如果创建具有已分配的ClusterIP的服务,则会返回错误,因为Service的ClusterIP是唯一的。
Kubernetes 1.23 和 1.24 的 API 差异
使用从Kubernetes API (/api/, /apis/) 获取的信息,我们确认了 Kubernetes 1.23 和 1.24 版本的 API 差异。差异如下所示:本次差异仅包括 CSIStorageCapacity 的 v1 添加以及 v1beta1 的被弃用。
-
- API の追加:
storage.k8s.io/v1/csistoragecapacities
API の削除: なし
Deprecation の指定:
storage.k8s.io/v1beta1/csistoragecapacities
请参考以下文章,该文章总结了之前各个 Kubernetes 的 API 版本兼容表。(已更新至 Kubernetes 1.24)
弃用
Service.Spec.LoadBalancerIP が非推奨になりました。このフィールドは仕様が不十分で、実装により意味が異なっていました。Kubernetes v1.24 時点では、利用可能な場合は実装固有のアノテーションを使うことが推奨されます。このフィールドは将来の API バージョンで削除される可能性があります。(#107235, @uablrek)
1.11 から非推奨だった tolerate-unready-endpoints アノテーションを削除しました。代わりに Service.spec.publishNotReadyAddresses を使ってください。(#108020, @tossmilestone)
API变更 (API 的变更)
-
- winkernel モードで動作する kube-proxy に 2 つの新オプションが追加されました。
–forward-healthcheck-vip: もし true に設定された場合、宛先が Service VIP のヘルスチェックのトラフィックは、kube-proxy のヘルスチェックサービスに転送されます。
–root-hnsendpoint-name: ネットワークネームスペースの root のための hns エンドポイント名を指定します。
このオプションは、Google の GCLB のようなパススルー型のロードバランサで、バックエンドサービスの正しいヘルスチェックを可能にします。この変更なしでは、ヘルスチェックのパケットはドロップされ、このようなロードバランサから Windows ノードはヘルシーでない (unhealthy) と扱われます。
hns は Hierarchical Namespace の略です。
Network Policy オブジェクトに新しい Status サブリソースが追加されました。 (#107963, @rikatz)
InterfaceNamePrefix と BridgeInterface が、–detect-local-mode オプションの引数としてサポートされました。また、新しくオプショナルな –pod-interface-name-prefix と –pod-bridge-interface フラグが、kube-proxy に導入されました. (#95400, @tssurya)
ClusterCIDRConfig のための、v1alph1 networking API が導入されました。(#108290, @sarveshr7)
revert されているため、v1.24.0 には入っていません
プロキシーのメトリクス “sync_proxy_rules_no_local_endpoints_total” が新たに導入されました。このメトリクスは内部のエンドポイントを持たない Service の数を表します。”traffic_policy” ラベルには、 “internal” または “external” が含まれます。(#108930, @MaxRenaud)
kube-apiserver: metadata.selfLink フィールドは kube-apiserver によって設定されなくなりましたこれは 1.16 で廃止予定となり、1.20 以上ではデフォルトで設定されていませんでした。(#107527, @wojtek-t)
OpenAPI V3 がデフォルトで有効になりました。(#109031, @Jefftree)
ClusterCIDRConfig のための、v1alph1 networking API が削除されました。
前述の revert です (#109436, @JamesLaverack)
メトリクス evictions_number を evictions_total とリネームし、stable としました。オリジナルの evictions_number メトリクス名は廃止予定となっており、1.23 で削除されていました。(#106366, @cyclinder)
ServiceLBNodePortControl 機能が GA となりました。このフィーチャーゲートは 1.26 で削除される予定です。(#107027, @uablrek)
功能增加
-
- ProxyTerminatingEndpoints をすべてのトラフィックポリシー(external, internal, cluster, local) に適用しました。(#108691, @andrewsykim)
-
- MixedProtocolLBService をアルファからベータにしました。(#109213, @bridgetkromhout)
-
- Service の .spec.loadBalancerClass フィールドが GA (generally available) になりました。(#107979, @XudongLiuHarold)
-
- kubelet が KUBE-IPTABLES-HINT という名前の iptables チェインを mangle テーブルに作成するようになりました。ホストのネットワーク名前空間上で iptables のルールの変更が必要なコンテナ化されたコンポーネントは、このチェインの存在を使って、システムが iptables-legacy と iptables-nft のどちらを使っているかより正しく判断できるようになりました。(#109059, @danwinship)
KUBE-IPTABLES-HINT がに存在する場合、iptables-legacy を使っていることを表します。
TopologyAwareHints フィチャーゲートがデフォルトで有効になりました。これは、Service に service.kubernetes.io/topology-aware-hints を設定することで、利用者が Topology Aware Hints をオプトインできるものです。このアノテーションが設定されていない Service には影響ありません。(#108747, @robscott)
TopologyAwareHints は、トポロジー(リージョンとゾーン)を考慮したルーティングを可能にする機能です。マルチゾーン環境での、ネットワークパフォーマンス向上が期待できます。デフォルトで有効になりましたが、v1.24.0 時点ではベータであることに注意してください。
错误或回归
非効率だった EndpointSlices コントローラーのメトリクスキャッシュのロックが修正されました。特定のシナリオ、特に Service を大量に持つようなクラスタでは、ネットワークプログラミングのレイテンシーが大幅に短縮される可能性があります。(#107091, @robscott)
Service が数千あると、resync period の度に CPU が高負荷になるようです。この修正は Kubernetes v1.23.2 にも cherry-pick されています
Apiserver が、proxy サブリソースのリクエストの処理で 0.0.0.0/:: への接続試行を拒否するようになりました。 (#107402, @anguslees) [SIG Network]
許可されない接続先は golang の net.IP.IsGlobalUnicast で判定されるようになりました
古い Service がクラウドプロバイダに送信されことがあるバグが修正されました (#107631, @lzhecheng)
部分的な EndpointSlice の更新により、更新されていないエンドポイントからノード名の情報が消えてしまうバグを修正しました。(#108198, @liggitt)
1.19 から変更なしに永続されていた Service オブジェクトに対する変更が、誤った spec.clusterIPs: Required value エラーで拒否されてしまうという、1.23 でのリグレッションを修正しました。(#107847, @thockin)
この修正は Kubernetes v1.23.4 にも cherry-pick されています
–nodeport-addresses が空のとき、kube-proxy で重複したポートが開いてしまうバグを修正しました (#107413, @tnqn)
iptables モードの kube-proxy は、-v=5 ではなく -v=9 のときだけ、iptables の入力のすべてをログに記録するようになりました。(#108224, @danwinship)
kube-proxy はノード上で Service のノードポートを保持しなくなりました。利用者は引き続き kube-proxy が使うノードポートの範囲でリスナーを動かさないことが推奨されます。(#108496, @khenidak)
Pod ResourceVersion の変更に伴う、不要な Endpoints と EndpointSlice の更新が防止されました。(#108078, @tnqn)
Windows kernel-mode の kube-proxy メトリクスが公開されるようになりました。(#106581, @knabben)
dockershim が公開している CRI API のバージョンを v1alpha2 に戻しました。(#106803, @saschagrunert)
Kubernetes v1.24 で dockershim が削除されるため、変更しないように戻したようです
廃止予定だったフラグ –really-crash-for-testing が削除されました。(#101719, @SergeyKanzhelev)
其他(清理或剔除)
-
- 先頭にゼロを持つ IP の Service を使ったとき、クラスタが CVE-2021-29923 に対して脆弱でないことを検証する e2e テストを追加しました。このテストは必要条件であり十分条件ではなく、API からの IP アドレスを使う全てのコンポーネントが、これらを十進数または破棄する必要があることに注意してください。 (#107552, @aojea)
-
- Endpoints と EndpointSlice コントローラは targetRef の resourceVersion を Endpoints と EndpointSlice に追加しなくなりました。 (#108450, @tnqn)
-
- pkg/proxy/apis/config/types.go の 206 行目の implemented のスペルを修正しました。(#106453, @davidleitw)
nodePortAddresses の設定パラメータで IPv4 のループバックを選択していないとき、kube-proxy が sysctl の net.ipv4.conf.all.route_localnet=1 を設定しないようになりました。(#107684, @aojea)
iptables のダンプを見る利用者は、ルールの構造と名前付けに変更があることに気づくでしょう。(#109060, @thockin)