Container Service for Kubernetes (ACK) は、Certified Kubernetes Conformance Program に厳密に従っています。このトピックでは、Kubernetes 1.28 リリースにおける ACK の主な変更点について説明します。これには、アップグレードノート、主な変更点、特徴、非推奨の機能と API、および機能ゲートが含まれます。
コンポーネントのバージョン
次の表に、ACK クラスターでサポートされているコアコンポーネントのバージョンを示します。
コアコンポーネント | バージョン番号 |
Kubernetes | 1.28.15-aliyun.1、1.28.9-aliyun.1、および 1.28.3-aliyun.1 |
etcd | v3.5.9 |
CoreDNS | v1.9.3.10-7dfca203-aliyun |
CRI | containerd 1.6.20 |
CSI | |
CNI | Flannel v0.15.1.22-20a397e6-aliyun |
Terway および TerwayControlplane v1.5.0 以降 | |
NVIDIA Container Runtime | v3.13.0 |
Ingress コントローラー | v1.8.0-aliyun.1 |
アップグレードノート
コンポーネント | ノート |
CephFS および Ceph RBD ストレージボリュームプラグイン | クラスターが CephFS および RBD ボリュームプラグインを使用している場合、それらが Kubernetes が提供する in-tree ドライバーに依存しなくなり、off-tree ドライバーに切り替わっているかどうかを確認してください。互換性、安定性、またはパフォーマンスに関連するリスクを評価してください。 |
概念
この Kubernetes バージョンの機能変更と非推奨リソースについて読む前に、次の概念を理解してください。
主な変更点
Kubernetes v1.28 では、スケジューラのロジックが最適化され、無効な再試行が減少し、全体的なパフォーマンスが向上しました。
クラスターがカスタムスケジューラプラグインを使用している場合は、スケジューラのパフォーマンスを向上させるためにプラグインを最適化して更新することをお勧めします。詳細については、「Scheduling framework changes」をご参照ください。
CSI 移行では、Kubernetes コミュニティは、in-tree ストレージプラグインを、標準の CSI インターフェイスを実装する out-of-tree ドライバーに置き換える作業を進めてきました。この移行は Kubernetes v1.25 で GA に達しました。Kubernetes v1.27 では、
storage.k8s.io/v1beta1API と EBS プラグインが削除されました。Kubernetes v1.28 では、CephFS ボリュームプラグインのコードが削除され、kubernetes.io/rbdが非推奨となり、代わりに CephFS CSI driver が使用されます。さらに、Kubernetes 1.28 では Ceph RBD ボリュームを out-of-tree CSI ドライバーに移行できなくなりました。バージョン 1.28.15-aliyun.1 では CVE-2024-10220 が修正されました。
バージョン 1.28.9-aliyun.1 では、次の CVE が修正されました。
CVE-2023-45288
CVE-2024-24786
特徴
Kubernetes 1.27
Pod の終了ステータスが修正されました。Pending 状態で削除された Pod は Failed に設定されます。Running 状態で削除された Pod は、コンテナーの終了ステータスに応じて Succeeded または Failed に設定されます。この修正により、失敗ポリシーが構成された Pod が削除されたときに、Pod が Pending 状態のままになる問題が解決されます。
ただし、Pod が
RestartPolicy=Alwaysで構成されている場合、削除後に Succeeded ステータスで終了する可能性があります。そのため、コントローラーの変更が必要になる場合があります。詳細については、「Set the termination status for pods that do not require a restart」をご参照ください。永続ボリューム (PV) の ReadWriteOncePod 機能が Beta になりました。この機能は、ボリュームアクセスを単一の Pod に制限します。詳細については、「Single Pod Access Mode for PersistentVolumes Graduates to Beta」をご参照ください。
Pod トポロジースプレッド制約は、クラスター内の複数のゾーンに Pod をどのように分散させるかを制御します。ドメインの最小数を指定する (
minDomains)、スケジューリング中に Taint (nodeTaintsPolicy) とアフィニティ (nodeAffinityPolicy) を考慮する、ローリングアップデート中に制約を満たさない Pod をどのように扱うかを指定する (whenUnsatisfiable) など、いくつかの拡張機能が Beta になりました。詳細については、「More fine-grained pod topology spread policies」をご参照ください。
API サーバーに送信されたリソースを検証するためのサーバーサイドフィールド検証機能が GA になりました。kubectl はクライアントサイドの検証をスキップし、
Strictモードでサーバーサイドフィールド検証を自動的に使用し、検証が失敗した場合はエラーを報告します。詳細については、「Server Side Field Validation and OpenAPI V3 move to GA」をご参照ください。OpenAPI V3 は新しい OpenAPI 標準です。OpenAPI V3 は Kubernetes 1.23 で導入され、Kubernetes 1.27 で GA になりました。詳細については、「Server Side Field Validation and OpenAPI V3 move to GA」をご参照ください。
Horizontal Pod Autoscaler (HPA) では、Pod 内のコンテナーに対して ContainerResource を構成して、各コンテナーのリソース使用量に基づいて自動スケーリングを有効にできます。この機能は Kubernetes 1.27 で Beta になりました。Pod 全体の平均リソース使用量を考慮する元の Resource タイプとは異なり、このアプローチでは各コンテナーのリソース使用量を評価します。これにより、リソース使用量の少ないサイドカーコンテナーとリソース使用量の多いアプリケーションコンテナーが含まれているために Pod がスケールアウトに失敗し、計算された平均がスケールアウトのしきい値を下回るという問題が解決されます。
複数の StatefulSet 機能が Beta になりました。これには、0 以外の数値から Pod の序数を開始するサポートや、指定された削除およびスケールイン中に作成された PVC を自動的に削除するサポートが含まれます。
新しい機能により、Pod またはそのコンテナーを再起動することなく、Pod のコンテナーの
resourcesフィールドで指定された CPU およびメモリリソースをサイズ変更できます。ノードはrequestsに基づいて Pod にリソースを割り当て、limitsに基づいてそのリソース使用量を制限します。この機能をサポートするために、Pod に新しいフィールドが追加されます。詳細については、「Resize CPU and Memory Resources assigned to Containers」をご参照ください。この機能は Kubernetes 1.27 で Alpha になり、デフォルトで無効になっています。kubelet の
serializeImagePullsフィールドをfalseに設定して、デフォルトのシリアルイメージプルの代わりに パラレルイメージプル を有効にできます。v1.27 で maxParallelImagePulls フィールドが追加され、並行してプルできるイメージの数が制限されます。これにより、イメージのプルが過剰なネットワーク帯域幅やディスク I/O を消費するのを防ぎます。Volume Snapshot API に加えて、Kubernetes 1.27 では、ある時点で複数の PV のスナップショットを作成できる、クラッシュ整合性のあるボリュームグループスナップショット API が導入されました。詳細については、「Introducing an API for Volume Group Snapshots」をご参照ください。
Kubernetes 1.28
非グレースフルノードシャットダウンが GA になりました。この機能により、停電などにより元のノードが予期せずシャットダウンした場合に、StatefulSet が別のノードに同じ名前の Pod を作成できるようになり、サービスの中断を回避できます。
NodeOutOfServiceVolumeDetach 機能ゲートが GA になりました。これにより、異常なノードで終了した Pod のボリュームを即座にデタッチできます。これにより、Pod は他のノードで迅速に回復できます。
遡及的なデフォルト StorageClass 割り当て機能が GA になりました。以前は、デフォルトの StorageClass が存在しないときに
storageClassNameなしで PVC を作成すると、PVC は無期限に Pending 状態のままでした。現在では、デフォルトの StorageClass が作成されると、storageClassNameのない PVC は自動的に更新され、デフォルトの StorageClass を使用するようになります。Job の失敗を処理するための 2 つの新しい機能が導入されました。
JobPodReplacementPolicy (Alpha 機能ゲート) は、Pod が Failed フェーズ (
status.phase: Failed) に達した場合にのみ Pod が置き換えられるようにします。deletionTimestampがあり、終了中の場合は置き換えられません。これにより、2 つの Pod が同時に同じインデックスとノードリソースを占有するのを防ぎます。JobBackoffLimitPerIndex (Alpha 機能ゲート) を使用すると、
.spec.backoffLimitPerIndexを構成して、Indexed Job の個々のインデックスの失敗再試行回数を制限できます。これにより、単一のインデックスが永続的に失敗して.spec.backoffLimit制限に達した場合に、ジョブ全体が失敗するのを防ぎます。
Indexed Job の
completionカウントが 100,000 を超え、そのparallelismが 10,000 を超え、多くの Pod が失敗した場合、Job の終了ステータスを追跡できなくなる可能性があります。この問題を回避するために、Job の作成時に前述のフィールドに過度に大きな値を設定すると、警告が表示されます。reasonおよびfieldPathフィールドがカスタムリソース定義 (CRD) の入力規則に追加され、検証が失敗したときに指定された理由とフィールドパスを返すようになりました。詳細については、「CRD Validation Expression Language」をご参照ください。Webhook マッチングリクエストは、共通式言語 (CEL) 式をサポートするようになりました。最大 64 のマッチング条件がサポートされています。詳細については、「Matching requests: matchConditions」をご参照ください。
PVC の
.status.resizeStatusフィールドは、.status.allocatedResourceStatusマップフィールドに置き換えられました。これは、PVC のサイズ変更中のリソースの状態を示します。詳細については、「PersistentVolumeClaimStatus」をご参照ください。Indexed Job および StatefulSet タイプの Pod には、Pod インデックス (序数) がラベルに追加されるようになりました。
ValidatingAdmissionPolicy (Beta 版) は、リソースリクエストを検証するための宣言的な方法を提供します。これは、検証アドミッション Webhook をデプロイする代わりとなり、CEL 式を使用して複雑な入力規則を記述できます。API サーバーは、CEL 式に対してリソースリクエストを検証します。
Kube Controller Manager は、CronJob コントローラーの同時実行数を構成するための
--concurrent-cron-job-syncsフラグと、Job コントローラーの同時実行数を構成するための--concurrent-job-syncsフラグを導入しました。詳細については、「--concurrent-cron-job-syncs」および「--concurrent-job-syncs」をご参照ください。API Server の最適化には、次のものが含まれます。
キャッシュからリスト (GetList) を取得する際のメモリ使用量が削減されました。詳細については、「GetList test data」をご参照ください。
API Server レプリカが 1 つしか残っていない場合に Kubernetes Service のエンドポイントが削除されない問題が修正されました。これにより、グレースフルシャットダウン中にエンドポイントが迅速に削除されることが保証されます。
OpenAPI v2 コントローラーは CRD 情報を遅延的に集約するように設定され、OpenAPI v2 仕様が大幅に削減されました。クライアントが OpenAPI v2 にリクエストを送信しない場合、API サーバーの CPU とメモリの使用量が削減されます。さらに、多数の CRD をインストールする効率が向上します。ただし、これにより初回リクエストの処理が遅くなります。クライアントを OpenAPI v3 をサポートするバージョンに更新することをお勧めします。
Consistent Reads from Cache 機能ゲートが導入され、ウォッチキャッシュを使用して LIST リクエストの一貫した読み取りを保証できるようになりました。
より多くの監視メトリックが利用可能になり、メトリックエンドポイントからアクセスできます。
非推奨の機能
Kubernetes 1.27
in-tree AWS EBS ストレージプラグインは、out-of-tree CSI プラグインに置き換えられました。詳細については、「cloud-provider-aws」をご参照ください。
Node の
spec.externalIDフィールドは非推奨になりました。クライアントがこのフィールドを更新するリクエストを送信すると、警告が返されます。クライアントに警告を返す方法の詳細については、「Helpful Warnings Ahead」をご参照ください。Seccomp (Secure Computing Mode) は Kubernetes v1.19 で GA になりました。Pod またはコンテナーが実行できるシステムコールを制限することで、ワークロードのセキュリティを向上させます。Alpha ステージの
seccomp.security.alpha.kubernetes.io/podおよびcontainer.seccomp.security.alpha.kubernetes.ioアノテーションは v1.19 で非推奨となり、v1.27 で完全に削除されました。Pod またはコンテナーには
securityContext.seccompProfileフィールドを使用することをお勧めします。Kube Controller Manager (KCM) は、起動フラグ
--pod-eviction-timeout(NotReady ノードからの Pod エビクションの猶予期間) と--enable-taint-manager(Taint ベースのエビクション、デフォルトで有効) を削除しました。kubelet から
--container-runtime、--container-runtime-endpoint、および--image-service-endpoint起動フラグが削除されました。--container-runtimeフラグについては、dockershim の削除後もデフォルト値はremoteのままです。このフラグは v1.24 で非推奨となり、v1.27 で削除されました。--container-runtime-endpointおよび--image-service-endpointフラグは、起動コマンドとしてサポートされなくなりました。代わりに、これらの設定を kubelet 構成ファイルで構成する必要があります。SecurityContextDeny アドミッションコントローラーは非推奨となり、将来のバージョンで削除される予定です。
Kubernetes 1.28
in-tree CephFS ボリュームプラグインのコードが削除されました。
代わりに CephFS CSI driver を使用することをお勧めします。
Ceph RBD ボリュームを out-of-tree CSI ストレージドライバプラグインに移行するためのサポートは非推奨となり、将来のバージョンで完全に削除される予定です。
in-tree コードが削除される前に移行を完了してください。
RBD ボリュームプラグイン (kubernetes.io/rbd) は非推奨となり、将来のバージョンで削除される予定です。
代わりに CephFS CSI driver を使用することをお勧めします。
Key Management Service (KMS) v1 は非推奨になりました。KMSv1 を引き続き使用する場合は、
--feature-gates=KMSv1=trueを設定してください。詳細については、「Mark KMS v1beta1 as deprecated with no further fixes」をご参照ください。KMSv2 を使用してください。
Kubernetes Controller Manager (KCM) は、起動フラグ
--volume-host-cidr-denylistおよび--volume-host-allow-local-loopbackを非推奨にしました。kubelet の
--azure-container-registry-configフラグは非推奨になりました。image-credential-provider-configおよび--image-credential-provider-bin-dirフラグを使用することをお勧めします。Windows ノードプールの作成はサポートされなくなりました。
Alibaba Cloud Linux 3 や ContainerOS 3.1 など、他のオペレーティングシステムを使用するノードプールを作成できます。詳細については、「ノードプールの作成と管理」をご参照ください。
非推奨の API
CSIStorageCapacity API は、利用可能なストレージ容量を公開し、Pod が十分なストレージ容量を持つノードにスケジュールされるようにします。CSIStorageCapacity の storage.k8s.io/v1beta1 API バージョンは v1.24 で非推奨となり、v1.27 で削除されました。
storage.k8s.io/v1 を使用することをお勧めします。この API は Kubernetes v1.24 以降のバージョンで利用できます。詳細については、「Storage Capacity Constraints for Pod Scheduling KEP」をご参照ください。
機能ゲート
このセクションでは、主な変更点のみをリストします。詳細については、「Feature Gates」をご参照ください。
Kubernetes 1.27
Alpha ステージの
NodeLogQuery機能ゲートが追加されました。kubelet のenableSystemLogHandlerとenableSystemLogQueryをtrueに設定すると、kubectl を使用してノードログをクエリできます。StatefulSetStartOrdinal機能ゲートは Beta になりました。この機能ゲートを使用すると、StatefulSet によって作成された Pod に 0 以外の数値からシーケンス番号を割り当てることができます。デフォルトでは、この機能ゲートは有効になっています。StatefulSetAutoDeletePVC機能ゲートは Beta になりました。新しいポリシーは、StatefulSet がvolumeClaimTemplateから作成された PVC を削除するかどうか、およびいつ削除するかを制御します。IPv6DualStackは v1.23 で GA に達した後、デフォルトで有効になり、v1.27 ですべてのコンポーネントコードから完全に削除されました。クラスターでこれを手動で構成している場合は、クラスターをアップグレードする前に構成を削除する必要があります。
Alpha ステージの
ServiceNodePortStaticSubrange機能ゲートが追加され、NodePort Service へのポート割り当ての競合を減らします。この機能ゲートは、NodePort Service のポート範囲を 2 つの帯域に分割します。動的ポート割り当ては高帯域を使用します。ポート競合のリスクが低い低帯域は、NodePort Service にポートを静的に割り当てるために使用できます。詳細については、「Avoid Collisions Assigning Ports to NodePort Services」をご参照ください。InPlacePodVerticalScalingAlpha 機能ゲートが追加され、Pod またはコンテナーを再起動せずに Pod の CPU およびメモリリソースを調整できます。ボリュームを拡張するための次の機能ゲートが GA になり、デフォルトで有効になっています:
ExpandCSIVolumes(CSI ボリュームの拡張)、ExpandInUsePersistentVolumes(使用中の PV の拡張)、およびExpandPersistentVolumes(PV の拡張)。CSIMigration機能ゲート (in-tree ストレージプラグインを out-of-tree CSI ドライバーに移行する) は、常にデフォルトで有効になっており、削除されました。インラインボリュームの機能ゲートである
CSIInlineVolumeは、Kubernetes 1.25 で GA に達し、常にデフォルトで有効になっています。この機能ゲートは Kubernetes 1.27 で削除されました。EphemeralContainers機能は v1.25 で GA に達し、常にデフォルトで有効になっており、その機能ゲートは削除されました。LocalStorageCapacityIsolation機能ゲートは、emptyDirボリュームのエフェメラルストレージ容量の隔離をサポートします。これにより、Pod のローカルストレージ使用量にハードリミットを設定できます。使用量が制限を超えると、Pod は kubelet によってエビクションされます。この機能ゲートは Kubernetes 1.25 で GA になり、常にデフォルトで有効になっています。この機能ゲートは Kubernetes 1.27 で削除されました。NetworkPolicyEndPortは、ネットワークポリシーでendPortフィールドを設定して複数のポートを指定できる機能ゲートです。この機能ゲートが導入される前は、1 つのポートしか指定できませんでした。この機能ゲートは Kubernetes 1.25 で GA になり、常にデフォルトで有効になっています。この機能ゲートは Kubernetes 1.27 で削除されました。StatefulSetMinReadySeconds機能ゲートを使用すると、StatefulSet のminReadySecondsを構成できます。この機能ゲートは Kubernetes 1.25 で GA になり、常にデフォルトで有効になっています。この機能ゲートは Kubernetes 1.27 で削除されました。DaemonSetUpdateSurge機能ゲートを使用すると、DaemonSet のmaxSurgeを構成できます。この機能ゲートは v1.25 で GA に達し、常にデフォルトで有効になっています。この機能ゲートは削除されました。IdentifyPodOS機能ゲートを使用すると、Pod のオペレーティングシステムを指定できます。v1.25 で GA に達し、常にデフォルトで有効になっています。その後、この機能ゲートは削除されました。ReadWriteOncePod機能ゲートは Beta になり、デフォルトで有効になっています。この機能ゲートを使用すると、ReadWriteOncePodモードで PV にアクセスできます。
Kubernetes 1.28
NodeOutOfServiceVolumeDetach機能ゲートは Kubernetes 1.28 で GA になり、常にデフォルトで有効になっています。node.kubernetes.io/out-of-serviceTaint が追加されてノードがサービス停止中とマークされると、この Taint を許容しない Pod は強制的に削除され、そのボリュームは即座にデタッチされます。AdmissionWebhookMatchCondition機能ゲートはデフォルトで有効になっており、CEL 式を Webhook マッチング条件として使用できます。UnknownVersionInteroperabilityProxy機能ゲートは Alpha になりました。この機能ゲートは、複数の API サーバーバージョンが存在する場合に、正しい API サーバーにリクエストを送信できます。詳細については、「Mixed Version Proxy」をご参照ください。IPTablesOwnershipCleanup機能ゲートは GA になり、KUBE-MARK-DROP および KUBE-MARK-MASQ iptables チェーンを作成しなくなりました。ConsistentListFromCache機能ゲートは Alpha になりました。この機能ゲートにより、API サーバーはウォッチキャッシュを使用して LIST リクエストを処理でき、一貫した読み取りが保証されます。ProbeTerminationGracePeriod機能ゲートは GA になり、デフォルトで有効になっています。この機能ゲートを使用すると、プローブレベルの terminationGracePeriodSeconds を使用できます。GA ステージの次の機能ゲートが削除されました:
DelegateFSGroupToCSIDriver、DevicePlugins、KubeletCredentialProviders、MixedProtocolLBService、ServiceInternalTrafficPolicy、ServiceIPStaticSubrange、およびEndpointSliceTerminatingCondition。
リファレンス
Kubernetes 1.27 および 1.28 の完全な変更履歴については、「CHANGELOG-1.27」および「CHANGELOG-1.28」をご参照ください。