Kubernetes 1.21: SIG-Network の変更内容

[Kubernetes 1.21](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.21.md) の SIG-Network の変更内容をまとめました。

大きな機能追加はありませんが、EndpointSlice のようなスケーラビリティの改善や、IPv6 デュアルスタックの Beta 昇格など、着実な改善がなされています。

## Urgent Upgrade Notes (アップグレード前の注意点)
- kube-proxy の IPVS Proxy モードで、sysctl の net.ipv4.conf.all.route_localnet を設定しなくなりました。アップグレードしたノードは net.ipv4.conf.all.route_localnet が 1 に設定されていますが、新規ノードはシステムのデフォルト(通常 0)を継承します。kube-proxy は自動で設定しなくなるため、もし net.ipv4.conf.all.route_localnet の設定に依存している場合は、自身で設定する必要があります。この変更は CVE-2020-8558 をさらに軽減します。 ([#92938](https://github.com/kubernetes/kubernetes/pull/92938), [@lbernail](https://github.com/lbernail)) [SIG Network and Release]

### :memo: net.ipv4.conf.all.route_localnet と CVE-2020-8558 

CVE-2020-8558 は、Pod からノードの localhost サービス全てにアクセスできてしまう脆弱性です。API Server の `insecure-port` 等、ノードのローカルプロセスから認証なしでアクセスできるような場合に権限昇格が可能でした。この問題を引き起こしていた設定が、kube-proxy が設定する [net.ipv4.conf.all.route_localnet=1](https://github.com/kubernetes/kubernetes/issues/90259) の設定でした。この脆弱性については [Kubernetesの脆弱性でクラスタに乗っ取りの危険性(CVE-2020-8558)](https://unit42.paloaltonetworks.jp/cve-2020-855/) が詳しいです。 

iptables モードの場合、ホストネットワークのプロセスが`127.0.0.1:NodePort` でノードポートにアクセスできるようにするため、この設定は残っています。しかし、必要なポート以外への通信は drop するように修正されています。

- [kubelet: block non-forwarded packets from crossing the localhost boundary #91569](https://github.com/kubernetes/kubernetes/pull/91569)

IPVS モードの場合は、`localhost:Nodeport` の形ではもともとアクセスできなかったため `route_localnet` の設定自体が削除されたようです。

- [Unable use localhost:<nodeport> with IPVS #67730](https://github.com/kubernetes/kubernetes/issues/67730)



## Deprecation (非推奨)
- Kube-proxy: 非推奨だった kube-proxy の --cleanup-ipvs フラグが削除され、`--cleanup` フラグは常に IPVS をフラッシュするようになりました ([#97336](https://github.com/kubernetes/kubernetes/pull/97336), [@maaoBit](https://github.com/maaoBit)) [SIG Network]

## API Changes (API の変更)
- NetworkPolicy に endPort フィールドのサポートが追加されました ([#97058](https://github.com/kubernetes/kubernetes/pull/97058), [@rikatz](https://github.com/rikatz)) [SIG Apps and Network]
- Service に新たに "InternalTrafficPolicy" フィールドが追加されました。これはクラスタの内部トラフィックを、すべてのエンドポイントにルーティングするか、ノードローカルのエンドポイントのみにルーティングするかを指定します。"Cluster" は、Service への内部トラフィックを、すべてのエンドポイントにルーティングします。"Local" は、ノードローカルのエンドポイントのみルーティングし、ノードローカルのエンドポイントが ready ではないときはトラフィックはドロップされます。デフォルト値は "Cluster" です。([#96600](https://github.com/kubernetes/kubernetes/pull/96600), [@maplain](https://github.com/maplain)) [SIG API Machinery, Apps and Network]
    - :memo: [KEP-2086: Service Internal Traffic Policy](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/2086-service-internal-traffic-policy) が KEP です
- bazel を使った Kubernetes のビルドがサポートされなくなりました。([#99561](https://github.com/kubernetes/kubernetes/pull/99561), [@BenTheElder](https://github.com/BenTheElder)) [SIG API Machinery, Apps, Architecture, Auth, Autoscaling, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Scheduling, Storage, Testing and Windows]
- Endpoints Controller は、Endpoint リソースが 1000 以上のアドレスを含むとき、`endpoints.kubernetes.io/over-capacity` アノテーションに "warning" を設定するようになりました。将来のリリースでは、コントローラーは制限を超過した Endpoint を切り詰めるようになります。非常に多いアドレスをサポートする場合は、EndpointSlice API が利用できます。([#99975](https://github.com/kubernetes/kubernetes/pull/99975), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
- Topology Aware ヒントが Alpha として使えるようになり、`TopologyAwareHints` フィーチャーゲートで有効にできるようなりました。([#99522](https://github.com/kubernetes/kubernetes/pull/99522), [@robscott](https://github.com/robscott)) [SIG API Machinery, Apps, Auth, Instrumentation, Network and Testing]


## Features (機能追加)
- アルファ機能の `VolumeCapacityPriority`  が追加されました。これはスケジューラが、複数のトポロジーをまたがって静的にプロビジョニングされた PV のサイズに基づいて、ノードに優先度をつけるものです。
- Kube-proxy iptables: 新たにメトリック sync_proxy_rules_iptables_total が追加され、各イテレーションでテーブル毎にプログラムされた数を公開するようになりました。([#99653](https://github.com/kubernetes/kubernetes/pull/99653), [@aojea](https://github.com/aojea)) [SIG Instrumentation and Network]
- kubeadm: ipv6 の site-local が非推奨であるという警告がされるようになりました ([#99574](https://github.com/kubernetes/kubernetes/pull/99574), [@pacoxu](https://github.com/pacoxu)) [SIG Cluster Lifecycle and Network]
    - :memo:  site-local アドレスは `FEC0::/10` のアドレスブロックを指します ([RFC 3513](https://tools.ietf.org/html/rfc3513))。site-local アドレスは [RFC 3879](https://tools.ietf.org/html/rfc3879) で非推奨になっています。
- バインドされたアドレスの検出に使われる apimachinery の util/net の関数 `ResolveBindAddress()` は、1) ホストがデフォルトルートを持っている場合、または2) それらのインタフェースにグローバル IP が存在しない場合、ループバックインタフェースでのグローバル IP アドレスを考慮するようになりました。これは RFC 5549 で定義される BGP Unnumbered のような複雑なネットワークシナリオをサポートするためです。
- IPv6 のサポートを改善するため、node local dns のバージョンが 1.17.0 にアップグレードしました ([#99749](https://github.com/kubernetes/kubernetes/pull/99749), [@pacoxu](https://github.com/pacoxu)) [SIG Cloud Provider and Network]
- `IPv6Dualstack` が `Beta` に昇格し、デフォルトで有効になりました。新しいクラスターや既存のクラスターは、[IPv4/IPv6 Dual-stack](https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/563-dual-stack) で記載されているように、Pod と Service のセカンダリの CIDRS CLI フラグが追加されるまで影響は受けません。 ([#98969](https://github.com/kubernetes/kubernetes/pull/98969), [@khenidak](https://github.com/khenidak))
    - :memo: `--service-cluster-ip-range=<IPv4 CIDR>,<IPv6 CIDR>`, `--cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>` のようにセカンダリに IPV6 CIDR を指定します
- WindowsEndpointSliceProxying フィーチャーゲートが beta に昇格し、デフォルトで有効になりました。これにより Windows ではデフォルトで、kube-proxy が Endpoints ではなく EndpointSlices を読むようになります。([#99794](https://github.com/kubernetes/kubernetes/pull/99794), [@robscott](https://github.com/robscott)) [SIG Network]


## Failing Test (失敗しているテスト)
- Kubelet: コンフォーマンステストが "HostPort validates that there is no conflict between pods with same hostPort but different hostIP and protocol" の失敗を引き起こしていた、dockershim の HostPort 実装のバグを修正しました。([#98755](https://github.com/kubernetes/kubernetes/pull/98755), [@aojea](https://github.com/aojea)) [SIG Cloud Provider, Network and Node]


## Bug or Regression (バグまたはリグレッション)
- EndpointSlice コントローラーが FailedToUpdateEndpointSlices イベント発行する可能性が低くなりました ([#99345](https://github.com/kubernetes/kubernetes/pull/99345), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
- EndpointSlice コントローラーが 重複した EndpointSlice を作成する可能性が低くなりました ([#100103](https://github.com/kubernetes/kubernetes/pull/100103), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
- EndpointSliceMirroring コントローラーが FailedToUpdateEndpointSlices イベント発行する可能性が低くなりました ([#99756](https://github.com/kubernetes/kubernetes/pull/99756), [@robscott](https://github.com/robscott)) [SIG Apps and Network]
- service/nodeport/loadbalancer のクォータチェックのカウントエラーを修正しました ([#97451](https://github.com/kubernetes/kubernetes/pull/97451), [@pacoxu](https://github.com/pacoxu)) [SIG API Machinery, Network and Testing]
- Static CPU ポリシーによって、conntrack-max の値が小さくなってしまうバグを修正しました ([#99613](https://github.com/kubernetes/kubernetes/pull/99613), [@xh4n3](https://github.com/xh4n3)) [SIG Network]
    - :memo: kube-proxy は CPU のコア数に応じて、conntrack-max を設定します。Static CPU ポリシーによって `goruntime.NumCPU()` で得られる数が小さくなり、conntrack-max の値が小さく設定される場合があったようです
- k8s ノードで、フィルタテーブルの INPUT チェーンのポリシーが ACCEPT でない場合、ノードポートのヘルスチェックが動作しないバグを修正しました。iptables に、ノードポートへのヘルスチェックのトラフィックを許可するルールが追加されました ([#97824](https://github.com/kubernetes/kubernetes/pull/97824), [@hanlins](https://github.com/hanlins)) [SIG Network]
- `--volume-host-cidr-denylist` または `--volume-host-allow-local-loopback` を使用したときのコネクションエラーを修正しました ([#98436](https://github.com/kubernetes/kubernetes/pull/98436), [@liggitt](https://github.com/liggitt)) [SIG Network and Storage]
- GCE Internal LoadBalancer の同期ループで、同期に失敗した場合に ILB の IP アドレスを開放するようになりました。ILB のフォーワーディングルールの生成でエラーが起きたときに、IP アドレスがリークしないようになりました ([#97740](https://github.com/kubernetes/kubernetes/pull/97740), [@prameshj](https://github.com/prameshj)) [SIG Cloud Provider and Network]
- Kube-proxy: 非推奨だった kube-proxy の --cleanup-ipvs フラグが削除され、`--cleanup` フラグは常に IPVS をフラッシュするようになりました ([#97336](https://github.com/kubernetes/kubernetes/pull/97336), [@maaoBit](https://github.com/maaoBit)) [SIG Network]
- シングルスタック構成 (IPv4, IPv6 のどちらか)のクラスタで、headless (clusterIP 無し) かつセレクタが存在しない (selector が空もしくは未定義) Service は、`ipFamilyPolicy RequireDualStack` を報告するようになり、IPv4 と IPv6 の両方で`ipFamilies[]` にエントリを持つようになりました。これはアルファからの変更で、手動で指定された Service の Endpoints 及び EndpointSlices には影響がありません。([#99555](https://github.com/kubernetes/kubernetes/pull/99555), [@thockin](https://github.com/thockin)) [SIG Apps and Network]
- EndpointSlices で許容するポートの最大値が、100 から 20,000 に増加しました ([#99795](https://github.com/kubernetes/kubernetes/pull/99795), [@robscott](https://github.com/robscott)) [SIG Network]
- CNI プラグインがデュアルスタックの Pod IP を返却したとき、CNI プラグインが管理者が望む順序で IP を返すという前提でなく、kubelet はクラスタの"primary IP Family" を遵守し、ノード IP とように同じファミリーのプライマリ Pod IP を選択するようになりました。(CNI プラグインによっては順序の設定ができないためです) ([#97979](https://github.com/kubernetes/kubernetes/pull/97979), [@danwinship](https://github.com/danwinship)) [SIG Network and Node]


### その他 (Cleanup or Flake)
- EndpointSlice の generationn はラベルの変更時にも増加するようになりました  ([#99750](https://github.com/kubernetes/kubernetes/pull/99750), [@robscott](https://github.com/robscott)) [SIG Network]
- Kube-proxy: クラスタから ExternalIPs へのトラフィックは、Serviceに直接送られるようになりました  ([#96296](https://github.com/kubernetes/kubernetes/pull/96296), [@aojea](https://github.com/aojea)) [SIG Network and Testing]
- コントローラー同士の衝突により、Ingress のコンフォーマンステストでたまに失敗する問題 (flake) を解決しました  ([#98430](https://github.com/kubernetes/kubernetes/pull/98430), [@liggitt](https://github.com/liggitt)) [SIG Network and Testing]