Kubernetes 1.26: SIG-Network の変更内容

[Kubernetes 1.26](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.26.md) の SIG-Network の変更内容をまとめました。大きな変更はありませんが、着実に改善されています。

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

- [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.26 の Changelog](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.26.md) を和訳したものです。:memo: の部分は筆者の補足になります。

## :memo: Kubernetes 1.25 と 1.26 の API 差分
Kubernetes API (`/api/`, `/apis/`) から取得した情報を使って、Kubernetes 1.25 と 1.26 の API の差分を確認しました。差分は以下になります。`flowschemas`, `prioritylevelconfigurations` の v1beta3 が追加され、その v1beta2 が廃止予定 (deprecated) となり, v1beta1 が削除されました。

- API の追加:
    - `flowcontrol.apiserver.k8s.io/v1beta3/flowschemas`
    - `flowcontrol.apiserver.k8s.io/v1beta3/prioritylevelconfigurations`
- API の削除:
    - `autoscaling/v2beta2/horizontalpodautoscalers`
    - `flowcontrol.apiserver.k8s.io/v1beta1/flowschemas`
    - `flowcontrol.apiserver.k8s.io/v1beta1/prioritylevelconfigurations`
- Deprecation の指定:
    - `flowcontrol.apiserver.k8s.io/v1beta2/flowschemas`
    - `flowcontrol.apiserver.k8s.io/v1beta2/prioritylevelconfigurations`


各 Kubernetes の API バージョン対応表も、Kubernetes 1.26 時点での情報に更新しました。

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

