LoginSignup
3
0

More than 1 year has passed since last update.

Kubernetes 1.25: SIG-Network の変更内容

Last updated at Posted at 2022-09-20

Kubernetes 1.25 の SIG-Network の変更内容をまとめました。

今回は SIG-Network の大きな変更はありませんでしたが、1.25 では Pod Security Policyを含む複数の廃止予定だった API が削除されているためご注意ください。

過去の SIG-Network の変更内容

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

Major Themes (主なテーマ)

Network Policy の endPort が stable (GA) に昇格

Network PolicyendPort が GA に昇格しました。endPort フィールドをサポートする Network Policy のプロバイダは、Network Policy を適用するポートの範囲を指定できるようになります。以前までは、各 Network Policy は単一のポートしか対象にできませんでした。

endPort フィールドが Network Policy プロバイダによって、サポートされていなければならないことに注意してください。もしあなたのプロバイダが endPort をサポートせず、このフィールドが Network Policy で指定された場合、Network Policy は単一の port フィールドのみをカバーしたものが作られます。

:pencil: port に加えて endPort を指定した場合に、ポートの範囲を指定できる機能です。例えば次の例の場合、32000〜32768 のポートの範囲が対象となります。

endPort がサポートされない場合は、今まで通り port フィールドの値 (32000) のみが対象なります。例えば GKE Dataplane V2 は endPort に未対応のようです。(2022/09/07 時点)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: multi-port-egress
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Egress
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      # 32000〜32768 のポートが対象となる
      port: 32000
      endPort: 32768

Kube-proxy イメージは distroless イメージがベースに

以前のリリースでは、kube-proxy のコンテナイメージはベースイメージに Debian を使ってビルドされていました。今回のリリースから、イメージに distroless を使ってビルドされるようになりました。この変更によりイメージサイズは 50% 近く減少し、インストールされたパッケージやファイルは、kube-proxy が厳密に必要とするものだけに減少しました。

:pencil: 以下は各 Kubernetes イメージ (amd64) のサイズです。確かに kube-proxy は 1.24.0 に比べて半分程度になっています。各ベースイメージは distroless に、必要なファイルのみを追加したものが使われています。

イメージ 1.24.0 1.25.0 ベースイメージ
k8s.gcr.io/kube-apiserver 130MB 128MB go-runner
k8s.gcr.io/kube-controller-manager 119MB 117MB go-runner
k8s.gcr.io/kube-scheduler 51MB 50.6MB go-runner
k8s.gcr.io/kube-proxy 130MB 61.7MB distroless-iptables

:pencil: Kubernetes 1.24 と 1.25 の API 差分

