はじめに
Kubernetes v1.25がリリースされました
今回SIG-API主体な変更は少ないですが、全体でみると一番はPSPの廃止でしょうか。GAした機能では、EphemeralContainerや、前々リリースのv1.23で入ったCELによるCRDバリデーションがあります。
また、個人的に気になる機能は実装の今回ちょいちょい変更の入っているKEP-3229です。Podのエラーに合わせてJobのリトライを制御する機能は嬉しい人が多いかと思います。
それでは、API周りの変更を担当するSIG-API Machineryの変更点をCHANGELOGからピックアックします。(がついた文章は、CHANGELOGの公式の内容ではなく筆者の補足です)
SIG, KEPについてはこちらを参照ください。
Urgent Upgrade Notes
-
非推奨となったBeta APIの公開が停止し、削除スケジュールがドキュメントに記載されました。詳しくは https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-25 をご覧ください。(#108797)
-
上記ドキュメントには、v1.27までの削除スケジュールが記載されています。v1.25で公開が停止したBeta APIは以下の通りです
- batch/v1beta1
- discovery.k8s.io/v1beta1
- events.k8s.io/v1beta1
- autoscaling/v2beta1
- policy/v1beta1
- policy/v1beta1
- node.k8s.io/v1beta1
-
上記ドキュメントには、v1.27までの削除スケジュールが記載されています。v1.25で公開が停止したBeta APIは以下の通りです
- e2eテストライブラリのGinkgoがv1からv2にアップグレードされました。 Ginkgo CLIでtest/e2eを実行する場合、v2のCLIを使用してください。また、デフォルトのタイムアウトが24hから1hになっているので、
-timeout=24h
など適切な値を渡してください。Ginkgo V2 は go test の-parallel
フラグを受け付けないため、代わりにginkgo -p
またはginkgo -procs=N
を設定してください。(#109111) -
Kubernetesの公式イメージのOCIイメージレジストリ(
registry.k8s.io
)ができました。古いレジストリ(k8s.gcr.io
)もしばらくサポートされますが、新しいレジストリはミラーが設定されているので、パフォーマンスの面でおすすめです。(#109938)- Admission/Policyでレジストリの許可リストを設定している場合は、
k8s.gcr.io
と共にregistry.k8s.io
も設定してください - エアギャップ環境やイメージのガベージコレクション設定がある場合も、
k8s.gcr.io
に加えてregistry.k8s.io
の設定が必要になります
- Admission/Policyでレジストリの許可リストを設定している場合は、
Deprecation (非推奨になったAPI)
- Kube-controller-managerのフラグから
deleting-pods-qps
,deleting-pods-burst
,register-retry-count
が削除されました。 (#109612)- v1.10時点で非推奨になっていたフラグが削除されています。
-
gcp
とazure
の認証プラグインは client-go と kubectl から削除されました。詳しくはhttps://github.com/Azure/kubelogin と https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke を参照してください (#110013) - 1.21 から非推奨になっていた
PodSecurityPolicy
のbeta admission pluginは削除されました。v1.25にアップグレードする前に、Migrate from PodSecurityPolicy to the Built-In PodSecurity Admission Controller にある指示に従って、組み込みのPodSecurity admission plugin(または他のサードパーティのwebhook)に移行してください。(#109798)
API Changes (API周りの変更)
- PodSpecの
TopologySpreadConstraints
にNodeInclusionPolicy
を追加しました。(#108492) - KMSのv2alpha1が追加されました。(#111126)
- v1.25で、PodSecurity
restricted
レベルでは、 .spec.os.name="windows" を利用するPodにLinux固有のsecurityContextフィールドの設定が不要になりました。v1.25以降のクラスタにv1.23以前のノードが存在し、かつLinux固有のsecurityContextフィールドを引き続き必須としたい場合、Namespaceにラベル(e.g.pod-security.kubernetes.io/enforce-version: v1.24
)を付与してv1.25以前のrestricted
バージョンが選択されるように設定してください。(#105919) - Pod障害Policyに応じてPod障害を処理するようになりました。(#111113)
- JobのPodが失敗した際に、ExitCodeに応じた処理を定義できるようになりました。詳しくはKEP-3229 Retriable and Non Retriable Failuresを参照してください。
- Kube-Schedulerの
ComponentConfig
がGAに昇格し、kubescheduler.config.k8s.io/v1
が有効になりました。SelectorSpread
プラグインはv1で削除されています。(#110534) - ローカルストレージの容量分離機能がGAしました。rootファイルシステムを確認できないシステム(rootless)では、
kubelet config --local-storage-capacity-isolation=false
でこの機能を無効にしてください。無効化すると、LocalEphemeralStorageのrequest/limitと、emptyDirのsizeLimit
を設定できなくなります。(#111513) - CronJobのTimeZone機能がBetaに昇格しました。(#111435)
- Pod
spec.podOS
フィールドがGAに昇格しました。FeatureGateのIdentifyPodOS
が常に有効になります。1.27では--feature-gates
パラメータからも削除予定です。 (#111229) - ローリングアップグレード後も
PodTopologySpread
が反映されるようになりました。(#111441) -
CSIInlineVolume
がBetaからGAに昇格しました。(#111258) - Admissionプラグイン
PodSecurity
がGAに昇格し、デフォルト有効になりました。AdmissionConfigのバージョンはpod-security.admission.config.k8s.io/v1
に昇格しました。 (#110459) - Network Policyの
endPort
フィールドがGAに昇格しました。endPort
フィールドをサポートするNetwork Policyプロバイダは、Network Policyを適用するポートの範囲を指定できます。以前のNetwork Policyは、1ポートのみを指定可能でした。endPort
フィールドは、Network Policyプロバイダがサポートしている場合のみ利用できます。プロバイダがendPort
をサポートしていない場合、Network Policyはport
フィールド(単一ポート)のみを対象としたものが作成されます。(#110868) -
metadata.clusterName
フィールドが削除されました。これによるユーザー影響は特にありません。(#109602) - Pod Topology Spreadの
minDomains
フィールドがBetaに昇格しました。(#110388) - kube-controller-managerの
enable-taint-manager
フラグが非推奨になりました。1.26 で削除予定です。taint-based eviction機能は既にデフォルト有効になっているため、フラグが削除されても利用できます。(#111411) - CSI Driver Clientに
NodeExpandSecret
が追加されました。Nodeを拡張する際に、CSI DriverがこのSecretを利用できるようになりました。以前はnodeexpansion
呼び出しの一部として秘密鍵が提供できませんでした。(#105963) -
EphemeralContainerがGAしました。
EphemeralContainers
のFeatureGateは常に有効になります。また、kube-apiserverとkubelet--feature-gates
フラグから削除が必要です。FeatureGateのEphemeralContainers
は、今後のリリースで削除予定です。詳しくは非推奨および削除予定を参照してください。(#111402)- 2016年からDebug用の機能欲しいというIssueがたてられてから、ついに1.25でGAしました! 詳しくは KEP-277 Ephemeral Container を参照してください。
Features (機能追加)
- KMS
v2alpha1
APIが追加されました。(#110201) - dynamic
ResourceInterface
にApply
とApplyStatus
メソッドが追加されました。 (#109443)- typed clientには既にApply/ApplyStatusが実装されているので、dynamic clientにも追加したようです。
-
ServerSideFieldValidation
がBetaに昇格しました。schema検証がserver-sideで実施されるようになり、リクエストにinvalid/unknownなフィールドがあった場合にはデフォルトでwarningが表示されるようになります。(#110178)- いままではclient側でバリデーションされていましたが、デフォルトでserver-sideで実施されるようになりました。v1.24でも一度ベータに上がったのですが、バグが発見されたためアルファに戻り、1.25で正式にベータに昇格しました。詳しくはKEP-2885 Server Side Unknown Field Validationを参照してください。
-
CustomResourceValidationExpressions
がBetaに昇格しました。FeatureGateのCustomResourceValidationExpressions
はデフォルト有効になります。(#111524)- これでCRDの単体で完結するようなValidationであればwebhook使わずCELでいけそうです。詳しくは KEP-2876 CRD Validation Expression Language を参照してください。
- Etcdのバージョンがv3.5.4になりました (#110033)
- 対応中の https://issue.k8s.io/111911 が修正されるまで、
gcp
とazure
のauth pluginがclient-goとkubectlに復活しました。(#111918) - status=TrueのPodがDisruptionTargetを満したまま、DeletionTimestampが更新されずに2分以上経過した場合、controle planeがstatus=Falseをセットするようになりました。(#111475)
- 詳しくはKEP-3329 Retriable and Non Retriable Failuresを参照してください
Bug or Regression (バグ修正)
- api-server: 複数のwebhookをロードする際のauditの処理が修正されました。(#110145)
- 関数リテラル内でループ変数を掴んでしまうよくあるやつ
- strict server-sideフィールド検証で
metadata
フィールドをunknownフィールドとして検出してしまうバグを修正しました。(#109268) - AuthenticatedGroupAdderとキャッシュされたauth token間のデータ競合を修正しました。(#109969)
- スキーマが未指定(preserveUnknownFields)の大きなオブジェクトをSSA経由で作成する際のパフォーマンス問題が修正されました。(#111557)
- Informer/Reflectorの呼び出し元が、特定のAPIエラーをタイプ別にunwrapできるようになりました。(#110076)
-
fmt.Errorf
で%v
でエラーを埋めこむのではなく%w
が使われるようになってます。
-
- kube-apiserver: シャットダウン中にapiserverのcacherがGet/GetList/Watchリクエストを受けつけるとdeadlockする可能性があるため、拒否するようになりました。(#108414)
- ManafedFiledの値が変更された際に、正しく時間が更新されるようになりました。(#110058)
-
今まで
managedFields.time
の値はApply時のみ更新されていましたが、manfedFiledが更新された際は常に更新するようになりました。
-
今まで
- OpenAPIは以下のスキーマを複製しなくなりました。(#110179)
- io.k8s.apimachinery.pkg.apis.meta.v1.DeleteOptions_v2
- io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta_v2
- io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference_v2
- io.k8s.apimachinery.pkg.apis.meta.v1.StatusDetails_v2
- io.k8s.apimachinery.pkg.apis.meta.v1.Status_v2
- validation admission webhookの検証中に発生したpanicを検出し、fail open/closeの設定に応じて処理するようになりました。(#108746)
- Namespaceのeditorとownerが
leases.coordination.k8s.io
を作成できるようになりました。leaderelectionでは、configmapではなくleasesを利用してください。(#111472) - discovery cacheとの整合性を確保するため、fsyncの代わりにchecksumを使うようになりました。 (#110851)
- MacOSでfsyncをつかったdiscoveryをすると遅いということでこの修正が入ったようです。