## API Change (API の変更)
- コンテナの `httpGet` を使った `preStop` と `postStart` ライフサイクルハンドラは、指定された `scheme` と `headers` フィールドを尊重するようになりました。これにより、カスタムヘッダと `HTTPS` へのスキーム変更が可能になり、startup/readiness/liveness probe と一貫性を持つようになります。`scheme: HTTPS` が設定されたライフサイクルハンドラが、エンドポイントが実際には HTTP であるというエラーに遭遇したときは、以前のリリースとの互換性のため、HTTP でリクエストするようフォールバックします。この問題が起きた時、`LifecycleHTTPFallback` イベントが Pod のネームスペースに記録され、kubelet の `kubelet_lifecycle_handler_http_fallbacks_total` メトリックが増加されます。クラスタ管理者は、kubelet の `--feature-gates=ConsistentHTTPGetHandlers=false` を設定することで、このライフサイクルの拡張を無効にできます。([#86139](https://github.com/kubernetes/kubernetes/pull/86139), [@jasimmons](https://github.com/jasimmons))
- API オブジェクトの `metav1.LabelSelectors` の指定は、エラーとなる無効なラベルの値が含まれていないことを検証するようになりました。既存の無効なオブジェクトの更新は可能ですが、新規のオブジェクトは有効なラベルセレクタを含む必要があります。([#113699](https://github.com/kubernetes/kubernetes/pull/113699), [@liggitt](https://github.com/liggitt))
- 各フィーチャーゲートが有効かどうかを調べられる`kubernetes_feature_enabled` メトリックを追加しました。 ([#112690](https://github.com/kubernetes/kubernetes/pull/112690), [@logicalhan](https://github.com/logicalhan))
    - :memo: コマンドで確認したい場合は、以下のように `kubectl get` の `--raw` を使って直接 `/metrics` にアクセスすると便利です。
```
$ kubectl get --raw /metrics | grep ProxyTerminatingEndpoints
kubernetes_feature_enabled{name="ProxyTerminatingEndpoints",stage="BETA"} 1
```
- ループバックアドレスでの NodePort サービスを無効化できる kube-proxy のフラグ(`--iptables-localhost-nodeports`, デフォルト true)が追加されました。注意: これは iptables モードで ipv4 のときのみ適用されます。([#108250](https://github.com/kubernetes/kubernetes/pull/108250), [@cyclinder](https://github.com/cyclinder))
- aggregated discovery がアルファとなり、`AggregatedDiscoveryEndpoint` フィーチャーフラグで切り替えられるようになりました ([#113171](https://github.com/kubernetes/kubernetes/pull/113171), [@Jefftree](https://github.com/Jefftree))
    - :memo: API リソースのディスカバリは、何度も HTTP リクエストが発生し負荷と遅延が問題となっていました。この機能では `APIGroupDiscovery` というリソースが導入され、これを List で取得することで一度の HTTP でリソース一覧が取れるようになっているようです。
    - :memo: 参考: [KEP-3352: Aggregated Discovery](https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/3352-aggregated-discovery)
- `ServiceInternalTrafficPolicy` 機能が GA となりました ([#113496](https://github.com/kubernetes/kubernetes/pull/113496), [@avoltz](https://github.com/avoltz))
- kube-proxy で "userspace" プロキシーモード (1 年以上 deprecated だった)が Linux、Windows どちらでもサポートされなくなりました。利用者は Linux では "iptables" または "ipvs"、Windows では "kernelspace" を使ってください。([#112133](https://github.com/kubernetes/kubernetes/pull/112133), [@knabben](https://github.com/knabben))
- `MixedProtocolLBServiceA` が beta から GA になりました。([#112895](https://github.com/kubernetes/kubernetes/pull/112895), [@janosi](https://github.com/janosi))
- `EndpointSliceTerminatingCondition` フィーチャーゲートが GA になりました。このゲートは固定されるようになり、v1.28 で削除されます。([#113351](https://github.com/kubernetes/kubernetes/pull/113351), [@andrewsykim](https://github.com/andrewsykim))

## Feature (機能追加)
- 大規模なクラスタで、kube-proxy の iptables バックエンドが service/endpoint の変更をより効率的に処理するようになりました。([#110268](https://github.com/kubernetes/kubernetes/pull/110268), [@danwinship](https://github.com/danwinship))
    - :memo: 見た限り `MinimizeIPTablesRestore` というフィーチャーゲート(デフォルト false)を有効にしたときに動くロジックのようです。
    - :memo: 参考: [KEP-3453: Minimizing iptables-restore input size](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/3453-minimize-iptables-restore)
- kubeconfig の cluster info の下に、`DisableCompression`  という新しいフィールド(default = `false`)が追加されました。`true` に設定されたとき、その kubeconfig を使ったクライアントからの apiserver へのリクエストに対するレスポンスは圧縮が無効になります。これはクライアント・サーバー間の帯域が十分(>30MB/s)か、サーバーの CPU に制約がある場合に、list コールのレイテンシの大幅に改善します。([#112309](https://github.com/kubernetes/kubernetes/pull/112309), [@shyamjvs](https://github.com/shyamjvs))
    - :memo: フィールド名が `EnableCompression` ではなく否定形を使っているのは、[RestConfig のフィールド](https://github.com/kubernetes/client-go/blob/372575c38a08134a8918ddaf1e8269ea6ba85359/transport/config.go#L51-L53)や [Go の httpライブラリ](https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/net/http/transport.go;l=190)に合わせたからと[issue のコメント](https://github.com/kubernetes/kubernetes/pull/112309#issuecomment-1242317352)にありました。
- アルファのメトリクススタビリティで、`pod_status_sync_duration_seconds` ヒストグラムが、Kubelet が Pod の状態変化を検出したときにそれを書き込むのにかかった時間を報告するようになりました。([#107896](https://github.com/kubernetes/kubernetes/pull/107896), [@smarterclayton](https://github.com/smarterclayton)) [SIG Apps, Architecture, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scheduling, Storage and Testing]
- `kubectl` に `--disable-compression` フラグ (default = false) が追加されました。これが true のとき、`apiserver` に対する全てのリクエストはレスポンスの圧縮が無効になります。これはクライアント・サーバー間の帯域が十分(>30MB/s)か、サーバーの CPU に制約がある場合に、list コールのレイテンシの大幅に改善します。([#112580](https://github.com/kubernetes/kubernetes/pull/112580), [@shyamjvs](https://github.com/shyamjvs))
- API サーバートレーシングが、様々な span と span イベントを含むようになりました。([#113172](https://github.com/kubernetes/kubernetes/pull/113172), [@dashpole](https://github.com/dashpole)) [SIG API Machinery, Architecture, Auth, Instrumentation, Network, Node and Scheduling]
- `TopologyAwareHints` の有効・無効時にイベントが発行されるようになりました。([#113544](https://github.com/kubernetes/kubernetes/pull/113544), [@LiorLieberman](https://github.com/LiorLieberman))
    - :memo: `TopologyAwareHintsEnabled`, `TopologyAwareHintsDisabled` という Reason のイベントが発行されるようです
- `ServiceIPStaticSubrange` 機能が GA になりました。([#112163](https://github.com/kubernetes/kubernetes/pull/112163), [@aojea](https://github.com/aojea))
    - :memo: v1.24 でアルファとして導入され 1.26 で無事 GA となりました :tada:
    - :memo: 参考: https://qiita.com/tkusumi/items/da474798c5c9be88d9c5
- Kube-apiserver: `gzip` 圧縮がレベル 4 からレベル 1 に変更し、10~50% 帯域幅の利用が増えることと引き換えに、大きい list コールのレイテンシを改善しました。これにより、非常に大きいページ化されていないリストコールの呼び出しがタイムアウトの制限を超えるまでのヘッドルームが増加しました。([#112299](https://github.com/kubernetes/kubernetes/pull/112299), [@shyamjvs](https://github.com/shyamjvs))
- `ExpandedDNSConfig` 機能がベータとなり、デフォルトで有効になりました。この機能はコンテナランタイムのサポートが必要な点に留意してください。([#112824](https://github.com/kubernetes/kubernetes/pull/112824), [@gjkim42](https://github.com/gjkim42)) [SIG Network and Testing]
    - :memo:  DNS のサーチパスの最大が 6 から 32, サーチパスの文字列長の最大が 256 から 2048 へ拡張されるものです。
    - :memo: 参考: [KEP-2595: Expanded DNS Configuration](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/2595-expanded-dns-config)
- `ProxyTerminatingEndpoints` 機能がベータとなり、デフォルトで有効になりました。これが有効の時、トラフィックポリシーが `local` でノード上に停止中 (terminating) 状態の pod しか存在しないときは、kube-proxy は停止中の pod にトラフィックを向けるようになります。([#113363](https://github.com/kubernetes/kubernetes/pull/113363), [@andrewsykim](https://github.com/andrewsykim))
- `ComponentSLIs` フィーチャーゲートが有効の時、`/metrics/slis` が `kube-proxy` で利用可能となり、ヘルスチェックのメトリクスを取得できるようになります。([#113057](https://github.com/kubernetes/kubernetes/pull/113057), [@Richabanker](https://github.com/Richabanker))

## Bug or Regression (バグまたはリグレッション)
- コンテナの `/etc/resolv.conf` にホストの `search .`が伝播しないようにしました。([#112157](https://github.com/kubernetes/kubernetes/pull/112157), [@dghubble](https://github.com/dghubble))
    - :memo: alpine など musl ベースの DNS 解決時に `search .` があることで失敗する[問題](https://github.com/kubernetes/kubernetes/issues/112135)があったようです
- Service の `appProtocol` の変更がロードバランサの更新を引き起こさないバグを修正しました。([#112785](https://github.com/kubernetes/kubernetes/pull/112785), [@MartinForReal](https://github.com/MartinForReal)) [SIG Cloud Provider and Network]
- `winkernel` proxier がサービスバックエンドの変更のたびに、プロキシールールのリークを引き起こす問題を修正しました。([#112837](https://github.com/kubernetes/kubernetes/pull/112837), [@daschott](https://github.com/daschott))
- endpointslice コントローラのバックオフの遅延時間の最大値を増加し、Service を同期するときに期待される遅延時間の並び(sequence of delays)と一致させました。([#112353](https://github.com/kubernetes/kubernetes/pull/112353), [@dgrisonnet](https://github.com/dgrisonnet))
    - :memo: 遅延時間の並び(sequence of delays)は [Exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff) におけるによる間隔の並びのことです。本 PR では `1s, 2s, 4s, 8s, 16s, 32s, 64s, 128s, 256s, 512s, 1000s` の並びに統一されました。
- kube-proxy は ipvs モードを指定したときに適切にシステムが設定されていないとき、iptables モードにフォールバックしなくなりました。代わりに単にエラーで終了するようになりました。([#111806](https://github.com/kubernetes/kubernetes/pull/111806), [@danwinship](https://github.com/danwinship)) [SIG Network]
- kubeadm: `ClusterConfiguration` の networking フィールドを検証するときのバグを修正しました。([#112751](https://github.com/kubernetes/kubernetes/pull/112751), [@SataQiu](https://github.com/SataQiu))
- kubelet は、`--node-ip` の使用をやめたときに、Node の cloud node IP アノテーションを正しくクリーンアップするようになりました。この修正は、1.23 で external cloud provider で不要に `--node-ip` を指定したことで 1.24 で問題が発生し、kubelet の引数から不要な `--node-ip` を削除してもこのアノテーションが削除されず修正できなかった、という問題を修正します。([#112184](https://github.com/kubernetes/kubernetes/pull/112184), [@danwinship](https://github.com/danwinship)) [SIG Network and Node]
- kubelet: /etc/resolv.conf に複数の option 行があったとき、`Default` DNS ポリシーの Pod では全ての option を一行にマージするようになりました。([#112414](https://github.com/kubernetes/kubernetes/pull/112414), [@pacoxu](https://github.com/pacoxu)) [SIG Network and Node]
    - :memo: 以前までは[複数の options 行があった場合は最後の一行のみが採用される](https://github.com/kubernetes/kubernetes/issues/112323)実装だったようです。
- winkernel proxier が古い VIP を有効として扱ってしまう問題を解決しました。([#113521](https://github.com/kubernetes/kubernetes/pull/113521), [@daschott](https://github.com/daschott))
- ノードにアサインされた `pod.Spec.PodCIDRs` の変更を検知したときに、kube-proxy が再起動されるようになりました。([#111344](https://github.com/kubernetes/kubernetes/pull/111344), [@aojea](https://github.com/aojea))

## その他 (Cleanup or Flake)
- `test/e2e/framework` をリファクタリングしコアフレームワークを小さくしました。リソースの監視、ログサイズの監視、メトリクスの収集、でデバッグ情報のダンプのようなオプショナルな機能は、個別の e2e テストスイートでインポートしなければなりません。今までのコアフレームワークの機能を再度有効する init パッケージが提供されます。この PR によってコードがコンパイルできない場合、[コミットメッセージにある](https://github.com/kubernetes/kubernetes/pull/112043/commits/dfdf88d4faafa6fd39988832ea0ef6d668f490e9)スクリプトを使ってアップデートできます。([#112043](https://github.com/kubernetes/kubernetes/pull/112043), [@pohly](https://github.com/pohly))
- 既存の実装にばらつきがあるため、Kubernetes のネットワークプラグインのコンフォーマンスで、Service セッションアフィニティのタイムアウトのテストは必須でなくなりました。今後のリリースで、より良くコンフォーマンスを表現するコンフォーマンステストが開発される予定です。([#112806](https://github.com/kubernetes/kubernetes/pull/112806), [@dcbw](https://github.com/dcbw)) [SIG Architecture, Network and Testing]


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

- [reworking the kube-proxy's architecture #2104](https://github.com/kubernetes/enhancements/issues/2104)
    - kube-proxy の大幅な刷新 (v2) に関する取り組みです
    - 2020 年 10 月から [PR がレビュー中](https://github.com/kubernetes/enhancements/pull/2094) のままですが、[v1.27 のマイルストーン入った](https://github.com/kubernetes/enhancements/issues/2104#issuecomment-1262579871)ようです
    - 実装は [Kubernetes Proxy NG (KPNG)](https://github.com/kubernetes-sigs/kpng) というレポジトリで実装が進められています
    - 特徴の一つは Kubernetes に関する処理を行うコントローラーと、iptables, ipvs などのバックエンドが gRPC で分離できることで、[独自のバックエンドが簡単に実装](https://kubernetes.io/blog/2021/10/18/use-kpng-to-write-specialized-kube-proxiers/?ref=morioh.com&utm_source=morioh.com#writing-a-backend)できる点です
- [AdminNetworkPolicy support #2091](https://github.com/kubernetes/enhancements/issues/2091)
    - クラスタスコープの NetworkPolicy である AdminNetworkPolicy のサポートです
    - クラスタ管理者がクラスタレベルでのネットワークのポリシーをできるようにする機能です
    - まだ [API の CRD がマージ](https://github.com/kubernetes-sigs/network-policy-api/pull/30)されただけですが NetworkPolicy の不足をカバーしてくれる機能です
- [pod LifecycleHandler should support a sleep option #114465](https://github.com/kubernetes/kubernetes/issues/114465)
    - Kubernetes で安全に Pod を終了するときに必要な sleep を LifecycleHandler に組み込むという提案です
        - sleep の必要性は @superbrothers さんの https://qiita.com/superbrothers/items/3ac78daba3560ea406b2 が参考になります
    - この issue に気づかず[自分も似た提案を SIG-Network の ML にポスト](https://github.com/kubernetes/kubernetes/issues/114465#issuecomment-1354237976)しましたが、この issue が先にあったので撤回しました
    - `sig/network` のラベルは付いていませんが関係ありそうなので紹介します

参考

- [SIG-Network KEPs](https://github.com/orgs/kubernetes/projects/10) SIG-Network の KEP が管理されているダッシュボード
- [SIG-Network の議事録](https://github.com/kubernetes/community/tree/master/sig-network)
- [sig/network ラベル付きの open な issue](https://github.com/kubernetes/kubernetes/issues?q=is%3Aissue+is%3Aopen+label%3Asig%2Fnetwork)