はじめに
Kubernetes v1.24がリリースされました
SIG-APIのメジャーな変更は、OpenAPI v3のエンドポイントが生えたことです。CRDは以前からOpneAPI v3(※初期はJSON Schema)でしたが、APIサーバのエンドポイントは /openapi/v2
のままでした。2019年からv3にあげようというKEPが進められ、ついにv3へ上がりました。
他にも、小粒ですがいろいろ変更が入っています。例えば、前リリースのv1.23で入ったCRDのCELによるバリデーションは着々と強化されています。まだアルファですが今後が楽しみな機能です。
それでは、API周りの変更を担当するSIG-API Machineryの変更点をCHANGELOGからピックアックします。(がついた文章は、CHANGELOGの公式の内容ではなく筆者の補足です。また、はk8s変更点共有会でピックアップ予定の変更内容です。)
SIG, KEPについてはこちらを参照ください。
Deprecation (非推奨になったAPI)
-
Kube-apiserver: lease reconcilerの方が好ましいため
--master-count
フラグと--endpoint-reconciler-type=master-count
フラグが非推奨になりました。(#108062)- Leaseがデフォルトになったのは1.11とかなり前なので私も存在を忘れていましたが、master-countフラグが非推奨になっていなかったようです。
- Kube-apiserver: 1.20から非推奨となっていた
--address
,--insecure-bind-address
,--port
,--insecure-port
フラグが削除されました。(#106859) - 非推奨になっていたFeature Gateの
ValidateProxyRedirects
とStreamingProxyRedirects
が削除されました。(#106830) -
client.authentication.k8s.io/v1alpha1
のExecCredential APIが削除されました。client-goのv1alpha1 APIのcredentialプラグインを利用している場合はv1 APIに移行してください。(#108616) -
node.k8s.io/v1alpha1
のRuntimeClass APIが非公開になりました。代わりにv1.20より有効なnode.k8s.io/v1
APIを利用して下さい。(#103061) - kube-controller-manager: v1.20から無効化されていた
--address
と--port
フラグがv1.24で削除されました。(#106860) - metadata.clusterNameフィールドが非推奨になりました。このフィールドは書き込み不可かつ、常に空の状態なため混乱を生んでいました。そのため、次のリリースで削除します。間違ってこのフィールドを利用しているclientを発見するために、本リリースではgo構造体の名前を変更しています。(#108717)
API Changes (API周りの変更)
- winkernelモード用に2つのオプションを追加しました。
--forward-healthcheck-vip
フラグを有効にした場合、ヘルスチェックのトラッフィクの宛先はService VIPとなるので、kube-proxyのヘルスチェックServiceにフォワードされます。--root-hnsendpoint-name
はrootネットワークの名前空間用のhnsエンドポイントの名前を指定します。このオプションはロードバランサのパススルーを可能にします。例えば、GoogleのGCLBは正しくバックエンドサービスのヘルスチェックができます。この変更が未適応の場合、WindowsノードではこのようなロードバランサをUnhealthyと判定しません。(#99287) -
CELランタイムのコスト計算をCustomerResourceバリデーションに追加しました。ランタイムコストが予算を超過した場合、CustomerResourceのバリデーションで失敗します。(#108482)
- 今回もいくつかCommon Expression Language(CEL)まわりの変更が入っています。これは、カスタムリソースをCELをつかって(Admission Webhookを使わず)手軽にリッチなバリデーションできるようにしようというものです。この機能はv1.24現在アルファなため利用にはFeatureGateの有効化が必要です。詳しくは KEP-2876を参照してください。
- CEL CRDバリデーションにおいて、既存のオブジェクト状態を
oldSelf
識別子をつかって参照できるようになります。(#108073) - Network PolicyオブジェクトにStatusサブリソースを追加しました。(#107963)
- CELバリデーションルールが
oldSelf
識別子をサポートしていないスキーマを参照する場合、CRDの書き込みはバリデーションエラーになります。(#108013) -
--detect-local-mode
オプションの引数としてInterfaceNamePrefix
とBridgeInterface
をサポートしました。また、新しい--pod-interface-name-prefix
と--pod-bridge-interface
フラグもkube-proxyに追加しています。(#95400) - CRDのdeepコピーはshwllowコピーの
JSONSchemaProps.XValidations
を含まなくなります。(#107956) -
fieldValidation=Strict
を指定したカスタムリソースのリクエストでは、non-strictリクエストと一致させるため、apiVersion
とkind
が必須になりました。(#109019) -
PodOverhead
がGAになりました。(#108441) - x-kubernetes-validationsフィールドのOpenAPIのシリアライズが修正されました。(#107970)
- kubectlのユーザーヘルプコマンドの可読性が向上しました。(#104736)
- ClusterCIDRConfigにv1alpha1 networking APIが追加されました。(#108290)
- ClusterCIDRConfigのv1alpha1 networking APIが削除されました。(#109436)
- 上記のPRがrevertされています
- JobReadyPodsがベータに昇格し、デフォルトで有効になりました。(#107476)
-
前リリースにAlphaで入った機能で、デフォルト有効になりました。Jobの
.status.active
にはPending
のJobも含まれていましたが、その場合コンテナイメージサイズが大きくPullに時間が掛かるコンテナであったり、クラスタのリソースが枯渇していてスケジューリングできなかったりする場合に正しく状況が把握できないという問題がありました。そこで、.status.ready
フィールドを追加することで、真にReadyなPodの数を把握できるようになりました。詳しくはKEP-2879を参照してください。
-
前リリースにAlphaで入った機能で、デフォルト有効になりました。Jobの
- Kube-apiserver:
--audit-log-version
と--audit-webhook-version
はデフォルト値のaudit.k8s.io/v1
のみをサポートするようになりました。 1.13 から廃止された v1alpha1 と v1beta1 監査ログバージョンは削除されています。(#108092) - Kube-apiserver:
metadata.selfLink
フィールドは kube-apiserver によって挿入されなくなりました。1.16で非推奨、1.20+からはデフォルトで挿入されなくなっています。(#107527) - Kubeletの外部クレデンシャルプロバイダはベータに昇格しました。Credential Provider PluginおよびCredential Provider Config APIはv1alpha1からv1beta1へ更新されています。APIの変更はありません。(#108847)
- StatefulSetsのMaxUnavailableにおいて、1つ以上のPodを停止させることでRollingUpdateを高速化できるようになりました。RollingUpdate中に停止させたいPodの数は、maxUnavailableパラメータから設定できます。(#82162)
-
OpenAPI V3がデフォルト有効になります。(#109031)
-
"はじめに"でも触れたとおり、CRDではOpenAPI v3でスキーマ定義しています。しかし、k8sのエンドポイントではv2で公開されていたため、v3をv2に変換する過程で一部の情報が欠落するという問題がありました(e.g.
anyOf
)。詳しくはKEP-2896を参照してください。
-
"はじめに"でも触れたとおり、CRDではOpenAPI v3でスキーマ定義しています。しかし、k8sのエンドポイントではv2で公開されていたため、v3をv2に変換する過程で一部の情報が欠落するという問題がありました(e.g.
- Pod Affinity Namespace SelectorとCross-Namespace QuotaがGAに昇格しました。Feature Gateの
PodAffinityNamespaceSelector
はロックされ、1.26で削除予定です。(#108136) - IdentifyPodOSがベータ昇格しました。(#107859)
- OpenAPIv3スキーマに根本的なエラーがある場合、x-kubernetes-validationsルールをスキップするようになりました。(#108859)
-
gRPC proveのサポートがベータ版になりました。GRPCContainerProbe機能ゲートはデフォルトで有効です。(#108522)
- これは地味に嬉しい人が多いと思われる機能です。HTTPだけでなく、gRPCをつかっているアプリのHealthchekも直接できるようになりました。
- CertificateSigningRequest
spec.expirationSeconds
APIフィールドがGAに昇格しました。Feature GateのCSRDuration
は常に有効となり、1.26で削除予定です。 (#108782) -
ServerSideFieldValidation
がベータに昇格し、デフォルト有効になりました。kubectl 1.24以降では、この機能が有効な状態でAPIサーバに書き込むと、クライアント側ではなくサーバ側でバリデーションされます。(#108889)- バグのため、#109271でRevertされています。1.25で再度ベータを目指すようです。
-
https://git.k8s.io/kubernetes/api/openapi-spec でキャプチャされたStaticなOpenAPIファイルからEnumの定義を省略します。このファイルはAPIクライアントの生成に利用されています。生成されたクライアントでEnum(!=文字列)を使用すると、該当フィールドに将来的に追加される値との前方互換性が損なわれる可能性があります。詳しくは https://issue.k8s.io/109177 を参照してください。(#109178)
-
v1.24(後述の#108898)でOpenAPIのEnum Typeがベータに昇格し、デフォルト有効になりました。しかし、この修正では後方互換性のために
hack/update-openapi-spec.sh
でFeatureGateのOpenAPIEnumsを無効化しています。これにより、api/openapi-spec/v3/*.json
に出力されるOpenAPIからEnumフィールドが除去されました。ここで触れられているIssueの#109177が解決するまで、OpenAPI Enum TypesはGAしない予定のようです。
-
v1.24(後述の#108898)でOpenAPIのEnum Typeがベータに昇格し、デフォルト有効になりました。しかし、この修正では後方互換性のために
- コンテキストロギングの基盤が整いました(Feature Gateの実装 & JSONバックエンドの準備)。 (#108995)
- kube-controller-manager: 非推奨の'–deployment-controller-sync-period'フラグが削除されました。(#107178)
- CronJobに
timeZone
フィールドを追加しました。これにより、特定のタイムゾーンでCronJobを実行できます。(#108032)- UTCでそろえているパターンが多いと思いますが、ついにCronJobのタイムゾーンを変更できるようになりました。
- controller-managerによるEndpoint/ConfigMapの操作がleader-electionの優先順位に依存することを避けるため、デフォルトAPIのpriority-and-fairness設定を修正しました。(#106725)
-
topologySpreadConstraints
は、トポロジードメインの最小数を制限するminDomains
フィールドを含んでいます。(#107674)
Features (機能追加)
-
SharedInformer
にSetTransform
を追加し、保存前にオブジェクトを変換できるようになりました。(#107507)- モチベーションとしては、client-goでオブジェクトをキャッシュしているコントローラ等で、使ってないフィールドを保存前に落とせるように追加されてます。Authorの人は、managedFieldが入ってからキャッシュのデータ量が増えすぎてOOM頻度が上がったのを回避したいようでした。
-
SOCKS5プロキシ経由のkubectlコマンド(
kubectl exec
とkubectl port-forward
)がサポートがされました。(#105632)- 公式ドキュメントに使い方のページも追加されています。内容は、SSHトンネルをローカルとリモートのk8sクラスタ間に張り、SOCKS5プロキシ経由でkubectlを叩くチュートリアルです。
- OpenAPI v3 Schemaのドキュメントを取得を可能にするため、
DiscoveryClient
にOpenAPIV3SchemaInterface
を追加しました。(#108992) - 現在Alphaの
--subresource
フラグが、kubectlのget, patch, edit replaceコマンドに追加されました。これにより、statusやscaleサブリソースの取得や更新が可能になります。(#99556)- 開発中のカスタムリソースのstatus修正したいときにkubectl経由でシュっとやりたかったので嬉しい。
- x-kubernetes-valiation ルール内の文字列として定義されているCEL正規表現パターンは、CRDがcreate/updateされるときにコンパイルされます。正規表現コンパイル時のエラーは、CRDのcreate/update時のバリデーション検証エラーとしてレポートされます。(#108617)
- CRD
x-kubernetes-validations
ルールが CEL 関数isSorted
,sum
,min
,max
,indexOf
,lastIndexOf
,find
とfindAll
をサポートしました。 (#108312) - false/ignore - バリデーションを行わず、オブジェクトから無効なフィールドを取り除きます。(#108350)
- Kube-apiserver:
status
やscale
などのサブリソースが、表形式の出力をサポートしました。(#103516) - Kube-apiserver: リストをマージする際、Server Side Apply は既存のPersistedオブジェクトではなく、送信されたリクエストの順序を優先するようになりました。(#107565)
- バグがあったため、#106660でRevertされています。
-
Kubernetes 1.24はGo 1.18でビルドされています。デフォルトは SHA-1 ハッシュアルゴリズムで署名された証明書を検証しません。詳しくは https://golang.org/doc/go1.18#sha1 をご覧ください。このような証明書をAdmissionやConversionで使用している場合に注意して下さい。(#109024)
- Goの1.8では、クライアントのTLS 1.0とTLS 1.1をデフォルト無効化、SHA-1で署名された証明書を拒否するように変更されています。
- volume expansionがGAに昇格しました。(#108929)
- kube-apiserverが提供するOpenAPI定義に、デフォルトでEnum型が含まれるようになりました。(#108898)
-
LeaderMigrationConfiguration
のv1
版は、leases
API のみをサポートします。前バージョンでサポートされていた機能を使うには、引き続きv1beta1
を使用してください。 (#108016) - golang.org/x/net を v0.0.0-20211209124913-491a49abca63 に更新しました。(#106949)
Bug or Regression (バグ修正)
- client-go: client-goのclientはUser Agentをdefaultにせず、全リクエストにgolang Agentを利用していました。(#108772)
- kube-apiserver: egress selectorをgRPCモードで利用するとkube-apiserverのgoroutieがリークする問題を修正するため、
sigs.k8s.io/apiserver-network-proxy/konnectivity-client@v0.0.30
にアップデートしました。(#108437) - CEL Validationの失敗時に、オジェクトの代わりにオブジェクトの型を返すようになりました。(#107090)
- Client-go: Pagingが開始されると、
ResourceVersionMatch
が設定されたPagingリストの呼び出しに失敗する問題を修正しました。(#107311) - Etcd: v3.5.3にアップデートしました。(#109471)
- kube-apiserverのクラッシュの原因となるTimeout Handlerの競合を修正しました。(#108455)
- kube-apiserverのAPI Priority & Fairnessにおいて、委任されたAPIリクエストのコストが過大に評価されていた問題を修正しました。(#109188)
- execプラグインのCredentialが、kubeconfigに設定されたstaticな証明書を上書きするバグを修正しました。(#107410)
-
/healthz
リクエストがタイムアウトした際に、panicを引き起こす懸念があるバグを修正しました。(#107034) -
create --dry-run
から不要なフィールドが返されるバグを修正しました: uid と generateName が使用された場合は name が返されていました。(#107088) - Timeoutするリクエストを処理する際に、稀に発生していた競合状態を修正しました。(#107452)
- 1.23で、
x-kubernetes-preserve-unknown-fields: true
を設定したカスタムリソースの配列の要素から不正にデータが削除される回帰バグを修正しました。 (#107688) - 無効なセレクタを持つオブジェクトの取り扱いを修正しました。(#107559)
- kube-apiserver: http://issue.k8s.io/104641 が解決されるまで、Server-Side-Applyのマージ順はv1.22の挙動に合うように修正します。(#106660)
- kube-apiserver: admission webhooksに送信されるオブジェクトの名前空間が、リクエストの名前空間と一致することを保証します。以前は、名前空間が設定されていないオブジェクトは、Admissionによる更新後にリクエスト名前空間が入力され、リクエストの名前空間と一致しない名前空間を持つオブジェクトは、Admission後に拒否されていました。(#94637)
- kube-apiserver: リクエストユーザが特定できるような
apf_fd
をサーバーログから削除しました。(#108631) - kubectlのverboseログにレスポンスのステータスとヘッダを再追加しました。(#108505)
-
ServerSideFieldValidation
機能が 1.24でalphaに戻りました。(#109271) - 非推奨フラグ
--really-crash-for-testing
は削除されました。(#101719) - Kubeletは、Heartbeat失敗時にアクティブな接続を強制的に閉じず、HTTP2ヘルスチェック機構により壊れた接続を検出するようになりました。環境変数にDISABLE_HTTP2を設定することで、以前の挙動に戻せます。(#108107)
-
apiserver
がkubernetes.default
ServiceのEndpointを照合するように設定している場合、設定されたService IPの範囲がapi-serverのpublic IPアドレスのIP familyと一致するか確認します。一致しない場合、起動に失敗します。(#106721) - APIサーバの非推奨のフラグ
--target-ram-mb
が削除されました。(#108457) - client-go: リトライ前にBodyのリセットに失敗した場合、エラーが表示されるようになりました。(#109050)
-
k8s.io/apimachinery/util/clock
は非推奨になりました。代わりにk8s.io/utils/clock
を利用してください。(#106850) - client-goのSPDY Transportはリダイレクトを追従しなくなりました。(#108531)
- kube-apiserver: 非推奨フラグの
--deserialization-cache-size
が削除されました。(#108448) - エラーメッセージに
--max-resource-write-bytes
&--json-patch-max-copy-bytes
の文字列を使用しなくなりました。(#106875)