Kubernetes 1.27 の SIG-Network の変更内容をまとめました。kube-proxy の iptables 処理の最適化を行う MinimizeIPTablesRestore 機能がデフォルトで有効になったため、大規模クラスタでは改善が期待できそうです。
過去の SIG-Network の変更内容
- Kubernetes 1.26: SIG-Network の変更内容
- Kubernetes 1.25: SIG-Network の変更内容
- Kubernetes 1.24: SIG-Network の変更内容
- Kubernetes 1.23: SIG-Network の変更内容
- Kubernetes 1.22: SIG-Network の変更内容
- Kubernetes 1.21: SIG-Network の変更内容
- Kubernetes 1.20: SIG-Network の変更内容
- Kubernetes 1.19: SIG-Network の変更内容
- Kubernetes 1.18: SIG-Network の変更内容
- Kubernetes 1.17: SIG-Network の変更内容
- Kubernetes 1.16: SIG-Network の変更内容
- Kubernetes 1.15: SIG-Network の変更内容
- Kubernetes 1.14: SIG-Network の変更内容
以下は、Kubernetes v1.27 の Changelog を和訳したものです。 の部分は筆者の補足になります。
Kubernetes 1.26 と 1.27 の API 差分
Kubernetes API (/api/
, /apis/
) から取得した情報を使って、Kubernetes 1.26 と 1.27 のデフォルトで有効な API の差分を確認しました。今回の変更は API の削除 1 つだけでした。
- API の追加: なし
- API の削除:
- storage.k8s.io/v1beta1/csistoragecapacities (v1 に切り替えましょう)
- Deprecation の指定: なし
多くの API は既に GA となっており、v1.27 でデフォルト有効な beta は以下の 4 つだけとなっています。なお v2 の API は未だに Horizontal Pod Autoscaler のみです。
flowcontrol.apiserver.k8s.io/v1beta2/flowschemas D
flowcontrol.apiserver.k8s.io/v1beta2/prioritylevelconfigurations D
flowcontrol.apiserver.k8s.io/v1beta3/flowschemas
flowcontrol.apiserver.k8s.io/v1beta3/prioritylevelconfigurations
各 Kubernetes の API バージョン対応表も、Kubernetes 1.27 時点での情報に更新しました。
Urgent Upgrade Notes (アップグレード前に確認が必要なこと)
- 外部クラウドプロバイダ(external cloud provider) の
IPv6DualStack
フィーチャーゲートが削除されました。(この機能は 1.23 で GA となり、他のコンポーネントでは数リリース前にゲートが削除されています)手動でこれを有効にしている場合、今すぐ指定をやめる必要があります。(#116255, @danwinship)
Changes by Kind (Kind ごとの変更)
- Service API に警告が追加されました。Service が次の場合、Kubernetes は警告を出すようになりました。
- 先頭にゼロがつく IP アドレス
- 標準的 (RFC 5952) でない形式の IPv6 アドレス (#114505, @aojea)
- CVE-2021-29923 に関連したセキュリティ上の修正です。
- net.ParseIP は Go 1.17 からこの形式に非対応のため fork 版の ParseIPSloppy が利用されています。
例えば 010.096.000.011
のような先頭に 0
を含む IP アドレスを Service の ClusterIP 指定すると、作成は完了しますが以下のような警告が出ます。先頭に 0
を含む形式は将来的に使えなくなり、Service オブジェクトの再作成も必要なためご注意ください。
$ kubectl apply -f leading-zero-svc.yaml
Warning: spec.clusterIPs[0]: IP address was accepted, but will be invalid in a future Kubernetes release: ParseAddr("010.096.000.011"): IPv4 field has octet with leading zero
service/leading-zero created
この IP アドレスは先頭のゼロを除いて十進数 (decimal) と解釈された 10.96.0.11
になります。先頭のゼロがある場合に八進数 (octal) として解釈するライブラリもあり CVE-2021-29923 の脆弱性となっていたようです。
$ kubectl run -it --rm --restart=Never curl --image curlimages/curl:7.88.1 \
-- -sI http://10.96.0.11/
HTTP/1.1 200 OK
Server: nginx/1.23.4
Service オブジェクト上は 010.096.000.011
と 0
を含んだままの形となっています。
$ kubectl get svc leading-zero
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
leading-zero ClusterIP 010.096.000.011 <none> 80/TCP 83s
そのため、先頭の 0
を抜いて Service を apply し直すとエラーとなります。Service の clusterIP は immutable のため変更できないため、先頭 0
を含む Service を誤って作ってしまった場合は再作成が必要となります。
The Service "leading-zero" is invalid: spec.clusterIPs[0]: Invalid value: []string{"10.96.0.11"}: may not change once set
API Change (API の変更)
- 新しく IPAddress というオブジェクトの種別 (kind) が追加されました
- 新しい ClusterIP アロケータを追加しました。新しいアロケータは IPv4 の以前の Service CIDR ブロックのサイズをなくし、IPv6 のサイズを /64 に制限します。 #115075, @aojea) [SIG API Machinery, Apps, Auth, CLI, Cluster Lifecycle, Network and Testing]
-
KEP-1880: Multiple Service CIDRs 関連の取り組みです。利用には
MultiCIDRServiceAllocator
というフィーチャーゲートを有効にする必要があります。
-
service.kubernetes.io/topology-aware-hints
とservice.kubernetes.io/topology-mode
のアノテーションが両方セットされていたときに、どちらも同じ値になっていることを確認する検証を追加しました。また、service.kubernetes.io/topology-aware-hints
アノテーションが使われた場合に、非推奨の警告 (deprecation warning)が追加されました。(#116612, @robscott) - 新しい
service.kubernetes.io/topology-mode
アノテーションがservice.kubernetes.io/topology-aware-hints
アノテーションの代わりとして導入されました。 - 更新: AppProtocol フィールドの説明を再定義し、新しい標準の値を追加しました。(#115433, @LiorLieberman) [SIG API Machinery, Apps and Network]
-
KEP-3726: Standard Application Protocols 関連の取り組みです。今回は
kubernetes.io/h2c
,kubernetes.io/grpc
が Kubernetes 独自の標準の値として追加されています。
-
KEP-3726: Standard Application Protocols 関連の取り組みです。今回は
Feature (機能追加)
- 大規模クラスタで kube-proxy の iptables モードのパフォーマンスを改善する新機能が有効になりました。対応は不要ですが
- もし Service が iptables に正しく同期されない問題が起きたときは、kube-proxy に
--feature-gates=MinimizeIPTablesRestore=false
を指定することでこの機能を無効にできます(もしこれで治った場合バグとしてあげてください)。(この問題はsync_proxy_rules_iptables_partial_restore_failures_total
のメトリックの値が上昇することで検出できるかもしれません) - もしパフォーマンス上の理由で kube-proxy の設定を上書きしていた場合、それは不要になるかもしれません。https://kubernetes.io/docs/reference/networking/virtual-ips/#optimizing-iptables-mode-performance をご覧ください。 (#115138, @danwinship) [SIG Network]
-
大規模クラスタでは
minSyncPeriod
,syncPeriod
の調整な場合がありましたが。それが不要になったようです。
- もし Service が iptables に正しく同期されない問題が起きたときは、kube-proxy に
- 新しいフィーチャーゲート ServiceNodePortStaticSubrange は NodePort サービスポートアロケータの新しいストラテジを有効にします。ノードポートの範囲を分割し Service のノードポートの動的割当を上位の範囲から優先的に行うようになります。 (#114418, @xuzhenglun)
- ServiceIPStaticSubrange のノードポート版です
- 参考: Kubernetes: Service の静的 IP 用レンジを分割する (ServiceIPStaticSubrange)
- アルファの
CloudNodeIPs
フィーチャーゲートを kubelet とクラウドプロバイダで有効にすることで、デュアルスタックの--node-ip
の値を指定できるようになります。(この機能をサポートする外部クラウドプロバイダの利用時) (#116305, @danwinship) [SIG API Machinery, Cloud Provider, Network and Node] - GPRC probe は TIME-WAIT 状態を改善するため 1 秒の linger オプションを設定するようになりました。(#115321, @rphillips) [SIG Network and Node]
- Kubelet の TCP と HTTP probe はネットワークリソース(conntrack エントリ、ソケット)をより効果的に使用するようになりました。これはコネクションの
TIME-WAIT
状態をデフォルト 60 秒から 1 秒に減らすことで実現されています。これにより kubelet はソケットと関連した conntrack エントリ、エフェメラルポートを開放できるようになります。(#115143, @aojea) - kubelet はデフォルトで Pod に
net.ipv4.ip_local_reserved_ports
sysctl の使用を許可するようになりした。最小カーネルバージョンは 3.16 です。Pod Security admission で v1.27 以上の baseline と restricted ポリシーでこの sysctl を許可します。(#115374, @pacoxu) [SIG Auth, Network and Node] - Node
ipam
コントローラは、割り当てられる CIDR の最大値に関するメトリクスcidrset_cidrs_max_total
とmulticidrset_cidrs_max_total
を公開するようになりました。(#112260, @aryan9600) - mount-utils マウンタはフォーマット操作を同時に行う数の制限をオプションとして提供するようになりました。(#115379, @artemvmin) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node and Storage]
- GCP の Persistent Disk CSI Driver では同時実行数を 1 に設定したようです。
- kubelet はデフォルトで特定のレガシーな iptables ルールを作らないようになりました。このルールに不適切に依存したサードパーティコンポーネントでは、問題が起きる可能性があります。影響があった場合、kubelet に
--feature-gates=IPTablesOwnershipCleanup=false
を付けることができますが、そのサードパーティコンポーネントに対してもバグの報告も行ってください。 (#114472, @danwinship) -
kube-proxy
がContextualLogging
,LoggingAlphaOptions
,LoggingBetaOptions
を受け入れるようになりました。(#115233, @pohly)
Failing Test (失敗しているテスト)
- Windows 上で kubelet の設定
--resolv-conf=Host
を設定したとき、kubelet が意図した通り Pod DNS ポリシーを適用するようになりました。(#110566, @claudiubelu)
Bug or Regression (バグまたはリグレッション)
- すでに #109706 で開始されていた #111539 の部分的な修正を拡大しました。
具体的には、CCM 内のETP=local
のサービスの同期回数をさらに減らし、LB の再構成を大幅に回避しました。(#111658, @alexanderConstantinescu) - IPV4 場合のファイル内容のチェックがデフォルトでは有効でなくなりました。
kubeadm init
またはkubeadm join
ためのIPV4P
またはIPV6
のチェックは、その IP アドレスファミリをサポートするクラスタを作成するときのみ実施されます。(#115420, @chendave) - NodeIP が変更された場合に Route コントローラが更新されるように修正しました (#108095, @lzhecheng)
- 標準ではない形式のカスタムエンドポイントに対して、
EndpointSlice
ミラーリングコントローラが複数のスライスを生成するバグを修正しました。(#114155, @aojea) - IP アドレスが重複した Pod を EndpointSlice を誤って処理する可能性のある EndpointSlice コントローラのハッシュのバグを修正しました。例えば、completed になった Pod に割り当てられた IP アドレスが新しい Pod に再利用されたときに発生する可能性がありました。(#115907, @qinqon) [SIG Apps and Network]
- Winkernel Proxier の問題を修正。
ExternalTrafficPolicy
がローカルに設定され、利用できるエンドポイントが全てremoteEndpoints
だったとき Cluster IP ロードバランサが抜けていた問題がありました。(#115919, @princepereira) - Winkernel Proxier の問題を修正。Internal Traffic Policy が
Local
のロードバランサ Service のエンドポイントを水平スケールしているときに、予期せずアクティブな TCP 接続の切断が発生する問題がありました。(#113742, @princepereira) - Winkernel Proxier の問題を修正。service が
ipFamilyPolicy
:RequireDualStack
に設定されたとき、IPV6 ロードバランサのポリシーが抜けていた問題がありました。(#115503, @princepereira) - Winkernel Proxier の問題を修正。service が
ipFamilyPolicy
:RequireDualStack
に設定されたとき、IPV6 ロードバランサのポリシーが抜けていた問題がありました。(#115577, @princepereira)- ユニットテストが別 PR として出されていただけでした
- Winkernel Proxier の問題を修正。全てのエンドポイントが停止中(terminating)のときの Ingress ロードバランサのルールがありませんでした。(#113776, @princepereira)
- #115825 の修正。kube-proxy は LB の HC のレスポンスに
healthz
の状態を含めるようになり、kube-proxy が正常ではないときに LB が対象のノードを使用しないようになりました。(#111661, @alexanderConstantinescu) [SIG Network] - IPVS: 任意の ipvs スケジューラが構成できるようになりました。もし利用できないスケジューラが構成された場合、
kube-proxy
はリスタートするためログをチェックしなければなりません。(今までと同様ですが、別のログが出力される)(#114878, @uablrek)-
ipvs のスケジューラのバリデーションが削除されました。利用できるスケジューラは man ipvsadm の
--scheduler
の項目で確認できます。
-
ipvs のスケジューラのバリデーションが削除されました。利用できるスケジューラは man ipvsadm の
-
ingressClass
アノテーションとIngressClassName
の両方が設定された Ingress が作れるようになりました。(#115447, @AxeZhan) - Internal Traffic Policy:
Local
の属性によってLoadBalancer
作成の最適化を行いました。(#114407, @princepereira) - Shared informer は同期しているかどうかを正しく伝搬するようになりました。各 informer ハンドラは新しい
HasSynced
メソッドを使って同期しているかどうかをチェックできます。コントローラが初期リストのアイテムの作業が完了したかどうかを追跡する、ライブラリサポートが追加されました。(AsyncTracker
) (#113985, @lavalamp)- もともと informer には HasSynced メソッドがあるのですが、API サーバーからのオブジェクト取得の同期に完了を示していました。今回はハンドラの処理の同期完了がわかるようになったようです。
- type
ExternalName
のService
はEndpoint
を作らないようになりました。(#114814, @panslava) -
--proxy-mode=ipvs
を指定したkube-prixy
が静的リンクされたカーネルで利用できるようになりました。rfc5737
にある予約された IPv4 の範囲TEST-NET-2
は、アドレス198.51.100.0
がプローブに使われるため、ClusterIP
またはloadBalancerIP
として使用してはいけません。(#114669, @uablrek)
Other (その他)
-
iptables
ユーティリティの誤ったログ情報を修正しました。 (#110723, @yangjunmyfm192085) -
pkg/controller/nodeipam/ipam/cloud_cidr_allocator.go, pkg/controller/nodeipam/ipam/multi_cidr_range_allocator.go pkg/controller/nodeipam/ipam/range_allocator.go pkg/controller/nodelifecycle/node_lifecycle_controller.go
を構造化ログに移行しました。(#112670, @yangjunmyfm192085) - [KCCM - service controller]: クラスタオートスケーラによるノードのダウンスケール時に、終了中 Pod に対するコネクションのドレインを有効にしました。これはクラスタオートスケーラがノードが消えることを示す taint に反応しないようにすることで実現しています、そのため VM が完全に削除されるまでロードバランサによってノードは参照され続けます。(#115204, @alexanderConstantinescu)
直近のトピック
KubeCon EU 2023 のセッション SIG Network: Intro and Updates で、SIG-Network の今後の取り組みについて話があったので、GA (予定を含む) として挙げられていたものを簡単に紹介します。詳細なロードマップは SIG-Network の GitHub Project に記載されています。
https://kccnceu2023.sched.com/event/1HyUk/sig-network-intro-and-updates-antonio-ojea-garcia-google-surya-seetharaman-red-hat-shane-utt-kong より引用
Gateway API
Gateway API はルーティングとロードバランサの API です。Ingress を HTTP 以外にも拡張したような仕様となっています。今年 GA を目標としているようです。20 以上の実装が存在し Cilium, Istio などでもベータとして実装されています。
https://kccnceu2023.sched.com/event/1HyUk/sig-network-intro-and-updates-antonio-ojea-garcia-google-surya-seetharaman-red-hat-shane-utt-kong より引用
Service Internal Traffic Policy
Service の spec.internalTrafficPolicy
フィールドを追加し、従来の方式 Cluster
に加えて、同一ノード上の Pod だけにルーティングする Local
を追加する取り組みです。Kubernetes v1.22 からデフォルト有効で、v1.26 で GA となっています。
- KEP-2086: Service Internal Traffic Policy
- https://kubernetes.io/docs/concepts/services-networking/service-traffic-policy/
Reserve Service IP Ranges For Dynamic and Static IP Allocation
Service の静的 IP アドレス用のレンジを分割し、動的 IP アドレスと、静的 IP アドレスの衝突リスクを減らすための機能です。Kubernetes v1.26 で GA となっています 。
Terminating Endpoints
終了中 (terminating) の Pod のエンドポイントを graceful に扱うための取り組みです。EndpointSliceTerminatingCondition
は v1.26 で GA となっています。kube-proxy 側の対応 ProxyTerminatingEndpoints
はデフォルトで有効ですが、v1.27 では beta です。
- KEP-1672: Tracking Terminating Endpoints in the EndpointSlice API
- KEP-1669: Proxy Terminating Endpoints
https://kccnceu2023.sched.com/event/1HyUk/sig-network-intro-and-updates-antonio-ojea-garcia-google-surya-seetharaman-red-hat-shane-utt-kong より引用