Kubernetes API (/api/, /apis/) から取得した情報を使って、Kubernetes 1.24 と 1.25 の API の差分を確認しました。差分は以下になります。今回は PSP の他、deprecated だった API が複数削除されているのでご注意ください。(削除の PR は remove enabled by default beta resources that have been removed #110010)

  • API の追加: なし
  • API の削除:
    • autoscaling/v2beta1/horizontalpodautoscalers
    • batch/v1beta1/cronjobs
    • discovery.k8s.io/v1beta1/endpointslices
    • events.k8s.io/v1beta1/events
    • node.k8s.io/v1beta1/runtimeclasses
    • policy/v1beta1/poddisruptionbudgets
    • policy/v1beta1/podsecuritypolicies
  • Deprecation の指定: なし

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

Deprecation (非推奨)

  • Windows の winkernel kube-proxy は Windows HNS v1 API をサポートしなくなりました (#110957, @papagalu)

API Change (API の変更)

  • Pod のユーザ名前空間のアルファサポートが追加されました (KEP 127, feature gate: UserNamespacesStatelessPodsSupport) (#111090, @rata)
  • v1.25 の Kubernetes は Golang 1.19 が使われるようになりました。GA 版がまだ利用できないため、この PR では 1.19rc2 にアップデートします (#111254, @dims)
  • アルファ機能として NodeIPAM の複数 ClusterCIDR (#2593) のサポートが導入されました。
    フィーチャーゲート MultiCIDRRangeAllocator=true を設定すると、MultiCIDRRangeAllocator を使用するかが決定され、次の kube-controller-manager フラグでアクティブなコントローラを選択します。MultiCIDRRangeAllocator を有効化するには、kube-controller-manager の --cidr-allocator-type=MultiCIDRRangeAllocator フラグを設定します。(#109090, @sarveshr7)
  • PodSpec.Ports の説明で、この情報はただの情報で間違ったものになる可能性があることを明確にしました。(#110564, @j4m3s-s) [SIG API Machinery, Network and Node]
  • Network Policy の endPort フィールドが GA に昇格しました。
    endPort フィールドをサポートする Network Policy のプロバイダは、Network Policy を適用するポートの範囲を指定できるようになります。以前までは、各 Network Policy は単一のポートしか対象にできませんでした。
    endPort フィールドが Network Policy プロバイダによって、サポートされていなければならないことに注意してください。もしあなたのプロバイダが endPort をサポートせず、このフィールドが Network Policy で指定された場合、Network Policy は単一の port フィールドのみをカバーしたものが作られます。(#110868, @rikatz)

Feature (機能追加)

  • ServiceIPStaticSubrange 機能がベータ(デフォルトでは無効)になりました (#110419, @aojea)
  • Cloud Node Lifecycle コンローローラのメトリクス running_managed_controllers が有効になりました (#111033, @jprzychodzen)
  • KCM 内の Node IPAM コントローラのメトリクス running_managed_controllers が有効になりました (#111466, @jprzychodzen)
    • :pencil: KCM = kube-controller-manager
  • KCM と CCM 内の Route、Service、Cloud Node コントローラのメトリクス running_managed_controllers が有効になりました (#111462, @jprzychodzen)
    • :pencil: KCM = kube-controller-manager, CCM = cloud-controller-manager

Documentation (ドキュメント)

  • 存在しないノードを参照した Pod を持つ EndpointSlices は作成・更新ができませんでした。この EndpointSlices コントローラの挙動は、存在しないノードを参照した Pod を除いて EndpointSlice は更新され、全ての Pod が存在するノードを参照するまでリトライを繰り返すように変更されました。しかし service.Spec.PublishNotReadyAddresses が設定されたときは、全ての Pod がリトライなしで設定されます。EndpointSlice のメトリクスが、エンドポイントが存在しないときに要望する EndpointSlice の数を正しく反映するように修正されました。(#110639, @aojea)

Bug or Regression (バグまたはリグレッション)

  • 削除とマークされた EndpointSlice はリコンサイル中に無視されるようになりました。(#109624, @aryan9600)
  • cluster IP アロケータが誤ったメトリクスを報告するバグを修正しました。(#110027, @tksm)
    • :pencil: kube_apiserver_clusterip_allocator_* のメトリクスは 1.24 まで正しく報告されていませんでした
  • 複数の IP アドレスをもつ type LoadBalancer の Service と、ノード IP とオーバーラップする LoadBalancerSourceRanges に関わるバグを修正しました。(#109826, @danwinship)
    • :pencil: kube-proxy の iptables ルール生成部分のバグ修正です
  • 不適切なアノテーションがされた LoadBalancer サービスがアクティブになる可能性があるバグを修正しました。(#109601, @mdbooth)
  • ServiceIPStaticSubrange が有効なクラスタで、動的用ブロックが枯渇した場合に重複した IP アドレスがアサインされるバグを修正しました。(#109928, @tksm)
  • Kubernetes はホスト上の resolv.conf の "search ." を、kubelet が Pod に書き込む "resolv.conf" に "." エントリを保持するようになり、正しく処理するようになりました。(#109441, @Miciah) [SIG Network and Node]
    • :pencil: resolv.conf のパース時に末尾の . を取り除くする処理があり、search . だけの行が含まれると Pod の resolv.conf に search だけの行が含まれてしまっていました。これにより Pod の DNS に問題がある事象があったようです。
  • Pod が停止中にその readiness を掲示(post)するようになった (#110191, @rphillips)
    • :pencil: 以前は Pod の停止中に readiness probe が実行されず、Pod の停止中は ready が true の状態のままとなっていたようです。
  • Windows 上の kube-proxykernelspace モードを使ったとき、プロキシールール同期にかかる時間が減少しました。(#109124, @daschott)
  • ノードの ready の状態が変更したとき、externalTrafficPolicy=Local のクラスタ LB を過剰に再構成することで引き起こされていた、サービスのダウンタイムとクラウド API のコール数が現状しました (https://github.com/kubernetes/kubernetes/issues/111539)。cloud-controller-manager のサービスコントローラは、ReadyNotReady の間の遷移にあるノードの再同期 (resync) を避けるようになりました(ETP=Local サービスの場合のみ)。これらのサービスに使われる LB は、特定のノードがトラフィックのロードバランスに使われるかを決めるのに、healthCheckNodePort で定義されたヘルスチェックプローブのみに依存します。(#109706, @alexanderConstantinescu)
    • :pencil: ETP = ExternalTrafficPolicy
  • ロードバランサのバックエンドプールからスケジュール不可(unschedulable)のノードが削除されないように、最近再導入されたスケジュールの predicate (#109706) を削除しました。(#111691, @alexanderConstantinescu)
    • :pencil: nodeSchedulablePredicate というスケジューラブルかどうかの判定を行う predicate です。
  • kube-proxy の sync_proxy_rules_no_endpoints_total メトリクスは、リモートエンドポイントを持ちローカルエンドポイントを持たない local-traffic-policy のみを数えるようになりました。(#109782, @danwinship)
  • ノードアノテーション alpha.kubernetes.io/provided-node-ip は --cloud-provider=external が設定されたときのみ設定されなくなりました。非推奨のツリー内のプロバイダも含め --cloud-provider フラグが設定されている場合、kubelet 起動時にこのアノテーションが設定されるようになりました。 (#109794, @mdbooth) [SIG Network and Node]
  • Pod フェーズライフサイクルは、Unready または Succeeded の状態のターミナル (terminal) の Pod が、前の状態に戻ることなく全てのコンテナが終了することを保証するようになりました。したがって、ターミナルの Pod に到達されることはなく、Service の TolerateUnready の設定に関係なく Endpoints または EndpointSlices 上に IP アドレスを公開されるべきではありません。(#110255, @robscott)
  • kubelet が pod ネットワークの統計を生成したメトリクスが空になるケースがある問題を修正するため、cAdvisor を v0.44.1 に更新しました。(#109658, @bobbypage)

その他 (Cleanup or Flake)

  • Linux の kube-proxy は、Debian ベースのイメージの代わりに新しい distroless コンテナイメージを使うようになりました。(#111060, @aojea)
  • 複数の IngressClass が "default" に指定されていた場合、DefaultIngressClass アドミッションコントローラは失敗させるのでなく 1 つを選択するようになりました。(#110974, @kidddddddddddddddddddddd) [SIG Network]
  • Kube-proxy: "userspace" プロキシーモードは、Windows のデフォルトですが linux と Windows で廃止予定になりました。v1.26 で、Windows のデフォルトモードは kernelspace に変更されます。(#110762, @pandaamanda) [SIG Network]
3
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
3
0