Kubernetes 1.21 の 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, @lbernail) [SIG Network and Release]
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 の設定でした。この脆弱性については Kubernetesの脆弱性でクラスタに乗っ取りの危険性(CVE-2020-8558) が詳しいです。
iptables モードの場合、ホストネットワークのプロセスが127.0.0.1:NodePort
でノードポートにアクセスできるようにするため、この設定は残っています。しかし、必要なポート以外への通信は drop するように修正されています。
IPVS モードの場合は、localhost:Nodeport
の形ではもともとアクセスできなかったため route_localnet
の設定自体が削除されたようです。
Deprecation (非推奨)
- Kube-proxy: 非推奨だった kube-proxy の --cleanup-ipvs フラグが削除され、
--cleanup
フラグは常に IPVS をフラッシュするようになりました (#97336, @maaoBit) [SIG Network]
API Changes (API の変更)
- NetworkPolicy に endPort フィールドのサポートが追加されました (#97058, @rikatz) [SIG Apps and Network]
- Service に新たに "InternalTrafficPolicy" フィールドが追加されました。これはクラスタの内部トラフィックを、すべてのエンドポイントにルーティングするか、ノードローカルのエンドポイントのみにルーティングするかを指定します。"Cluster" は、Service への内部トラフィックを、すべてのエンドポイントにルーティングします。"Local" は、ノードローカルのエンドポイントのみルーティングし、ノードローカルのエンドポイントが ready ではないときはトラフィックはドロップされます。デフォルト値は "Cluster" です。(#96600, @maplain) [SIG API Machinery, Apps and Network]
- bazel を使った Kubernetes のビルドがサポートされなくなりました。(#99561, @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, @robscott) [SIG Apps and Network] - Topology Aware ヒントが Alpha として使えるようになり、
TopologyAwareHints
フィーチャーゲートで有効にできるようなりました。(#99522, @robscott) [SIG API Machinery, Apps, Auth, Instrumentation, Network and Testing]
Features (機能追加)
- アルファ機能の
VolumeCapacityPriority
が追加されました。これはスケジューラが、複数のトポロジーをまたがって静的にプロビジョニングされた PV のサイズに基づいて、ノードに優先度をつけるものです。 - Kube-proxy iptables: 新たにメトリック sync_proxy_rules_iptables_total が追加され、各イテレーションでテーブル毎にプログラムされた数を公開するようになりました。(#99653, @aojea) [SIG Instrumentation and Network]
- kubeadm: ipv6 の site-local が非推奨であるという警告がされるようになりました (#99574, @pacoxu) [SIG Cluster Lifecycle and Network]
- バインドされたアドレスの検出に使われる apimachinery の util/net の関数
ResolveBindAddress()
は、1) ホストがデフォルトルートを持っている場合、または2) それらのインタフェースにグローバル IP が存在しない場合、ループバックインタフェースでのグローバル IP アドレスを考慮するようになりました。これは RFC 5549 で定義される BGP Unnumbered のような複雑なネットワークシナリオをサポートするためです。 - IPv6 のサポートを改善するため、node local dns のバージョンが 1.17.0 にアップグレードしました (#99749, @pacoxu) [SIG Cloud Provider and Network]
-
IPv6Dualstack
がBeta
に昇格し、デフォルトで有効になりました。新しいクラスターや既存のクラスターは、IPv4/IPv6 Dual-stack で記載されているように、Pod と Service のセカンダリの CIDRS CLI フラグが追加されるまで影響は受けません。 (#98969, @khenidak)-
--service-cluster-ip-range=<IPv4 CIDR>,<IPv6 CIDR>
,--cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>
のようにセカンダリに IPV6 CIDR を指定します
-
- WindowsEndpointSliceProxying フィーチャーゲートが beta に昇格し、デフォルトで有効になりました。これにより Windows ではデフォルトで、kube-proxy が Endpoints ではなく EndpointSlices を読むようになります。(#99794, @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, @aojea) [SIG Cloud Provider, Network and Node]
Bug or Regression (バグまたはリグレッション)
- EndpointSlice コントローラーが FailedToUpdateEndpointSlices イベント発行する可能性が低くなりました (#99345, @robscott) [SIG Apps and Network]
- EndpointSlice コントローラーが 重複した EndpointSlice を作成する可能性が低くなりました (#100103, @robscott) [SIG Apps and Network]
- EndpointSliceMirroring コントローラーが FailedToUpdateEndpointSlices イベント発行する可能性が低くなりました (#99756, @robscott) [SIG Apps and Network]
- service/nodeport/loadbalancer のクォータチェックのカウントエラーを修正しました (#97451, @pacoxu) [SIG API Machinery, Network and Testing]
- Static CPU ポリシーによって、conntrack-max の値が小さくなってしまうバグを修正しました (#99613, @xh4n3) [SIG Network]
-
kube-proxy は CPU のコア数に応じて、conntrack-max を設定します。Static CPU ポリシーによって
goruntime.NumCPU()
で得られる数が小さくなり、conntrack-max の値が小さく設定される場合があったようです
-
kube-proxy は CPU のコア数に応じて、conntrack-max を設定します。Static CPU ポリシーによって
- k8s ノードで、フィルタテーブルの INPUT チェーンのポリシーが ACCEPT でない場合、ノードポートのヘルスチェックが動作しないバグを修正しました。iptables に、ノードポートへのヘルスチェックのトラフィックを許可するルールが追加されました (#97824, @hanlins) [SIG Network]
-
--volume-host-cidr-denylist
または--volume-host-allow-local-loopback
を使用したときのコネクションエラーを修正しました (#98436, @liggitt) [SIG Network and Storage] - GCE Internal LoadBalancer の同期ループで、同期に失敗した場合に ILB の IP アドレスを開放するようになりました。ILB のフォーワーディングルールの生成でエラーが起きたときに、IP アドレスがリークしないようになりました (#97740, @prameshj) [SIG Cloud Provider and Network]
- Kube-proxy: 非推奨だった kube-proxy の --cleanup-ipvs フラグが削除され、
--cleanup
フラグは常に IPVS をフラッシュするようになりました (#97336, @maaoBit) [SIG Network] - シングルスタック構成 (IPv4, IPv6 のどちらか)のクラスタで、headless (clusterIP 無し) かつセレクタが存在しない (selector が空もしくは未定義) Service は、
ipFamilyPolicy RequireDualStack
を報告するようになり、IPv4 と IPv6 の両方でipFamilies[]
にエントリを持つようになりました。これはアルファからの変更で、手動で指定された Service の Endpoints 及び EndpointSlices には影響がありません。(#99555, @thockin) [SIG Apps and Network] - EndpointSlices で許容するポートの最大値が、100 から 20,000 に増加しました (#99795, @robscott) [SIG Network]
- CNI プラグインがデュアルスタックの Pod IP を返却したとき、CNI プラグインが管理者が望む順序で IP を返すという前提でなく、kubelet はクラスタの"primary IP Family" を遵守し、ノード IP とように同じファミリーのプライマリ Pod IP を選択するようになりました。(CNI プラグインによっては順序の設定ができないためです) (#97979, @danwinship) [SIG Network and Node]