Kubernetes 1.28: SIG-Network の変更内容

[Kubernetes 1.28](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.28.md) の SIG-Network の変更内容をまとめました。1.28 では `ServiceNodePortStaticSubrange` というノードポートの動的と静的の割当の優先レンジを分けて、静的ポート指定時の衝突を減らす機能がデフォルトで有効になるなど、安定性向上につながる変更が主になっています。

`ServiceNodePortStaticSubrange` については、以下の個別記事にまとめました。

https://qiita.com/tkusumi/items/4c5bdf3cc83daadb7f24

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

- [Kubernetes 1.27: SIG-Network の変更内容](https://qiita.com/tkusumi/items/e50129395698d2a15e73)
- [Kubernetes 1.26: SIG-Network の変更内容](https://qiita.com/tkusumi/items/bc3b6c8073c5b3785741)
- [Kubernetes 1.25: SIG-Network の変更内容](https://qiita.com/tkusumi/items/a41ed4ffd67dd7b3ed23)
- [Kubernetes 1.24: SIG-Network の変更内容](https://qiita.com/tkusumi/items/8ae63017abf763b0a22d)
- [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.28 の Changelog](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.28.md) を和訳したものです。:memo: の部分は筆者の補足になります。

## :memo: Kubernetes 1.27 と 1.28 の API 差分
Kubernetes API (`/api/`, `/apis/`) から取得した情報を使って、Kubernetes 1.27 と 1.28 のデフォルトで有効な API の差分を確認しました。今回の変更は API の追加 1 つだけでした。

- API の追加:
    - authentication.k8s.io/v1/selfsubjectreview
        - `kubectl auth whoami` がデフォルトで使えるように :tada:
- API の削除: なし
- Deprecation の指定: なし

SelfSubjectReview v1 が追加されデフォルトで有効になったため、アクセスしたユーザの情報を表示する `kubectl auth whoami` が使えるようになりました。:tada: (利用には kubectl v1.28.0 以上が必要です)

```console
$ kubectl auth whoami
ATTRIBUTE   VALUE
Username    kubernetes-admin
Groups      [system:masters system:authenticated]
```

[各 Kubernetes の API バージョン対応表](https://qiita.com/tkusumi/items/cb2dc318875fbef19468)も、Kubernetes 1.28 時点での情報に更新しました。

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

## Deprecation (非推奨)
- kube-controller-manager で `--volume-host-cidr-denylist` と `--volume-host-allow-local-loopback` のフラグが廃止予定となりました。([#118128](https://github.com/kubernetes/kubernetes/pull/118128), [@carlory](https://github.com/carlory)) [SIG API Machinery, Apps, Network, Node, Storage and Testing]
    - :memo: in-tree のボリュームプラグインの脆弱性対応(CVE-2020-8555) のために入ったフラグですが、現在は未使用のため削除されたようです。
- 取り下げとなった機能 `NetworkPolicyStatus` が削除されました。 ([#115843](https://github.com/kubernetes/kubernetes/pull/115843), [@rikatz](https://github.com/rikatz))
    - :memo: これは [KEP-2943: Network Policy Status subresource](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/2943-networkpolicy-status) で進められていた、NetworkPolicy に `status` サブリソースを追加する機能でした。しかし alpha のまま取り下げることが決まったようです。
    - :memo: [このフィールドに使われていた protobuf のフィールド番号](https://github.com/kubernetes/kubernetes/pull/115843/files#diff-d2017d343f877bd90044bde1cf563a4192386b918703b116d9135c1a312cc931L41-L44)が将来に渡って欠番になるように [Test_NetworkPolicyRemovedFieldProtobufNumberReservation](https://github.com/kubernetes/kubernetes/blob/v1.28.0/staging/src/k8s.io/api/networking/v1/types_test.go#L25-L42) というテストが追加されていました。

## API Change (API の変更)
- loadbalancer status ingress に `IP mode` フィールドが追加されました。([#118895](https://github.com/kubernetes/kubernetes/pull/118895), [@RyanAoh](https://github.com/RyanAoh))
    - :memo: [KEP-1860 Make Kubernetes aware of the LoadBalancer behaviour](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/1860-kube-proxy-IP-node-binding) の実装です。
- kube-proxy: 構造化ロギングをサポートするための `--logging-format` フラグが追加されました。([#117800](https://github.com/kubernetes/kubernetes/pull/117800), [@cyclinder](https://github.com/cyclinder))
- `IPTablesOwnershipCleanup` 機能 (KEP-3178) は GA となり、kubelet は `KUBE-MARK-DROP` チェイン(ここ数リリースの間使われていないもの)と `KUBE-MARK-MASQ` チェイン(現在 kube-proxy のみが作成する)を作成しなくなりました。([#119374](https://github.com/kubernetes/kubernetes/pull/119374), [@danwinship](https://github.com/danwinship))

## Feature (機能追加)
- アルファの `CloudDualStackNodeIPs` 機能を修正しました。([#118329](https://github.com/kubernetes/kubernetes/pull/118329), [@danwinship](https://github.com/danwinship))
    - :memo: ノード IP のアノテーションがデュアルスタックのときに `alpha.kubernetes.io/provided-node-ip` アノテーションに 1 つの IP アドレスしか設定されていないという問題の修正です
- kube-proxy は停止中の EndpointSlice の条件を処理するようになり、ExternalTrafficPolicy=Local の Service でゼロダウンタイムのデプロイメントが可能になりました。author: @andrewsykim ([#117718](https://github.com/kubernetes/kubernetes/pull/117718), [@aojea](https://github.com/aojea)) [SIG Network, Testing and Windows]
    - :memo: 以前からある ProxyTerminatingEndpoints という機能ですが GA となりました
- kube-proxy サービスヘルスはローカルエンドポイントの数を示す HTTP ヘッダ `X-Load-Balancing-Endpoint-Weight` を返すようになりました。同じ情報はレスポンスボディの JSON `payload.LocalEndpoints` でも利用可能です。([#118999](https://github.com/kubernetes/kubernetes/pull/118999), [@cezarygerard](https://github.com/cezarygerard))
- `pkg/controller/endpoint` が contextual ロギングに移行しました。([#116755](https://github.com/kubernetes/kubernetes/pull/116755), [@my-git9](https://github.com/my-git9))
- コントローラ関数が [contextual ロギング](https://k8s.io/docs/concepts/cluster-administration/system-logs/#contextual-logging)を使用するように移行しました。([#116930](https://github.com/kubernetes/kubernetes/pull/116930), [@fatsheep9146](https://github.com/fatsheep9146)) [SIG API Machinery, Apps, Network, Node, Storage and Testing]
- kube-controller-manager の `EndpointSlice` と `EndpointSliceMirroring` コントローラが [contextual ロギング](https://k8s.io/docs/concepts/cluster-administration/system-logs/#contextual-logging)を使用するように移行しました。([#115295](https://github.com/kubernetes/kubernetes/pull/115295), [@Namanl2001](https://github.com/Namanl2001)) [SIG API Machinery, Apps, Network and Testing]
- 新たに `EndpointSlice` reconciler のためのステージングリポジトリが作られました。([#118953](https://github.com/kubernetes/kubernetes/pull/118953), [@mskrocki](https://github.com/mskrocki))
    - :memo: [kubernetes/endpointslice](https://github.com/kubernetes/endpointslice) というリポジトリに分けられ、out-of-tree の EndpointSlice コントローラからロジックを再利用できるようになりました。([KEP-3685: Move EndpointSlice Reconciler into Staging](https://github.com/kubernetes/enhancements/blob/master/keps/sig-network/3685-endpointslice-reconciler-to-staging/README.md))
- `ServiceNodePortStaticSubrange` フィーチャーゲートがベータに昇格し、デフォルトで有効になります ([#117877](https://github.com/kubernetes/kubernetes/pull/117877), [@xuzhenglun](https://github.com/xuzhenglun))
    - :memo: [個別記事にまとめました](https://qiita.com/tkusumi/items/4c5bdf3cc83daadb7f24)。基本的に [ServiceIPStaticSubrange](https://qiita.com/tkusumi/items/da474798c5c9be88d9c5) のノードポート版です。
- `ExpandedDNSConfig` 機能が GA となりました。`ExpandedDNSConfig` フィーチャーはデフォルト値に固定され、v1.30 で削除されます。もしこのフィーチャーゲートを明示的に設定している場合は今すぐ削除してください。([#116741](https://github.com/kubernetes/kubernetes/pull/116741), [@gjkim42](https://github.com/gjkim42)) [SIG Apps, Network and Node]
- [kube-proxy]: 停止中 (terminating) のノードからの接続のドレイン (connection draining) が実装されました。([#116470](https://github.com/kubernetes/kubernetes/pull/116470), [@alexanderConstantinescu](https://github.com/alexanderConstantinescu))
    - :memo: [KEP-3836: Kube-proxy improved ingress connectivity reliability](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/3836-kube-proxy-improved-ingress-connectivity-reliability) の実装です。
- `klog` のテキスト出力は、構造体、マップ、スライスに対するエンコーディングに JSON を使うようになりました。([#117687](https://github.com/kubernetes/kubernetes/pull/117687), [@pohly](https://github.com/pohly))
- iptables モードの `kube-proxy` は既存の `sync_proxy_rules_duration_seconds` に加えて、`sync_full_proxy_rules_duration_seconds` と `sync_partial_proxy_rules_duration_seconds` を個別に持つようになります。これにより両方の種類の加重平均だけでなく、各同期ごとの所要時間が提供されるようになります。([#117787](https://github.com/kubernetes/kubernetes/pull/117787), [@danwinship](https://github.com/danwinship))


## Bug or Regression (バグまたはリグレッション)
- 問い合わせたエンドポイントのリストの繰り返し処理で、エンドポイントの IP 設定に対する追加検証を追加しました。([#116749](https://github.com/kubernetes/kubernetes/pull/116749), [@princepereira](https://github.com/princepereira))
    - :memo: WinProxy (Windows) のみの話です。
- Pod のコンテナポートに対する更新・パッチでポートが重複している場合の警告を追加しました。([#113245](https://github.com/kubernetes/kubernetes/pull/113245), [@pacoxu](https://github.com/pacoxu))
    - :memo: kubectl では `Warning: spec.containers[0].ports[1]: duplicate port definition with spec.containers[0].ports[0]` のような Warning が表示されます
- TopologyCache で `AddHints` と `SetNodes` が同時に呼ばれたとのデータ競合を修正しました。([#117249](https://github.com/kubernetes/kubernetes/pull/117249), [@tnqn](https://github.com/tnqn)) [SIG Apps and Network]
- LocalModeNodeCIDR を使った場合の kube-proxy の競合状態を修正しました。kube-proxy の起動中にノードオブジェクトが再作成されたときに Service のトラフィックがドロップすることを避けられるようになりました。 ([#118499](https://github.com/kubernetes/kubernetes/pull/118499), [@aojea](https://github.com/aojea))
- `topology.kubernetes.io/zone` ラベルがノードの作成後に追加された場合に、Topology Aware Hints が動作しない問題を修正しました。([#117245](https://github.com/kubernetes/kubernetes/pull/117245), [@tnqn](https://github.com/tnqn))
- http (live-/readiness)-probe でヘッダが小文字だった場合に、意図せずカスタムの Accept ヘッダを上書きしていたバグを修正しました。([#114606](https://github.com/kubernetes/kubernetes/pull/114606), [@tuunit](https://github.com/tuunit))
- タイミングトレースの記録に競合状態がありました。実際の影響はおそらく低かったです。([#117139](https://github.com/kubernetes/kubernetes/pull/117139), [@pohly](https://github.com/pohly)) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node and Storage]
- kube-proxy の `sync_proxy_rules_iptables_total` メトリックは、1.27 以前の挙動に戻りました。これは kube-proxy が責任を持つ iptables のルールの総数を追跡するもので、最後の同期で再同期したルール数だけを数えるのではありません。後者の数字は新たに `sync_proxy_rules_iptables_last` メトリックが提供されます。([#119140](https://github.com/kubernetes/kubernetes/pull/119140), [@danwinship](https://github.com/danwinship)) [SIG Network]
- [KCCM] service controller: クラウドコントローラマネージャを、ノードの同期時に `providerID` を predicate とするように変更しました。この変更によりロードバランサの統合で、ロードバランサとターゲットを設定する際に `providerID` が設定されていることを保証します。([#117388](https://github.com/kubernetes/kubernetes/pull/117388), [@alexanderConstantinescu](https://github.com/alexanderConstantinescu)) [SIG Cloud Provider and Network]


## Other (Cleanup or Flake) (その他)
- kube-proxy は IP ファミリの設定に矛盾があるとき、起動時に警告を出すようになりました。(例えば IPv4 のノード IP を持っていときに `--cluster-cidr` が IPv6 である場合) ([#119003](https://github.com/kubernetes/kubernetes/pull/119003), [@danwinship](https://github.com/danwinship)) [SIG Network]
- kube-proxy: コンフィグファイルを使わなかったときのログの警告を削除しました。([#118115](https://github.com/kubernetes/kubernetes/pull/118115), [@TommyStarK](https://github.com/TommyStarK)) [SIG Network]
- `kube-controller-manager` 内で呼ばれる podgc コントローラとその他のログを [contextual ロギング](https://k8s.io/docs/concepts/cluster-administration/system-logs/#contextual-logging) を使うようにしました。`kube-controller-manager` の変更 (contextual ロギング移行) は完全に終わりました。([#119250](https://github.com/kubernetes/kubernetes/pull/119250), [@pohly](https://github.com/pohly)) [SIG API Machinery, Apps, Cloud Provider, Instrumentation, Network, Storage and Testing]
- GA となったフィーチャーゲート `MixedProtocolLBService`, `ServiceInternalTrafficPolicy`, `ServiceIPStaticSubrange`, `EndpointSliceTerminatingCondition` を削除しました。([#117237](https://github.com/kubernetes/kubernetes/pull/117237), [@yulng](https://github.com/yulng))
- `OpenAPI v2` のスペックを 50% 以上縮小しました。特に CPU のリソース消費が削減されます。([#118204](https://github.com/kubernetes/kubernetes/pull/118204), [@sttts](https://github.com/sttts))
    - :memo: 参照記法 ([$ref](https://swagger.io/docs/specification/using-ref/)) を使って[重複したパラメータを省略](https://github.com/kubernetes/kube-openapi/pull/411)することで実現しています。
    - :memo: OpenAPI v2 のスペックは `kubectl get --raw /openapi/v2 | jq .` で確認できます
- v1.21 で廃止予定となった `NetworkPolicyLegacy` テストスイートは新しいテーブルドリブンの e2e テストに置き換えられ正式に削除されました。([#118915](https://github.com/kubernetes/kubernetes/pull/118915), [@astoycos](https://github.com/astoycos))

## :memo: 今後のトピックの紹介
SIG-Network で扱われているトピックで、個人的に気になったものを紹介します。

- [pod LifecycleHandler should support a sleep option #114465](https://github.com/kubernetes/kubernetes/issues/114465)
    - Kubernetes で安全に Pod を終了するときに必要な sleep を LifecycleHandler に組み込むという提案です
    - [KEP](https://github.com/kubernetes/enhancements/pull/3961) はマージされましたたが [実装 PR](https://github.com/kubernetes/kubernetes/pull/119026) はレビュー中でした
- Service でプロトコルが違うがポート番号が重複したときに apply の挙動がおかしい問題
    - https://github.com/kubernetes/kubernetes/issues/118725
    - https://github.com/kubernetes/kubernetes/issues/105610
    - https://github.com/kubernetes/kubernetes/issues/114402
    - https://github.com/kubernetes/kubernetes/issues/119126