はじめに
Kubernetes v1.22がリリースされました
今回のAPI周りの変更では、Ingressを始めとしていくつかのBeta APIが削除されています(アップグレード時にはご注意ください)。他にも、External Credential ProviderはBeta、皆様お待ちかねのServer-Side Apply(SSA)1はGAに昇格しています。
また、新機能についてはNode周りが多い印象です。seccompをcluster-wideでデフォルト有効にするSeccompDefaultや、Cgroup v2 APIでメモリのQoSを設定可能にするMemoryQoSなどがあります。こちらについては後日公開予定のSIG-Nodeの記事の方を参照ください。(実装の進んでいたin-place Upgradeは今回入らなかったので次回に期待です。)
ちなみにk8sのサポートするetcdのデフォルトバージョンはv3.5.0にあがりましたが、先日etcd clientのv3.5.0を試したところバグを引いたのでパッチバージョン待ちです。
それでは、API周りの変更を担当するSIG-API Machineryの変更点をCHANGELOGからピックアックします。(がついた文章は、CHANGELOGの公式の内容ではなく筆者の補足です。)
SIG, KEPについてはこちらを参照ください。
Deprecation (非推奨になったAPI)
- controller-managerの
--port
,--address
はv1.24で削除されます。insecure portフラグである--port
には0のみセットできます。また、以下の点に注意してください。- controller-managerは認証/認可の挙動を
--authorization-kubeconfig
と--authentication-kubeconfig
フラグで指定して起動しなければなりません。 - controller-managerのliveness/readiness probeは現在HTTPSのみ利用できます。また、デフォルトのポート番号は10257に変更されました。
- controller-managerからメトリクスを取得するアプリケーションは、Service AccountのnonResourceURLsの
/metrics
で指定したものを利用してください。 (#96216)
- controller-managerは認証/認可の挙動を
- Serviceの
topologyKeys
フィールド(alpha)と、kube-proxy
にある実装のサポートを廃止しました。このフィールドは数サイクル前に非推奨となっています。この機能は、endpointごとのautomatic topology hints (alpha)と、ServiceのinternalTrafficPolicy
フィールドによって置き換えられます。(#102412)
API Changes (API周りの変更)
- NodeResourcesFitプラグイン用の新しいscore extensionは、NodeResourcesLeastAllocated / NodeResourcesMostAllocated / RequestedToCapacityRatioプラグインの機能を統合します。統合前の機能はv1beta2で非推奨になります。v1beta1では引き続き利用できますが、
NodeResourcesFit
のscore extentionとの併用はできません。(#101822) - PVCのspecに
DataSourceRef
(alpha) フィールドが追加されました。このフィールドは、PVCとVolumeSnapshotsのデータソースになります。(#103276) - StatefulSet APIに
PersistentVolumeClaimDeletePoilcy
が追加されました。(#99378) - 全probe(/readyz, /healthz, /livez)をPriority and Fairnessから免除するルールを追加しました。これにより、正常なkube-apiserverがkubeletによって再起動されるのを防ぎます。(#100678)
-
kube-apiserver
に分散トレーシングを追加しました。Feature GateのAPIServerTracing
から有効化できます。(#94942)- ついにKEP-647のOpenTelemetryによるAPIサーバの分散トレーシングが追加されました。今回Kubernetesのデフォルトサポートバージョンがetcd v3.5.0になりましたが、etcdの方にもv3.5.0よりトレーシング機能が追加されています。他のPull-Requestでetcdへcontextを渡す修正も入っているので、途切れることなくトレースできます。
- Jobリソースに
.status.uncountedTerminatedPods
フィールドを追加しました。このフィールドは、job-controllerがJob Statusのカウンタ反映前の終了済みPodを記録するために利用します。job-controllerから生成されたPodはbatch.kubernetes.io/job-tracking
Finalizerを持ちます。なお、batch.kubernetes.io/job-tracking
アノテーションを持つJobの追跡は一時的なものです。2リリース後にこの機能はBetaとなり、このアノテーションはJobに設定されなくなります。(#98817)- これは欲しかった人も多いと思われるKEP-2307の便利?機能です。今まではJobが終了するまで終了済みPodが削除されなかったため、大量のPodを走らせるJobなどで問題になっていました。この変更により、終了済みPodを残さなくてもJobのステータス管理できるようになりました。前々回のリリースでポーリング式からControllerらしい実装となったCronJob Controller v2が入り、ココらへんの改善が入ってきたのは嬉しいですね。
- Alpha機能のswapがサポートされました。この機能は、Kubernetes Nodeの
NodeSwapEnabled
フラグから有効にできます。詳しくはKEP-2400を参照ください。(#102823) - Ephemeral ContainerがPodとことなる
securityContext
を設定できるようになりました。クラスタでこの機能を利用する前に、クラスタ管理者はSecurity PolicyコントローラがEphemeralContainers
をサポートしていることを確認してください。(#99023) - Execプラグインの作成者は、kubeconfigの
interactiveMode
フィールドを利用してデフォルトの標準入力の処理を変更できるようになりました。(#99310)- いままでclient-goは標準出力がターミナルであればインタラクティブな標準入力を受け付ける挙動をしていましたが、スクリプト内で実行する際に問題になっていたため、pluginがハンドリングできるようになりました。
- ラベルセレクタのパース方法を改善しました。(#102188)
- StatefulSets に
minReadySeconds
APIが追加されました。(#100842) - 現在提供されている Impersonate-User, Impersonate-Group, Impersonate-Extraと同じように、
Impersonate-Uid
ヘッダを利用してimpersonateユーザをUIDから指定できるようになりました。 - kube-apiserverに
--service-account-issuer
フラグを複数指定できるようになりました。これにより、無停止でissuerを変更できます。(#101155) - HeapsterによるHPAをサポートするkube-controller-managerの
--horizontal-pod-autoscaler-use-rest-clients
フラグが削除されました。このフラグは1.12から非推奨になっていました。(#90368) - Suggested API Priorityに
node-high
が追加されました。(#101151)- コントロールプレーンの高負荷時にkubeletがstatusのレポートもできなくなると困るということで、node-highというより優先度の高いレベルが追加されました。
- StatefulSet APIに追加されていた
PersistentVolumeClaimDeletePoilcy
がrevertされました。(#103747) - Server Side Apply(SSA)が全てのSelectorフィールドをアトミックに扱うようになりました(つまり、Selectorは単一のwriterによって管理されます)。これらのフィールドには、直感的にマージできない依存関係のあるフィールドが含まれています。(#97989)
- CertificateSigningRequest.certificates.k8s.io APIがexpirationSecondsフィールドをサポートしました。これにより、クライアントは証明書の発行時に期間をリクエストできます。デフォルトの実装では、kubernetes controller-managerは
--cluster-signing-duration
フィールドを超えない範囲でこの値を尊重します。(#99494) - EndpointSlice Mirroring controllerがEndpointSlicesを更新するために、kubectlにより生成された
last-applied-configuration
アノテーションをミラーしなくなりました。(#102731) - Pod specの
TerminationGracePeriodSeconds
とコンテナのprobeに負の値を設定しないでください。負の値を設定した場合、削除時には1s
として扱われます。イミュータブルフィールドのバリデーションはこの負の値を更新するために緩和されます。将来的には負の値を許可しなくなります。(#98866) - サブリソースの
pod/eviction
がpolicy/v1beta1に加えてpolicy/v1も受け入れるようになりました。(#98866) - podAffinity, NamespaceSelector, CrossNamespaceAffinityの機能がBetaに昇格し、デフォルト有効になりました。(#101496)
- 全Scalableリソースの
scale
サブリソースOwnerを記録するようになります。(例: Deployment, ReplicaSet, StatefulSet, ReplicationController, Custom Resources) (#98377)
Features (機能追加)
- APIServerTracingがetcdクラインアントの呼び出しをspanとして収集し、etcdへcontextを伝搬するようになりました。(#103216)
- APIServerTracingがAdmission Webhookへのリクエストspanとして収集するようになりました。(#103601)
- JSONロギングフォーマットがKubernetesのCoreコンポーネント以外でデフォルト無効になります。(#102869)
- kubernetes-apiserverに
--feature-gates=PodSecurity=true
フラグを渡すとPodSecurity機能が有効になります。この機能を有効にするとNamespaceラベルを使用可能なPodを制御できます。詳しくはKEP-2579を参照してください。 (#103099) - controller-managerのためのリーダーマイグレーションがBetaになりました。(#103533)
- EventのField Selectorの生成にBuilder関数を利用できるようになりました。(#101817)
- CVEに対応するため、以下のイメージを更新しました:
-
debian
to v1.8.0 -
debian-iptables
to v1.6.5 -
setcap
to v2.0.3 (#103235)
-
Bug or Regression (バグ修正)
- Lease ControllerにJitter係数を追加しました。これにより、kube-apiserverの負荷がより適切に処理されます。(#101652)
- P&Fが導入された後にAPI呼び出しのレイテンシが劣化しましたが、根本原因はP&FではなくNodeのleaseによるスパイクだったようです。Leaseにjitterを入れることで、API呼び出しを分散してスパイクを緩和したようです。
- 大きなCRDを更新/適用する際のパフォーマンスのリグレッション問題を修正しました。 (#103318)
- SSAによるクライアント側でのAnnotation適用において、Annotationのサイズ制限を考慮するようになりました。また、opt-outの挙動をクライアント側でのAnnotation適用で空文字列を設定することで対応しています。(#102105)
- YAMLドキュメントのセパレータ("—")の同じ行に対して、空白やコメント("# ….")を設定できるようになりました。この修正では、コメントが続くセパレータを無視するバグが修正されています。また、コメント以外が同じ行に続く場合はエラーを返します。(#103457)
Others (その他修正)
- Fake clientsが
FakeClient
interfaceに実装されました。 (#100940)- trackerにアクセスするためのTracker()関数ををDynamicFakeClientに追加する変更(#100085)の続きの修正で、DynamicFakeClientが実装するinterfaceとなるFakeClientが追加されています。
- golang.org/x/netパッケージがv0.0.0-20210520170846-37e1c6afe023に更新されました (#103176)