Kubernetes 1.24: SIG-Network の変更内容

[Kubernetes 1.24](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md) の SIG-Network の変更内容をまとめました。個人的には、Service の静的 IP 用レンジを分割する ServiceIPStaticSubrange というアルファの機能が興味深かったです。この機能は以下の個別記事にまとめました。

https://qiita.com/tkusumi/items/da474798c5c9be88d9c5

<details><summary>過去の SIG-Network の変更内容</summary><div>

- [Kubernetes 1.23: SIG-Network の変更内容](https://qiita.com/tkusumi/items/9516b7955c1c33d31e8e)
- [Kubernetes 1.22: SIG-Network の変更内容](https://qiita.com/tkusumi/items/2e3c69849ce2a4b50a90)
- [Kubernetes 1.21: SIG-Network の変更内容](https://qiita.com/tkusumi/items/a816626c258735bdc98f)
- [Kubernetes 1.20: SIG-Network の変更内容](https://qiita.com/tkusumi/items/5e1c420503cfa730d940)
- [Kubernetes 1.19: SIG-Network の変更内容](https://qiita.com/tkusumi/items/ee1e100d34465ff2d764)
- [Kubernetes 1.18: SIG-Network の変更内容](https://qiita.com/tkusumi/items/e72e255363f6deee3e9b)
- [Kubernetes 1.17: SIG-Network の変更内容](https://qiita.com/superbrothers/items/fd936c4046459a16609c)
- [Kubernetes 1.16: SIG-Network の変更内容](https://qiita.com/tkusumi/items/5fc2e12a4bb8931a2eed)
- [Kubernetes 1.15: SIG-Network の変更内容](https://qiita.com/summerwind/items/e1c8d649ed8c7ae44b83)
- [Kubernetes 1.14: SIG-Network の変更内容](https://qiita.com/summerwind/items/7ca97a5d6e3e2537ebca)

</div></details>

以下は、[Kubernetes v1.24 の Changelog](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md) を和訳したものです。:memo: の部分は筆者の補足になります。

## Major Themes (主なテーマ)

### Service の IP 割り当ての衝突を避ける

Kubernetes 1.24 では、Service の静的 IP アドレスの割り当てのためのレンジを優先予約 (soft-reserve) する、オプトインの新機能が導入されました。この機能を手動で有効にすると、クラスタは Service の IP アドレスのプールから自動割り当てを優先するようになり、衝突のリスクを減らせます。

Service の `ClusterIP` は次のように割り当てできます。

- 動的: 設定した Service IP のレンジ内で、クラスタが自動的に空いている IP を選択します
- 静的: 設定した Service IP のレンジ内で、利用者が任意の IP を選択します

Service の `ClusterIP` は一意であるため、割り当て済みの `ClusterIP` を持った Service を作成するとエラーが返ります。

:::note
:memo: この機能については、個別記事 [Kubernetes: Service の静的 IP 用レンジを分割する (ServiceIPStaticSubrange)](https://qiita.com/tkusumi/items/da474798c5c9be88d9c5) にまとめました。v1.24 ではアルファ機能である点にご注意ください。
:::

### :memo: Kubernetes 1.23 と 1.24 の API 差分
Kubernetes API (`/api/`, `/apis/`) から取得した情報を使って、Kubernetes 1.23 と 1.24 の API の差分を確認しました。差分は以下になります。今回は  CSIStorageCapacity の v1 追加と、その v1beta1 の deprecated のみが差分でした。

- API の追加:
    - `storage.k8s.io/v1/csistoragecapacities`
- API の削除: なし
- Deprecation の指定:
    - `storage.k8s.io/v1beta1/csistoragecapacities`

参考までに、今までの各 Kubernetes の API バージョン対応表を以下の記事にまとめています。(Kubernetes 1.24 時点での情報に更新しました)

https://qiita.com/tkusumi/items/cb2dc318875fbef19468

## Deprecation (非推奨)
- `Service.Spec.LoadBalancerIP` が非推奨になりました。このフィールドは仕様が不十分で、実装により意味が異なっていました。Kubernetes v1.24 時点では、利用可能な場合は実装固有のアノテーションを使うことが推奨されます。このフィールドは将来の API バージョンで削除される可能性があります。([#107235](https://github.com/kubernetes/kubernetes/pull/107235), [@uablrek](https://github.com/uablrek))
- 1.11 から非推奨だった `tolerate-unready-endpoints` アノテーションを削除しました。代わりに `Service.spec.publishNotReadyAddresses` を使ってください。([#108020](https://github.com/kubernetes/kubernetes/pull/108020), [@tossmilestone](https://github.com/tossmilestone))

## API Change (API の変更)
- winkernel モードで動作する kube-proxy に 2 つの新オプションが追加されました。
  - `--forward-healthcheck-vip`: もし true に設定された場合、宛先が Service VIP のヘルスチェックのトラフィックは、kube-proxy のヘルスチェックサービスに転送されます。
  - `--root-hnsendpoint-name`: ネットワークネームスペースの root のための hns エンドポイント名を指定します。
  - このオプションは、Google の GCLB のようなパススルー型のロードバランサで、バックエンドサービスの正しいヘルスチェックを可能にします。この変更なしでは、ヘルスチェックのパケットはドロップされ、このようなロードバランサから Windows ノードはヘルシーでない (unhealthy) と扱われます。
  - :memo: hns は [Hierarchical Namespace](https://github.com/kubernetes-sigs/hierarchical-namespaces) の略です。
- Network Policy オブジェクトに新しい Status サブリソースが追加されました。 ([#107963](https://github.com/kubernetes/kubernetes/pull/107963), [@rikatz](https://github.com/rikatz))
- `InterfaceNamePrefix` と `BridgeInterface` が、`--detect-local-mode` オプションの引数としてサポートされました。また、新しくオプショナルな `--pod-interface-name-prefix` と `--pod-bridge-interface` フラグが、kube-proxy に導入されました. ([#95400](https://github.com/kubernetes/kubernetes/pull/95400), [@tssurya](https://github.com/tssurya))
- ClusterCIDRConfig のための、v1alph1 networking API が導入されました。([#108290](https://github.com/kubernetes/kubernetes/pull/108290), [@sarveshr7](https://github.com/sarveshr7))
    - :memo: [revert されている](https://github.com/kubernetes/kubernetes/pull/109436)ため、v1.24.0 には入っていません
- プロキシーのメトリクス "sync_proxy_rules_no_local_endpoints_total" が新たに導入されました。このメトリクスは内部のエンドポイントを持たない Service の数を表します。"traffic_policy" ラベルには、 "internal" または "external" が含まれます。([#108930](https://github.com/kubernetes/kubernetes/pull/108930), [@MaxRenaud](https://github.com/MaxRenaud))
- kube-apiserver: `metadata.selfLink` フィールドは kube-apiserver によって設定されなくなりましたこれは 1.16 で廃止予定となり、1.20 以上ではデフォルトで設定されていませんでした。([#107527](https://github.com/kubernetes/kubernetes/pull/107527), [@wojtek-t](https://github.com/wojtek-t))
- OpenAPI V3 がデフォルトで有効になりました。([#109031](https://github.com/kubernetes/kubernetes/pull/109031), [@Jefftree](https://github.com/Jefftree))
- ClusterCIDRConfig のための、v1alph1 networking API が削除されました。
    - :memo: 前述の revert です ([#109436](https://github.com/kubernetes/kubernetes/pull/109436), [@JamesLaverack](https://github.com/JamesLaverack))
- メトリクス `evictions_number` を `evictions_total` とリネームし、stable としました。オリジナルの `evictions_number` メトリクス名は廃止予定となっており、1.23 で削除されていました。([#106366](https://github.com/kubernetes/kubernetes/pull/106366), [@cyclinder](https://github.com/cyclinder))
- `ServiceLBNodePortControl` 機能が GA となりました。このフィーチャーゲートは 1.26 で削除される予定です。([#107027](https://github.com/kubernetes/kubernetes/pull/107027), [@uablrek](https://github.com/uablrek))

## Feature (機能追加)
- ProxyTerminatingEndpoints をすべてのトラフィックポリシー(external, internal, cluster, local) に適用しました。([#108691](https://github.com/kubernetes/kubernetes/pull/108691), [@andrewsykim](https://github.com/andrewsykim))
- MixedProtocolLBService をアルファからベータにしました。([#109213](https://github.com/kubernetes/kubernetes/pull/109213), [@bridgetkromhout](https://github.com/bridgetkromhout))
- Service の `.spec.loadBalancerClass` フィールドが GA (generally available) になりました。([#107979](https://github.com/kubernetes/kubernetes/pull/107979), [@XudongLiuHarold](https://github.com/XudongLiuHarold))
- kubelet が `KUBE-IPTABLES-HINT` という名前の iptables チェインを `mangle` テーブルに作成するようになりました。ホストのネットワーク名前空間上で iptables のルールの変更が必要なコンテナ化されたコンポーネントは、このチェインの存在を使って、システムが iptables-legacy と iptables-nft のどちらを使っているかより正しく判断できるようになりました。([#109059](https://github.com/kubernetes/kubernetes/pull/109059), [@danwinship](https://github.com/danwinship))
    - :memo: `KUBE-IPTABLES-HINT` がに存在する場合、iptables-legacy を使っていることを表します。
- `TopologyAwareHints` フィチャーゲートがデフォルトで有効になりました。これは、Service に `service.kubernetes.io/topology-aware-hints` を設定することで、利用者が Topology Aware Hints をオプトインできるものです。このアノテーションが設定されていない Service には影響ありません。([#108747](https://github.com/kubernetes/kubernetes/pull/108747), [@robscott](https://github.com/robscott))
    - :memo: [TopologyAwareHints](https://kubernetes.io/ja/docs/concepts/services-networking/topology-aware-hints/) は、トポロジー(リージョンとゾーン)を考慮したルーティングを可能にする機能です。マルチゾーン環境での、ネットワークパフォーマンス向上が期待できます。デフォルトで有効になりましたが、[v1.24.0 時点ではベータ](https://github.com/kubernetes/kubernetes/blob/v1.24.0/pkg/features/kube_features.go#L974)であることに注意してください。
## Bug or Regression (バグまたはリグレッション)
- 非効率だった EndpointSlices コントローラーのメトリクスキャッシュのロックが修正されました。特定のシナリオ、特に Service を大量に持つようなクラスタでは、ネットワークプログラミングのレイテンシーが大幅に短縮される可能性があります。([#107091](https://github.com/kubernetes/kubernetes/pull/107091), [@robscott](https://github.com/robscott))
    - :memo: Service が数千あると、resync period の度に CPU が高負荷になるようです。この修正は [Kubernetes v1.23.2](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md#changelog-since-v1231) にも cherry-pick されています
- Apiserver が、proxy サブリソースのリクエストの処理で 0.0.0.0/:: への接続試行を拒否するようになりました。 ([#107402](https://github.com/kubernetes/kubernetes/pull/107402), [@anguslees](https://github.com/anguslees)) [SIG Network]
    - :memo: 許可されない接続先は golang の [`net.IP.IsGlobalUnicast`](https://pkg.go.dev/net#IP.IsGlobalUnicast) で判定されるようになりました
- 古い Service がクラウドプロバイダに送信されことがあるバグが修正されました ([#107631](https://github.com/kubernetes/kubernetes/pull/107631), [@lzhecheng](https://github.com/lzhecheng))
- 部分的な `EndpointSlice` の更新により、更新されていないエンドポイントからノード名の情報が消えてしまうバグを修正しました。([#108198](https://github.com/kubernetes/kubernetes/pull/108198), [@liggitt](https://github.com/liggitt))
- 1.19 から変更なしに永続されていた `Service` オブジェクトに対する変更が、誤った `spec.clusterIPs: Required value` エラーで拒否されてしまうという、1.23 でのリグレッションを修正しました。([#107847](https://github.com/kubernetes/kubernetes/pull/107847), [@thockin](https://github.com/thockin))
    - :memo: この修正は [Kubernetes v1.23.4](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.23.md#changelog-since-v1233) にも cherry-pick されています
-  `--nodeport-addresses` が空のとき、kube-proxy で重複したポートが開いてしまうバグを修正しました ([#107413](https://github.com/kubernetes/kubernetes/pull/107413), [@tnqn](https://github.com/tnqn))
- iptables モードの kube-proxy は、`-v=5` ではなく `-v=9` のときだけ、iptables の入力のすべてをログに記録するようになりました。([#108224](https://github.com/kubernetes/kubernetes/pull/108224), [@danwinship](https://github.com/danwinship))
- kube-proxy はノード上で Service のノードポートを保持しなくなりました。利用者は引き続き kube-proxy が使うノードポートの範囲でリスナーを動かさないことが推奨されます。([#108496](https://github.com/kubernetes/kubernetes/pull/108496), [@khenidak](https://github.com/khenidak))
- `Pod ResourceVersion` の変更に伴う、不要な `Endpoints` と `EndpointSlice` の更新が防止されました。([#108078](https://github.com/kubernetes/kubernetes/pull/108078), [@tnqn](https://github.com/tnqn))
- Windows kernel-mode の kube-proxy メトリクスが公開されるようになりました。([#106581](https://github.com/kubernetes/kubernetes/pull/106581), [@knabben](https://github.com/knabben))
- dockershim が公開している CRI API のバージョンを v1alpha2 に戻しました。([#106803](https://github.com/kubernetes/kubernetes/pull/106803), [@saschagrunert](https://github.com/saschagrunert))
    - :memo: Kubernetes v1.24 で dockershim が削除されるため、変更しないように戻したようです

- 廃止予定だったフラグ `--really-crash-for-testing` が削除されました。([#101719](https://github.com/kubernetes/kubernetes/pull/101719), [@SergeyKanzhelev](https://github.com/SergeyKanzhelev))

## その他 (Cleanup or Flake)
- 先頭にゼロを持つ IP の Service を使ったとき、クラスタが CVE-2021-29923 に対して脆弱でないことを検証する e2e テストを追加しました。このテストは必要条件であり十分条件ではなく、API からの IP アドレスを使う全てのコンポーネントが、これらを十進数または破棄する必要があることに注意してください。 ([#107552](https://github.com/kubernetes/kubernetes/pull/107552), [@aojea](https://github.com/aojea))
- Endpoints と EndpointSlice コントローラは [targetRef の resourceVersion](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/object-reference/#ObjectReference) を Endpoints と EndpointSlice に追加しなくなりました。 ([#108450](https://github.com/kubernetes/kubernetes/pull/108450), [@tnqn](https://github.com/tnqn))
- pkg/proxy/apis/config/types.go の 206 行目の implemented のスペルを修正しました。([#106453](https://github.com/kubernetes/kubernetes/pull/106453), [@davidleitw](https://github.com/davidleitw))
- `nodePortAddresses` の設定パラメータで IPv4 のループバックを選択していないとき、kube-proxy が sysctl の `net.ipv4.conf.all.route_localnet=1` を設定しないようになりました。([#107684](https://github.com/kubernetes/kubernetes/pull/107684), [@aojea](https://github.com/aojea))
- iptables のダンプを見る利用者は、ルールの構造と名前付けに変更があることに気づくでしょう。([#109060](https://github.com/kubernetes/kubernetes/pull/109060), [@thockin](https://github.com/thockin))