Kubernetes 1.25 の SIG-Network の変更内容をまとめました。
今回は SIG-Network の大きな変更はありませんでしたが、1.25 では Pod Security Policyを含む複数の廃止予定だった API が削除されているためご注意ください。
過去の 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.25 の Changelog を和訳したものです。 の部分は筆者の補足になります。
Major Themes (主なテーマ)
Network Policy の endPort が stable (GA) に昇格
Network Policy の endPort
が GA に昇格しました。endPort
フィールドをサポートする Network Policy のプロバイダは、Network Policy を適用するポートの範囲を指定できるようになります。以前までは、各 Network Policy は単一のポートしか対象にできませんでした。
endPort
フィールドが Network Policy プロバイダによって、サポートされていなければならないことに注意してください。もしあなたのプロバイダが endPort
をサポートせず、このフィールドが Network Policy で指定された場合、Network Policy は単一の port フィールドのみをカバーしたものが作られます。
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 が厳密に必要とするものだけに減少しました。
以下は各 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 |
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)
- HNS v2 API のみのサポートとなりました。(HNS = Host Networking Service)
API Change (API の変更)
- Pod のユーザ名前空間のアルファサポートが追加されました (KEP 127, feature gate: UserNamespacesStatelessPodsSupport) (#111090, @rata)
- v1.25 の Kubernetes は Golang 1.19 が使われるようになりました。GA 版がまだ利用できないため、この PR では 1.19rc2 にアップデートします (#111254, @dims)
- 後の https://github.com/kubernetes/kubernetes/pull/111679 で 1.19 の GA 版が使われるようになっています
- アルファ機能として 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]
- クライアントの Strategic merge patch で同一ポートで違うプロトコルを指定したときに、情報がおかしくなるようです https://github.com/kubernetes/kubernetes/issues/103544
- 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)- 1.24 でアルファとして導入された機能です。次の 1.26 で GA となりそうです (#112163)。
- 参考: Kubernetes: Service の静的 IP 用レンジを分割する (ServiceIPStaticSubrange)
- Cloud Node Lifecycle コンローローラのメトリクス
running_managed_controllers
が有効になりました (#111033, @jprzychodzen) - KCM 内の Node IPAM コントローラのメトリクス
running_managed_controllers
が有効になりました (#111466, @jprzychodzen)- KCM = kube-controller-manager
- KCM と CCM 内の Route、Service、Cloud Node コントローラのメトリクス
running_managed_controllers
が有効になりました (#111462, @jprzychodzen)- 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)
-
kube_apiserver_clusterip_allocator_*
のメトリクスは 1.24 まで正しく報告されていませんでした
-
- 複数の IP アドレスをもつ type
LoadBalancer
の Service と、ノード IP とオーバーラップするLoadBalancerSourceRanges
に関わるバグを修正しました。(#109826, @danwinship)- kube-proxy の iptables ルール生成部分のバグ修正です
- 不適切なアノテーションがされた LoadBalancer サービスがアクティブになる可能性があるバグを修正しました。(#109601, @mdbooth)
- informer から返ってきたオブジェクトを直接変更してはいけないため、コピーして扱うようになりました
-
ServiceIPStaticSubrange
が有効なクラスタで、動的用ブロックが枯渇した場合に重複した IP アドレスがアサインされるバグを修正しました。(#109928, @tksm) - Kubernetes はホスト上の resolv.conf の "search ." を、kubelet が Pod に書き込む "resolv.conf" に "." エントリを保持するようになり、正しく処理するようになりました。(#109441, @Miciah) [SIG Network and Node]
-
resolv.conf のパース時に末尾の
.
を取り除くする処理があり、search .
だけの行が含まれると Pod の resolv.conf にsearch
だけの行が含まれてしまっていました。これにより Pod の DNS に問題がある事象があったようです。
-
resolv.conf のパース時に末尾の
- Pod が停止中にその
readiness
を掲示(post)するようになった (#110191, @rphillips)- 以前は Pod の停止中に readiness probe が実行されず、Pod の停止中は ready が true の状態のままとなっていたようです。
- Windows 上の
kube-proxy
でkernelspace
モードを使ったとき、プロキシールール同期にかかる時間が減少しました。(#109124, @daschott) - ノードの ready の状態が変更したとき、externalTrafficPolicy=Local のクラスタ LB を過剰に再構成することで引き起こされていた、サービスのダウンタイムとクラウド API のコール数が現状しました (https://github.com/kubernetes/kubernetes/issues/111539)。cloud-controller-manager のサービスコントローラは、
Ready
とNotReady
の間の遷移にあるノードの再同期 (resync) を避けるようになりました(ETP=Local サービスの場合のみ)。これらのサービスに使われる LB は、特定のノードがトラフィックのロードバランスに使われるかを決めるのに、healthCheckNodePort
で定義されたヘルスチェックプローブのみに依存します。(#109706, @alexanderConstantinescu)- ETP = ExternalTrafficPolicy
- ロードバランサのバックエンドプールからスケジュール不可(unschedulable)のノードが削除されないように、最近再導入されたスケジュールの predicate (#109706) を削除しました。(#111691, @alexanderConstantinescu)
-
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)-
Pod のターミナル(terminal) は、Pod のフェーズが
PodFailed
orPodSucceeded
で判定されています。
-
Pod のターミナル(terminal) は、Pod のフェーズが
- 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]
- IngressClass の選択は、後に作成されたものが優先される実装になっていました。(作成時間が同じ場合は name の文字列が lower な方)
- Kube-proxy: "userspace" プロキシーモードは、Windows のデフォルトですが linux と Windows で廃止予定になりました。v1.26 で、Windows のデフォルトモードは
kernelspace
に変更されます。(#110762, @pandaamanda) [SIG Network]