はじめに
Kubernetes v1.26がリリースされました 🎉
SIG-APIの目玉はWebhookなしに手軽なバリデーションを可能にするValidatingAdmissionPolicyです。その他にも運用に便利な改善が色々入っています。また、前リリースで見送られたclient-goのGCP/Azureのauthプラグインがついに削除されました。
いままでKEPを探したい時はenhansmentsのリポジトリ内をtext検索する必要がありましたが、公式のKEPの検索ページが公開されました。便利なのでオススメです。
それでは、API周りの変更を担当するSIG-API Machineryの変更点をCHANGELOGからピックアックします。(📝がついた文章は、CHANGELOGの公式の内容ではなく筆者の補足です)
SIG, KEPについてはこちらを参照ください。
🗑️ Deprecation (非推奨になったAPI)
📝 flowcontrol.apiserver.k8s.io/v1beta1
と autoscaling/v2beta2
が削除されました。マイグレーション方法については Deprecated API Migration Guide を参照してください。
- Kube-apiserverの
--master-service-namespace
フラグが非推奨になりました。1.27で削除予定です。(#112797) - CLIフラグの
pod-eviction-timeout
が非推奨になりました。enable-taint-manager
と共にv1.27で削除予定です。(#113710) -
gcp
とazure
の認証プラグインがclient-go
とkubectl
から削除されました。各クラウド用の代替手段については kubelogin と Kubectl Auth Changes in GKE を参照してください。(#112341)- 📝 前回の1.25で削除予定でしたが、バグが発見されたため1.26に延期されました。これに伴いAzureの認証にはkubelogin、GKEの認証にはgke-gcloud-auth-pluginが使われます。
🌏 API Changes (API周りの変更)
- 新しい拡張ポイントの
preEnqueue
がスケジューラコンポーネントの設定(v1beta2/v1beta3/v1
)に追加されました。(#113275) -
ResourceClaim
APIが追加されました。(FeatureGateDynamicResourceAllocation
のresource.k8s.io/v1alpha1
APIグループ)。新しいAPIは既存のデバイスプラグインより柔軟になりました。Pods単位で専用リソースへのリクエストを許可していましたが、Nodeやクラスタ、その他実装したモデルのレベルに対応可能になりました。(#111023)- 📝 Dynamic resource allocationはk8sのworkloadの用途が増えるに伴い、リソースも従来のRAM/CPUだけでなく他のハードウェアも考慮したスケジューリングが必要だよね。ということで進められている機能です。詳しくは KEP-3063 を参照してください。公式ブログもでてます。-> Kubernetes 1.26: Alpha API For Dynamic Resource Allocation
- コンテナのライフサイクルハンドラのうち、
httpGet
を利用するpreStop
とpostStart
が特定のscheme
とheader
フィールドを尊重するようになりました。これにより、カスタムヘッダやスキーマがHTTPSへ変更可能です。コンテナのstartup/readiness/liveness probeとの一貫性が保てるようになります。互換性を保つため、ライフサイクルハンドラがscheme: HTTPS
でエラーを検出した場合、HTTPにフォールバックします。その際、該当PodのLifecycleHTTPFallback
イベントとして記録されます。また、kubeletのkubelet_lifecycle_handler_http_fallbacks_total
メトリクスもカウントアップします。本機能を無効化したい場合は、kubeletに--feature-gates=ConsistentHTTPGetHandlers=false
フラグを設定してください。(#86139) -
JobTrackingWithFinalizers
がstableになりました。この機能が有効になるまえに作成されたJobはfinalizerのトラック対象ではありません。batch.kubernetes.io/job-tracking annotationを持つJobのみがfinalizerによるトラック対象です。付与済みのこのannotationをユーザが消した場合も、control planeによって再度追加されます。また、batch.kubernetes.io/job-tracking
annotationは非推奨になりました。v1.27以降では無視されます。新規Jobへのannotation追加もされません。(#113510) -
podTopologySpread
プラグインのNodeInclusionPolicy
がデフォルト有効になりました。(#113500) -
PodDisruptionBudget
にAlphaバージョンのspec.unhealthyPodEvictionPolicy
フィールドが追加されました。api-serverのPDBUnhealthyPodEvictionPolicy
feature-gate が有効な場合、このフィールドに"AlwaysAllow"
を設定すると現在のHealthステータスにかかわらず、Ready条件を持たないPodもevictされます。(#113375)- 📝 RunnningだけどHelthになるまでちょっと時間がかかるPodを退避したいけど、PDBでブロックされるのでHealth条件無視したいみたいなケースが稀にあるので嬉しい機能ですね。詳しくは KEP-3017 を参照してください。
- 今後は、利用時にAPIオブジェクトに指定されている
metav1.LabelSelectors
の値が不正な値が含まれていないかバリデーションされます。既存の不正なオブジェクトはアップデート可能ですが、新規作成するオブジェクトは正しいラベルセレクタが必要です。(#113699)- 📝 validationしてるコードはここです。
- Aggregated Discoveryがアルファになりました。Featureフラグの
AggregatedDiscoveryEndpoint
から有効にできます。(#113171)- 📝 詳しくはKEP-3352参照してください。
- コードのコメント内でCFS quotaを100msであることを明確化し、Linux kernelに沿うよう
cpuCFSQuotaPeriod
の最小値を1msに設定しました。(#112123) - component-baseとclient-goにあるLeaderElectionConfigurationのバリデーションロジックに一貫性をもたせました。(#111758)
- Horizontal Pod Autoscalerコントローラのworker数を設定できるように
kube-controller-manager
が--concurrent-horizontal-pod-autoscaler-syncs
フラグをサポートしました。(#108501)- 📝 デフォルトworker数として5が設定されています。
- Priority And Fairnessのv1beta3を導入しました。これに伴い、API仕様に以下の変更を加えます。(#112306)
- spec.limited配下のassuredConcurrencySharesを
nominalConcurrencyShares
に名称変更。 - flowschemaとprioritylevelconfigurationsの
Conditions
にstrategic merge patchのannotationを適用。
- spec.limited配下のassuredConcurrencySharesを
- Validating Admission PoliciesとCEL expressionによる拡張Admission Control(KEP-3488: CEL for Admission Control)用に
v1alpha1
APIを導入しました。これを利用するには、feature gateのValidatingAdmissionPolicy
と--runtime-config
からadmissionregistration.k8s.io/v1alpha1
APIを有効化してください。(#113314) - 自動リロード有効時に、KMSの設定で重複する名前が利用されているかのバリデーションが追加されました。APIサーバの
--encryption-provider-config-automatic-reload
フラグによりencryption設定の自動リロードを有効にしている場合、encryption設定内の全てのKMSプロバイダ名(v1 & v2)がユニークである必要があります。(#113697) - kubeletの外部credentialプロバイダ機能がGAになりました。Credential Provider Plugin と Credential Provider Config APIsが
v1beta1
からv1
に変更されています。(#111616) - Protobufシリアイゼーションの metav1.MicroTime タイムスタンプ(
Lease
とEvent
API objectで利用されている)がマイクロ秒の精度で切り捨てられるようになりました。これは、ドキュメント上のJSON/YAMLシリアイゼーションの挙動にあわせたものです。既存のデータもetcdから読み込まれる時にマイクロ秒に切り捨てられます。(#111936) - feature gateの
EndpointSliceTerminatingCondition
がGAに昇格しました。feature gateからはv1.28で削除予定です。 (#113351) - feature gateから
DynamicKubeletConfig
が削除されました。Dynamic kubelet reconfigurationはこの機能に依存している古いノードでも利用できなくなりました。これは、Kubernetesのversion skewポリシに則ったものです。(#112643)- 📝 Kubernetes version skewポリシについては公式ドキュメント参照してください。
✨ Features (機能追加)
-
APIServerIdentity
機能がベータに昇格しました。kube-apiserver
はデフォルトでkube-system
namespaceにLeaseを作るようになります。これらのLeaseオブジェクトはクラスタ内のアクティブなAPIサーバ数の識別に利用できます。将来的にはStorage Version APIに利用される予定です。(#113629)- 📝 k8s v1.20で追加されたKEP-1965のAPIServerIdentityがベータに昇格しました。この機能は、KEP-2339のStorage Version APIのHA構成のAPIサーバ対応に利用される予定です。現在のStorage Versionについては、そのクラスタ本当にアップグレードして大丈夫? Storage Version の更新も忘れずにしよう! を参照してください。
- kubeconfigのcluster info設定に
DisableCompression
フラグが追加されました(デフォルトfalse)。true
が設定された場合、クライアントはAPIサーバに対する全てのリクエストレスポンスの圧縮を無効化します。この機能は、client-server間の帯域幅が十分(>300MB/s)場合や、serverがCPU制約を受けている場合においてList時のレイテンシを大きく改善します。(#112309)- 📝 gzipのレベルとAPIサーバの負荷について検証したドキュメントはこちら。
- SLIメトリクスがAPIサーバの
metrics/slis
で公開されました。(#112741)- 📝 詳しくは Kubernetes コンポーネントの Service Level Indicator (SLI) メトリクス - Qiita 参照してください。
- client-goの
SharedInformerFactory
がシャットダウン中にgoroutineを待つようになりました。(#112200) - kube-apiserver: ネットワークの帯域と引き換えに(10-50% higher)、大きなlist呼び出しのレイテンシを改善するため、
gzip
圧縮がレベル4から1に変更されました。これにより、ページしていない非常に大きなList呼び出しがリクエストタイムアウトの制限を超えるまでの猶予増えました。(#112299) - feature gateの
LegacyServiceAccountTokenNoAutoGeneration
がGAに昇格しました。 (#112838) - feature gateの
LegacyServiceAccountTokenTracking
(alpha) が有効の場合、secretベースのService Accountトークンは最後に利用した時間がkubernetes.io/legacy-token-last-used
に記録されます。(#108858)
🐛 Bug or Regression (バグ修正)
-
golang.org/x/net
のバージョンがv0.1.1-0.20221027164007-c63010009c80
に上りました。(#112693) - 呼び出し元が
DelegatingAuthenticationOptions
のDisableAnonymous
を使ってAnonymousの認証を無効化できるようになりました。(#112181) - Etcdがv3.5.5にアップデートされました。(#112489)
- Priority and Fairnessにおいて、Service Accountのトークン作成コスト見積りを修正しました。(#113206)
- Priority and Fairnessにおいて、
metadata.name
が指定されたListリクエストのコストを修正しました。(#112557) - kube-apiserver: Custom Resourceを
--encryption-provider-config
フラグに指定すると、etcdに暗号化して保存できるようになりました。(#113015) - kube-apiserver: デフォルトでバックエンドからリダイレクトレスポンスが返されなくなりました。リダイレクトレスポンスの転送するには
--aggregator-reject-forwarding-redirect=false
フラグを設定してください。(#112193) - kube-apiserver: Aggregated APIサーバーからの
304 Not Modified
レスポンスを内部エラーとして扱うリグレッションを修正しました。(#112526) - 削除レスポンスに含まれる
ResourceVersion
は、削除イベントに含まれるResourceVersion
と一致するようになりました。(#113369) -
kube-scheduler
とkube-controller-manager
がPodの中断条件の設定にserver-side applyを利用するようになりました。(#113304) -
k8s.io/apimachinery/pkg/api/meta
のエラーがwrapされた時も含めstdlibs
errors.Is
のマッチングに対応しました。(#111808) - CVE-2022-32149の対応のため、
golang.org/x/text
がv0.3.8
に更新されました。 (#112989) - CVE-2021-25743の対応のため、
kubectl
が出力のTerminal特殊文字をエスケープするようになりました。(#112553)
🔬 Others (その他修正)
- feature gateのCEL in Admission Controlが
ValidatingAdmissionPolicy
に名称変更されました。(#113735) - in-tree クラウドプロバイダのOpenStack(cinder volumeプロバイダも含む)が削除されました。代わりに、外部のクラウドプロバイダとcsiドライバ(cloud-provider-openstack)を利用してください。 (#67782)