はじめに
Kubernetes v1.23がリリースされました ![]()
期待していたIn-place Pod Vertical Scalingは入りませんでしたが、待望のEphemeral ContainerがBetaに昇格してデフォルト有効になったり、CEL expression languageによるCRDのバリデーションなど気になる機能もいくつか入っています。
それでは、API周りの変更を担当するSIG-API Machineryの変更点をCHANGELOGからピックアックします。(
がついた文章は、CHANGELOGの公式の内容ではなく筆者の補足です。)
SIG, KEPについてはこちらを参照ください。
Deprecation (非推奨になったAPI)
- EgressSelectorConfiguration APIの
EgressSelectionタイプから'master'が削除されました。(#102242)-
politeな'controlplane'に変更されています
-
API Changes (API周りの変更)
- client-goのimpersonation設定にUIDが設定できるようになりました。設定した値はリクエストの
impersonated uidに渡されます。(#104483) - HPAのv2beta2を元に
v2が作成されました。これに伴い、いくつかのフィールドが変更されています。(#102534)-
ChangeLogにはフィールド変更と書かれていますが、HPAリソースのフィールド変更はありませんでした。KEPには分かりづらいResourceをPodResourceに変更するなどのRenameが書かれているので今後変更が入るかもしれません。 詳しくは KEP-2702: Graduate v2beta2 Autoscaling API to GA を参照してください。
-
- エフェメラルコンテナがBetaに昇格し、デフォルトで有効になりました。(#105405, #105609)
-
ついにデフォルト有効になりました
起動パラメータ調整できない環境多くの環境でデバックできるようになりますね! 使い方については公式ドキュメントにも追記されています。設計について知りたい場合は KEP-277: Ephemeral Containers を参照してください。
-
-
kube-controller-managerに--concurrent-ephemeralvolume-syncsフラグが追加されました。これにより、ephemeral-volume-controllerのworker数を指定できます。 (#102981) -
generateNameを持つオブジェクトの生成時にConflictが発生すると、AlreadyExistsエラーをリトライオプションと共に返すようになりました。(#104699) - Priority and Fairness のv1beta2が導入されました。これに伴うAPIの変更はありません。(#104399)
- JSON形式のログにおいて、Infoメッセージを標準出力・Errorメッセージを標準エラー出力に書き出すよう設定できるようになりました。また、Infoメッセージはメモリにバッファ可能です。ただし、デフォルトでは、バッファせず標準出力に書き出します。(#104873)
-
LogFormatRegistryのユーザはlogrの v1.0.0 APIを使うようにコードのアップデートが必要です。JSONログの出力では、go-logr/zapr フォーマットが使われるようになりました。(エラーやメッセージにvフィールドが無いことに注意してください。)また、これに伴いいくつかの修正が入っています。(#104103) - kube-apiserver: CRDスキーマにおいて、enumのnull値の取扱が修正されました。(#104969)
-
nullをskipするためconvertion関数のエラーを無視していましたが、エラーはそのまま返すようになりました。代わりに、事前に値が空 or null文字であるかを検証しています。
-
- kube-apiserver: 非推奨APIの廃止 (#104248)
-
rbac.authorization.k8s.io/v1alpha1APIが削除されました。代わりにrbac.authorization.k8s.io/v1APIを利用してください。v1はv1.8から有効になっています。 -
scheduling.k8s.io/v1alpha1APIが削除されました。代わりにscheduling.k8s.io/v1APIを利用してください。v1はv1.14から有効になっています。
-
- KubernetesはGo 1.17 (1.17.3)でビルドされるようになりました。(#103692, #106209)
-
Go 1.17 のRelease Notesはこちら。Kubernetesでは //go:buildへのマイグレーションのための変更が大量に入ってます。
-
- クエリパラメータの
fieldValidation=[Strict,Warn,Ignore]を設定することで、Server SideのSchema検証を実行します。(#105916)-
Strictを設定するとunknownフィールドが存在する時にエラー、Warnを設定するとリクエストは成功するがWarningを表示、Ignoreを設定すると何もせずエラーを無視します。詳しくは KEP-2885: Server Side Unknown Field Validation を参照してください。
-
- Feature Gateの
TTLAfterFinishedがGAに昇格し、デフォルト有効になります。(#105219)-
便利なTTL機能がGAになりました。今まではCronJobを使っているとJobやPodなどの実行済みリソースが大量に残るため、これを定期的に消すようなcleanerなどを動かしていた方も多いのではないでしょうか?この機能では、JobやPodにTTLを設定することで、実行済みリソースがTTLを過ぎると自動でcleanupしてくれるという機能です。 - デフォルト有効になりましたが、この機能自体はJobやPodのデフォルト挙動は変更していません。利用する場合はTTLを明示的に設定してください。
- 下のPR含め、CronJobがv1.21でGAしてからちょいちょい改善入ってます。詳しくは KEP-592: TTL After Finished Controller を参照してください。
-
- JobステータスでReady状態のPod数を記録するようになりました。この機能は現在Alphaで、利用にはFeature Gateの
JobReadyPodsの有効化が必要です。(#104915)-
詳しくは KEP-2879: Track ready Pods in Job status を参照してください。
-
- Custom Resource DefinitionのバリデーションをCEL expression languageで記述できます。CELによるバリデーションは、OpenAPIv3 schema (alpha)の
x-kubernetes-validations拡張フィールドに設定してください。現在この機能はAlphaで、利用にはFeature GateのCustomResourceValidationExpressionsの有効化が必要です。 (#106051, #105107)-
詳しくは: KEP-2876: CRD Validation Expression Language を参照してください。
-
Features (機能追加)
-
workqueueAPIのconditionにProcessingが追加されました。workqueueAPIのShutdownの挙動が変わり、全てのin-flightアイテムの処理が終了するまで待機するようになります。(#101928) - client-go:
Reactorのfake clientにDeleteOptionsを渡すようになりました。(#102945) -
meta/v1パッケージのNewUnstructuredExtractorがパブリックになりました。これは、オブジェクトをUnstructuredなApply設定に展開できます。(#103564) - 機能フラグを有効化した場合、OpenAPI v3フォーマットの
/openapi/v3エンドポイントが公開されます。(#105945)-
Feature Gateのフラグ名はOpenAPIV3です。
-
-
client-goのEventライブラリでスパムのフィルタリングを拡張できるようになりました。これは、SpamKeyFunを上書きすることでイベントのスパムフィルタを変更できます。(#103918) -
client-goにおいて、以下のHTTPリクエストイベントのトレースにログレベル9が使われるようになりました。(#105156)- DNS lookup
- TCP dialing
- TLS handshake
- poolからコネクションを取得した時間
- リクエストを処理した時間
Bug or Regression (バグ修正)
-
generic-apiserverをベースとしているサーバで、CAや証明書とキーのbundleファイルに変更が合った場合、即座にリロードされます。(#104102) - client-goにおいて、生成された全グループとバージョンに同じHTTPクライアントを使うようになりました。これにより、複数のグループとバージョンに対して、カスタマイズしたTransportを共有できます。(#105490)
- Apply/Update後において、webhookにおいて古いオブジェクトによる不正なコピーが発生する問題が修正されました。(#106195)
- APIタイムアウトの記録中に並列マップアクセスによってpanicが発生する問題が解消されました。(#105734)
- controller-manager, kubelet, kube-apiserver, or client-goにおいて、LRUキャッシュでpanicが発生する退行バグが解消されました。(#104466)
- 新しいサーバオプション
shutdown-send-retry-afterを追加します。trueの場合、HTTPサーバは実行中の全ての(ロングランニングではない)リクエストが処理されるまでListenを続けます。このウィンドウの間、全ての新規リクエストにはステータスコード429 Retry-Afterを返します。(#101257)-
API serverのオプションです
-
- kube-apiserver:
admission webhookに対する不必要な連続呼び出しを避けるため、UPDATE/DELETEリクエストを除外します。(#104182) - kube-apiserver:
events.k8s.ioAPIグループを介して作製されたClusterスコープのEventオブジェクトは、default namespaceでも許可されるようになりました。これは、v1APIとEventクライアントの互換性を保つための変更です。(#100125) - APIサーバで使われているetcdクライアントで、特定のエラーをリトライさせるようになりました。該当エラー(codes.Unavailable)のリストはここから確認できます。(#105069)
-
現在codes.Unavailableが設定されているetcdサーバ側のエラーは7つあります。それぞれLeader変更や不在系、Timeout系、Unhealthyなど時間が解決するかもしれないエラーが対象となっています。
-
- サーバの起動時に404レスポンスを受け取った場合、オブジェクト削除の可能性があるGC及びNamespaceコントローラの問題を解消しました。このPRにより、APIServiceRegistrationControllerのジョブが完了するまで、AggregatedAPIサーバへのリクエストが404ではなく503を受け取ることを保証できます。(#104748)
-
client-goのダイナミッククライアントが、デフォルトでContent-Type: application/jsonヘッダを付与するようになりました。(#104327)