はじめに
ここでは、Kubernetes 1.14 の CHANGELOG から SIG API Machinery の取り組みについてまとめています。
主な変更点(1.14 What’s New)
1.14 では SIG API Machinery が主体となった大きな変更点はありませんでした。関連している変更はありますが、それは別の SIG のページを参照してください。
追加された点
- APIサーバーのクライアント証明書の期限を示すメトリクスである
certificate_expiration_seconds
の resolution を上げて、有効期間の短い(6時間以内)クライアント証明書に対応するように改善しました。(#74806, mxinden) - API Aggregation のテストが conformance テストに新規追加されました(#63947, jennybuckley)
- すべてのリソースに対して
storageVersionHash
フィールドが追加されました。この値は不透明として扱わなければいけません。この値は等価的に比較することだけ有効です。(#73191, caesarxuchao)- 不透明というのは Opaque_data_type という意味のようです。
-
APIResource リソースに
storageVersionHash
のフィールドが追加されたという話です。これは その APIResource の etcd に保存されている内部ストレージバージョンを取得するために追加されたフィールドのようです。
- 次のメトリクスに
dry_run
ラベルが追加されました。(dryRun query を切り分けるため) また、"Content-Type: apply-patch+yaml"
での PATCH リクエストを切り分けるためverb
ラベルにAPPLY
value が追加されました。これは実験的な値で ServerSideApply alpha機能を有効にした場合のみ有効です。(#74997, jennybuckley)apiserver_request_total
apiserver_request_duration_seconds
- 個人的に待っていた ServerSideApply が v1.14 で Alpha として追加されましたが、ChangeLog にはここにしか記載がないようです
バグ修正等
- client-go:
PortForwarder.GetPorts()
はポートフォワーダの設定時に最初にローカルポートが指定されていなかった場合でも正しいローカルポートを返すようになりました。(#73676, martin-helmich) - admission webhook で送られるオブジェクトのデータの中に
apiVersion/kind
が含まれていなかった問題が修正されました(#74448, liggitt)- オブジェクトの作成または変更のリクエストを投げると apiserver から admission webhook を受ける際に生のオブジェクトのデータ送られますがそこに GVK (GroupVersionKind) が含まれていないということのようです
- これが含まれていないと json.Unmarshal するときなどに困ることがあるようです
-
crd_autoregister
とcrd_finalizer
,crd_naming_condition_controller
が Prometheus メトリクスとして公開されました。(#71767, roycaihw)- これらのメトリクスはよくある Informer のキューのメトリクスのようです
- これはもともと追加されていたようですが名前が不正で登録に失敗していたため名前を変えて再公開したという体のようです
-
PR の修正を見る限りは
crd_autoregister
ではなくcrd_autoregistration_controller
のような気がします
- admission 関連のメトリクスが秒単位に修正されました(#72343, danielqsj)
-
従来は
*_admission_latencies_seconds
のようなメトリクスが実際にはマイクロ秒を返していましたが、秒を返すように修正されたということのようです
-
従来は
- HTTP2 ロードバランサーによって接続が切れた場合にエラーログが出力されていましたが、それをデフォルトではスキップするように変更しました (多分#73277)
- kubectl が kube-apiserver からディスカバリー情報を取得するときに10秒より速くしました(#73345, sttts)
- apigroup が 40 以上登録されているような apiserver だとこれらをシーケンシャルに取得していたため遅くなっていた問題があり、これを並列で取得することで高速化したようです
- 同じイベントのセットを何度も送信しないように監視し、watcher が間に合うようにしました(#73845, wojtek-t) (#73277, smarterclayton)
- apiserver の API をウォッチするライブラリで初回のイベントを送ったあとに再度同じイベントを送るようになっていたため、それを送らないように修正したということのようです
-
default/kubernetes
Service の endpoint の作成を apiserver リクエストを受け付けることができるようになる(readiness)前に作成していた問題を修正しました。また kube-apiserver が以前にクラッシュした場合などで古い endpoint が残っている場合があるので起動時に古いエンドポイントが合った場合は削除するようにしました。(#74668, sttts)- 原文だと同じ修正が微妙に異なる文言で2行ありましたが1行にしています
- admission webhook の validating/mutating のタイムアウトを短縮するための設定フィールドを追加します。 タイムアウト値は1から30秒の間でなければなりません。 指定しない場合のデフォルトは30秒です。(#74562, roycaihw)
- jsonパッチに10,000を超える操作が含まれている場合、kube-apiserverと汎用apiserverライブラリで構築されたapiserverの両方を含むapiserverは、413 RequestEntityTooLargeエラーを返すようになりました。(#74000, caesarxuchao)
- CVE-2019-1002100 の修正パッチですね
- 複数のマイナーバージョンのapiserverが混在している環境で監視イベントの処理に問題があったため修正しました(#73482, liggitt)
- ストレージから event をデコードするときにサポートしていないバージョンのリソースが合った場合にエラーにしていた部分を、エラーにしないようにしたようです
-
[start:end:step]
を含む jsonpath が正しく評価されるようになりました(#73149, liggitt) - Finalizer を含むリソースに対して繰り返し削除を行った場合に、
metadata.deletionTimestamp
が未来に移動されなくなりました。(#73138, liggitt) - 長い duration の間も
watch.Until
が動作するようになりました(#67350, tnozicka)- RetryWatcher という新たな Watcher が追加され、一度接続が途切れても最後の resourceVersion が etcd に残っていれば再開して Watch し続ける?
- CRD webhook converter のためのメトリクスが追加されました(#74376, mbohlool)
- いくつかのプラットフォームで keymutex がクラッシュする問題が修正されました(#74348, danielqsj)
- Aggregated API Server から OpenAPI 仕様を集約する際の kube-apiserver の CPU負荷を大幅に削減しました。(#71223, sttts)
- 終了処理の前に送信しているデータを失わないように apiserver のグレースフルシャットダウンを修正しました(#72970, sttts)
- http2の場合などで正常にグレースフルシャットダウンできていなかったようです
alpha, beta のみ記載の変更点から抜粋
- Admission webhook のルールに namespaced または cluster-scoped のリソースを限定できるようになりました。"Cluster" または "Namespaced" または "*" を指定することで限定できます。(#74477, liggitt)
- beta.1 の Changes
- CustomResourceDefinition OpenAPI の validation schema で nullable をサポートしました(#74804, sttts)
- 以下のメトリクスの名前を latency から duration に変更しました。(#74418, danielqsj)
-
rest_client_request_latency_seconds
->rest_client_request_duration_seconds
-
apiserver_proxy_tunnel_sync_latency_secs
->apiserver_proxy_tunnel_sync_duration_seconds
-
scheduler_scheduling_latency_seconds
->scheduler_scheduling_duration_seconds
- beta.1 の Changes
-
- PriorityClass APIが
scheduling.k8s.io/v1
で提供されました。内容は beta から変更ありません。それに伴いscheduling.k8s.io/v1beta1
のバージョンは deprecated となり、v1.17 でデフォルトで廃止予定です。(#73555, bsalamat) - Ingress リソースが
networking.k8s.io/v1beta1
で利用可能になりました。extensions/v1beta1
は deprecated となり、v1.18 で廃止予定です。(#74057, liggitt) - 以下の apiserver のメトリクス名がガイドラインに従った名前に変更されました。それに伴い以前のメトリクスは deprecated になりました。それらは将来のリリースで削除される予定です。(#72336, danielqsj)
- 追加されたメトリクス
apiserver_request_total
apiserver_request_latency_seconds
apiserver_dropped_requests_total
etcd_helper_cache_hit_total
etcd_helper_cache_miss_total
etcd_helper_cache_entry_total
etcd_request_cache_get_latency_seconds
etcd_request_cache_add_latency_seconds
etcd_request_latency_seconds
transformation_latencies_seconds
data_key_generation_latencies_seconds
- 廃止予定となったメトリクス
apiserver_request_count
apiserver_request_latencies
apiserver_request_latencies_summary
apiserver_dropped_requests
etcd_helper_cache_hit_count
etcd_helper_cache_miss_count
etcd_helper_cache_entry_count
etcd_request_cache_get_latencies_summary
etcd_request_cache_add_latencies_summary
etcd_request_latencies_summary
transformation_latencies_microseconds
data_key_generation_latencies_microseconds
- 追加されたメトリクス
所感
1.14 では apiserver の高速化やメトリクスの整理などが行われているようです。
それとまだ Alpha ですが個人的には待望の ServerSideApply の機能が追加されました。今までは kubectl apply 相当の機能を利用する場合は kubectl バイナリを利用することが簡単でしたが、client-go などから直接 apply 相当のことができるようになりそうです。
利用方法はこちらに記載されていますが、PATCHのリクエストを application/apply-patch+yaml
つきでリクエストすることでできるようです。なお、ServerSideApply では last-applied
アノテーションは利用せず metadata.managedFields
でそのあたりを管理するようになるようです。
managedFields の詳しい動作については別途調べてまとめたいと思います。
@superbrothers によってまとめた記事が公開されました