LoginSignup
4
0

Kubernetes 1.27: SIG-Network の変更内容

Last updated at Posted at 2023-05-12

Kubernetes 1.27 の SIG-Network の変更内容をまとめました。kube-proxy の iptables 処理の最適化を行う MinimizeIPTablesRestore 機能がデフォルトで有効になったため、大規模クラスタでは改善が期待できそうです。

過去の SIG-Network の変更内容

以下は、Kubernetes v1.27 の Changelog を和訳したものです。:pencil: の部分は筆者の補足になります。

:pencil: 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)
    • :pencil: CVE-2021-29923 に関連したセキュリティ上の修正です。
    • :pencil: net.ParseIP は Go 1.17 からこの形式に非対応のため fork 版の ParseIPSloppy が利用されています。

:pencil: 例えば 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.0110 を含んだままの形となっています。

$ 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]
    • :pencil: KEP-1880: Multiple Service CIDRs 関連の取り組みです。利用には MultiCIDRServiceAllocator というフィーチャーゲートを有効にする必要があります。
  • service.kubernetes.io/topology-aware-hintsservice.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 アノテーションの代わりとして導入されました。
    • service.kubernetes.io/topology-aware-hints アノテーションは非推奨となります。
    • kube-proxy はこれらのアノテーションに "disable" 以外の任意の値を受け入れるようになり、カスタムの実装固有または将来的なビルトインのユーリティステイックの使用が可能になりました。(#116522, @robscott) [SIG Apps, Network and Testing]
  • 更新: AppProtocol フィールドの説明を再定義し、新しい標準の値を追加しました。(#115433, @LiorLieberman) [SIG API Machinery, Apps and Network]

Feature (機能追加)

  • 大規模クラスタで kube-proxy の iptables モードのパフォーマンスを改善する新機能が有効になりました。対応は不要ですが
    1. もし Service が iptables に正しく同期されない問題が起きたときは、kube-proxy に --feature-gates=MinimizeIPTablesRestore=false を指定することでこの機能を無効にできます(もしこれで治った場合バグとしてあげてください)。(この問題は sync_proxy_rules_iptables_partial_restore_failures_total のメトリックの値が上昇することで検出できるかもしれません)
    2. もしパフォーマンス上の理由で kube-proxy の設定を上書きしていた場合、それは不要になるかもしれません。https://kubernetes.io/docs/reference/networking/virtual-ips/#optimizing-iptables-mode-performance をご覧ください。 (#115138, @danwinship) [SIG Network]
    • :pencil: 大規模クラスタでは minSyncPeriod, syncPeriod の調整な場合がありましたが。それが不要になったようです。
  • 新しいフィーチャーゲート ServiceNodePortStaticSubrange は NodePort サービスポートアロケータの新しいストラテジを有効にします。ノードポートの範囲を分割し Service のノードポートの動的割当を上位の範囲から優先的に行うようになります。 (#114418, @xuzhenglun)
  • アルファの 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_totalmulticidrset_cidrs_max_total を公開するようになりました。(#112260, @aryan9600)
  • mount-utils マウンタはフォーマット操作を同時に行う数の制限をオプションとして提供するようになりました。(#115379, @artemvmin) [SIG API Machinery, Architecture, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node and Storage]
  • kubelet はデフォルトで特定のレガシーな iptables ルールを作らないようになりました。このルールに不適切に依存したサードパーティコンポーネントでは、問題が起きる可能性があります。影響があった場合、kubelet に --feature-gates=IPTablesOwnershipCleanup=false を付けることができますが、そのサードパーティコンポーネントに対してもバグの報告も行ってください。 (#114472, @danwinship)
  • kube-proxyContextualLogging, 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)
    • :pencil: ユニットテストが別 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)
    • :pencil: ipvs のスケジューラのバリデーションが削除されました。利用できるスケジューラは man ipvsadm--scheduler の項目で確認できます。
  • ingressClass アノテーションと IngressClassName の両方が設定された Ingress が作れるようになりました。(#115447, @AxeZhan)
  • Internal Traffic Policy: Local の属性によって LoadBalancer 作成の最適化を行いました。(#114407, @princepereira)
  • Shared informer は同期しているかどうかを正しく伝搬するようになりました。各 informer ハンドラは新しい HasSynced メソッドを使って同期しているかどうかをチェックできます。コントローラが初期リストのアイテムの作業が完了したかどうかを追跡する、ライブラリサポートが追加されました。(AsyncTracker) (#113985, @lavalamp)
    • :pencil: もともと informer には HasSynced メソッドがあるのですが、API サーバーからのオブジェクト取得の同期に完了を示していました。今回はハンドラの処理の同期完了がわかるようになったようです。
  • type ExternalNameServiceEndpoint を作らないようになりました。(#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)

:pencil: 直近のトピック

KubeCon EU 2023 のセッション SIG Network: Intro and Updates で、SIG-Network の今後の取り組みについて話があったので、GA (予定を含む) として挙げられていたものを簡単に紹介します。詳細なロードマップは SIG-Network の GitHub Project に記載されています。

image.png
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 などでもベータとして実装されています。

image.png
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 となっています。

Reserve Service IP Ranges For Dynamic and Static IP Allocation

Service の静的 IP アドレス用のレンジを分割し、動的 IP アドレスと、静的 IP アドレスの衝突リスクを減らすための機能です。Kubernetes v1.26 で GA となっています :tada:

Terminating Endpoints

終了中 (terminating) の Pod のエンドポイントを graceful に扱うための取り組みです。EndpointSliceTerminatingConditionv1.26 で GA となっています。kube-proxy 側の対応 ProxyTerminatingEndpoints はデフォルトで有効ですが、v1.27 では beta です。

image.png
https://kccnceu2023.sched.com/event/1HyUk/sig-network-intro-and-updates-antonio-ojea-garcia-google-surya-seetharaman-red-hat-shane-utt-kong より引用

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0