PerfectScalePerfectScale

PerfectScale

Kubernetes v1.37(Garhwal):新機能と改善点を総まとめ

Kubernetes v1.37「Garhwal」では、サイドカーのインプレースリサイズのGA化、HPAのゼロスケール、Memory QoS、ギャングスケジューリングが追加されました。Stable・Beta・Alphaの注目機能をご紹介します。

このページはEnglish、Deutsch、Español、Français、Italiano、Portuguêsでもご覧いただけます。

Tania Duggal
By Tania Duggal
Aug 31, 202620 min read

TL;DR

Kubernetes v1.37(「Garhwal」)には67件の機能強化が含まれています。内訳はStableが16件、Betaが23件、Alphaが27件、削除が1件です。目玉となる変更は、initコンテナおよびサイドカーコンテナのインプレースリサイズ(GA)、HPA許容値の設定(GA)、node declared features(GA)、HorizontalPodAutoscalerのゼロスケール(Beta)、Memory QoS(Beta)、Pod単位のリソースマネージャー(Beta)、新しいWorkload APIによるギャングスケジューリング(Beta)、そしてKubeletのrootlessモード(Beta)です。Alphaには、協調的なEviction Request APIやPod単位のチェックポイント/リストアに加え、Dynamic Resource Allocation(DRA)の継続的な進展も含まれます。要対応事項:本リリースではSELinuxマウントのラベル付けがデフォルトで変更され、SELinuxが有効なクラスターでは既存のワークロードが動作しなくなる可能性があります。

Kubernetes v1.37(コードネーム「Garhwal」)は、リソース管理、オートスケーリング、スケジューリングを重視するチームにとって見どころの多いリリースです。今回のリリースには67件の機能強化が含まれており、16件がStable(GA)、23件がBeta、27件がAlphaになり、1件が削除されました。名前の由来はインド・ウッタラーカンド州のヒマラヤ地域「Garhwal(ガルワール)」です。段々畑から山あいの渓流まで、層が互いにつながり支え合うというテーマは、過去のバージョンの成果の上に積み重ねていく今回のリリースにぴったりです。

Kubernetes v1.37で私たちが特に注目している機能は、initコンテナおよびサイドカーコンテナのインプレースリサイズ、HorizontalPodAutoscalerのゼロスケール、Memory QoS、そしてWorkload APIによるネイティブなギャングスケジューリングです。これらの多くは、リソースの有効活用、実需要に基づくスケーリング、密結合なワークロードの配置において、Kubernetesをより優れたものにします。

Kubernetes v1.37の主な変更点は以下のとおりです。

Kubernetes v1.37のStable機能

1. Initコンテナとサイドカーコンテナのインプレースリサイズ

機能グループ: SIG Node | KEP: #1287

インプレースのPodリサイズはKubernetes v1.35でStable(GA)になりました。v1.37では、このサポートがinitコンテナとサイドカーコンテナに拡張され、この部分もGAとなっています。

この変更以前は、実行中のアプリコンテナのCPUとメモリは再起動なしでリサイズできましたが、initコンテナとサイドカーコンテナは対象外でした。サイドカーコンテナとはrestartPolicy: Alwaysを指定したinitコンテナのことで、Podのライフサイクル全体を通じて実行されます。サイドカーにより多くのCPUやメモリが必要になった場合、現実的な選択肢はPodの再作成しかありませんでした。つまり、変更が必要なのはサイドカーだけであっても、メインアプリにもダウンタイムが発生していました。

v1.37では、InPlacePodVerticalScalingInitContainersフィーチャーゲートがGAになりました。実行中のサイドカーコンテナのCPU・メモリのrequestsやlimitsを変更でき、kubeletがコンテナのcgroup設定をその場で更新します。Podは稼働し続けます。動作はリソースごとにresizePolicyで制御できます。NotRequiredは変更をライブで適用し、RestartContainerはそのコンテナだけを再起動して適用します。v1.37では、同じ機能に2つのAlpha要素も追加されました。メモリベースのemptyDirボリュームのインプレースリサイズ(InPlacePodVerticalScalingMemoryBackedVolumesゲート)と、保留されたリサイズのためにスケジューラーが低優先度のPodをプリエンプトして空きを作れるようにする機能(InPlacePodVerticalScalingSchedulerPreemptionゲート)です。

apiVersion: v1
kind: Pod
metadata:
name: app-with-sidecar
spec:
initContainers:
- name: log-shipper # sidecar
image: log-shipper:1.0
restartPolicy: Always
resizePolicy:
- resourceName: cpu
restartPolicy: NotRequired
- resourceName: memory
restartPolicy: RestartContainer
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
containers:
- name: app
image: app:1.0
# ...

この設定では、サイドカーのCPUは一切の再起動なしで引き上げられます。メモリを増やした場合はそのコンテナ1つだけが再起動され、Pod全体が再起動されることはありません。

2. HorizontalPodAutoscalerの許容値(tolerance)設定

機能グループ: SIG Autoscaling | KEP: #4951

Kubernetes v1.37では、HorizontalPodAutoscaler(HPA)の許容値設定がGeneral Availability(GA)に昇格しました。

HPAは、CPUやメモリなどのメトリクスに基づいてPodのレプリカ数を変更します。この機能が導入される前は、HPAはクラスター全体で固定の10%の許容値を使用しており、使用量がターゲットから10%以上乖離するまで動作しませんでした。この単一の値がすべてのワークロードに適しているわけではありません。要件の厳しいサービスでは反応が遅すぎることがあり、値を変更するにはクラスター内のすべてのHPAに影響するグローバルなコントローラーフラグを編集する必要がありました。

v1.37では、HPAConfigurableToleranceフィーチャーゲートがGAになりました。許容値はHPAごと、かつスケーリング方向ごとにbehaviorフィールドで設定できます。スケールアップ時の許容値を厳しくすれば、重要なサービスがわずかな負荷増加にも反応できます。それ以外は緩めの許容値にすることで、負荷の少ないワークロードを安定させられます。この機能はv1.35でBetaとなり、今回標準の動作になりました。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
behavior:
scaleUp:
tolerance: 0.05

許容値はパーセントポイントではなく比率です。0.05でターゲットが60%の場合、CPU使用率が約63%(60%×1.05)を超えた時点でHPAがスケールアップします。従来の固定10%の許容値よりも早く反応できます。

3. Node Declared Features

機能グループ: SIG Node | KEP: #5328

Kubernetes v1.37では、node declared featuresがGeneral Availability(GA)に昇格しました。

この機能が導入される前、Kubernetesは、バージョンがサポートされるスキューの範囲内にある限り、コントロールプレーンがサポートするあらゆる機能をノードが扱えるものと想定していました。しかし、これは常に正しいわけではありません。コントロールプレーンで新機能を有効にしても、スケジューラーはその機能を使うPodを、まだ対応していない古いノードに配置してしまう可能性がありました。配置自体は問題なく見えても、Podは実行時に失敗したり、スケジューリング後に停止したままになったりしていました。

v1.37では、NodeDeclaredFeaturesフィーチャーゲートがGAになりました。各ノードは、自身が理解できる機能のセットをNodeオブジェクトのstatus.declaredFeaturesフィールドで公開するようになりました。スケジューラーとアドミッションチェックはこれを利用して、機能を使うPodをその機能をサポートするノードにのみ配置します。これにより、実行時の失敗が明確なスケジューリング判断に変わります。ノードのバージョンが混在するアップグレード時に特に重要です。node declared featuresはv1.35でAlphaでした。

Kubernetes v1.37のBeta機能

4. HorizontalPodAutoscalerのゼロスケール

機能グループ: SIG Autoscaling | KEP: #2021

Kubernetes v1.37では、HorizontalPodAutoscalerのゼロスケール(scale to zero)がBetaに昇格し、デフォルトで有効になりました。

この機能が導入される前、HPAはワークロードのレプリカ数をゼロまで減らすことができず、最小でも1でした。キューコンシューマーやバッチワーカーのように処理が発生する時間が限られるサービスでは、何もすることがない間も、少なくとも1つのPodを稼働させ続けるコストがかかっていました。

v1.37では、HPAにspec.minReplicas: 0を設定して、アイドル時にワークロードをゼロまでスケールダウンさせ、需要が戻ったら復帰させることができます。これはキューの長さなど、ObjectメトリクスまたはExternalメトリクスで駆動されるワークロードで機能します。CPUやメモリのメトリクスでは機能しません。これらのメトリクスは稼働中のPodから取得されるものであり、ゼロの状態ではPodが存在しないためです。キューコンシューマー、バッチジョブ、実行の合間にアイドル状態になるGPUワークロードのコスト削減につながります。HPAがワークロードをゼロに保っている間は、ScaledToZeroコンディションがTrueとして記録されるため、HPAがゼロにスケールしたワークロードと手動で停止されたワークロードを区別できます。再びスケールアップすると、このコンディションは理由NotScaledToZeroとともにFalseになります。

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: worker-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: queue-worker
minReplicas: 0
maxReplicas: 20
metrics:
- type: External
external:
metric:
name: queue_messages
target:
type: AverageValue
averageValue: "30"

この構成では、キューが空になるとワークロードはPod数ゼロまで縮小し、メッセージが届くとHPAが再びスケールアップします。

5. Memory QoS

機能グループ: SIG Node | KEP: #2570

Kubernetes v1.37では、Memory QoSがBetaに昇格しました。

この機能が導入される前、kubeletはコンテナにハードなメモリ制限(cgroupのmemory.max)を設定していましたが、カーネルに対してそれより緩やかなシグナルは一切与えていませんでした。コンテナは制限ぎりぎりまでメモリを使用し、その後ほとんど前触れなくOOM killされる可能性がありました。また、コンテナのrequestに紐づいたメモリ保護もなかったため、メモリ圧迫時には、requestの範囲内に収まっているコンテナからでもカーネルがページを回収してしまうことがありました。

v1.37では、MemoryQoSフィーチャーゲートがBetaになりました。cgroup v2のメモリ制御を利用して、カーネルにより適切なシグナルを与えます。kubeletはコンテナのメモリrequestからmemory.minを設定し、その分のメモリを回収から保護します。kubelet設定でmemoryThrottlingFactorを指定すると、kubeletはlimitより低いスロットリングポイントとしてmemory.highも設定します。これにより、コンテナがハードリミットに達してOOM killされる前に、カーネルがコンテナを減速させてページを回収します。デフォルトではmemoryThrottlingFactorは設定されておらず、設定しない限りmemory.highは無効のままです。cgroup v2が必須ですが、v1.35以降はcgroup v2が唯一サポートされるモードとなっています。

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9

この設定では、kubeletは0.9の係数を用いて、コンテナのメモリlimitより低い位置にmemory.highを設定します。カーネルはハードリミットに達する前にメモリを回収してコンテナをスロットリングするため、メモリ圧迫時のOOM killが起こりにくくなります。

6. Pod単位のリソースマネージャー

機能グループ: SIG Node | KEP: #5526

Kubernetes v1.37では、Pod単位のリソースマネージャーがBetaに昇格しました。

Kubernetes v1.34ではPodレベルのリソース(KEP #2837)が追加され、コンテナ単位だけでなくPod全体に対してCPUとメモリのrequests・limitsを設定できるようになりました。しかし、kubeletのリソースマネージャーはこれらのPodレベルの値をまだ理解していませんでした。この機能が導入される前、CPU Manager、Memory Manager、Topology Managerはコンテナ単位のrequestsしか参照していませんでした。そのため、Podレベルでリソースを設定したPodは、専用CPUのピン留めやNUMAアライメントの恩恵を受けられない可能性がありました。

v1.37では、PodLevelResourceManagersフィーチャーゲートがBetaになりました。v1.37ではデフォルト無効です。一度有効化されたものの、リリースサイクル終盤にチームが重大な問題を発見したため無効に戻されました。利用したい場合は自分で有効化する必要があります。有効にすると、CPU Manager(staticポリシー)、Memory Manager、Topology Managerが、CPU・メモリ・ハードウェアの局所性を割り当てる際にPodレベルのリソースを考慮します。これにより、Podレベルでリソースを設定するレイテンシー重視の高性能なワークロードでも、専有コアとNUMAアラインされたメモリを確保できます。

apiVersion: v1
kind: Pod
metadata:
name: guaranteed-pod
spec:
resources: # pod-level resources
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "2"
memory: "4Gi"
containers:
- name: app
image: app:1.0
# containers can set their own resources, or use the pod-level ones

この構成では、PodはPodレベルでGuaranteedとなり、コンテナが自身のrequestsを設定していなくても、kubeletのマネージャーがCPUコアを丸ごとピン留めし、メモリをアラインできます。

7. Workload APIによるギャングスケジューリング

機能グループ: SIG Scheduling | KEP: #4671

Kubernetes v1.37では、Workload APIによるネイティブなギャングスケジューリングがBetaに昇格しました。

この機能が導入される前、KubernetesはPodを1つずつスケジュールしていました。すべてのワーカーが同時に起動しなければならない分散学習の実行のような密結合ジョブでは、これが部分的なスケジューリングを引き起こしていました。一部のPodは起動する一方で他はpendingのまま残り、リソースを占有しながら何の成果も出さない状態になります。オール・オア・ナッシング(ギャング)の動作を実現するには、外部スケジューラーを追加する必要がありました。Kubernetes v1.35では、新しいWorkload APIを通じたネイティブなギャングスケジューリングがAlphaとして導入されました。

v1.37では、APIはscheduling.k8s.io/v1beta1になりました。有効化にはGenericWorkloadフィーチャーゲートを使用します。v1.37では、従来のGangSchedulingとWorkloadAwarePreemptionのゲートがGenericWorkloadに統合され、1つのゲートでギャングスケジューリングとワークロードを考慮したプリエンプションの両方をカバーするようになりました。モデルは3つの要素で構成されます。Workloadは1つ以上のpodGroupTemplatesを保持し、それぞれがgangなどのスケジューリングポリシーとminCountを持ちます。PodGroupはテンプレートから作成され、実行中の1つのグループを追跡します。各PodはschedulingGroup.podGroupNameで自身のグループを指定します。スケジューラーは、少なくともminCount個のPodがまとめて実行可能になるまでPodを保留し、可能になった時点で配置します。minCountを満たせない場合はどのPodもバインドされず、空きが出るまで待機します。minCountフィールドは作成後も変更可能なため、エラスティックなジョブのスケールアップ・ダウンにも対応できます。

Workloadがテンプレートを定義します。

apiVersion: scheduling.k8s.io/v1beta1
kind: Workload
metadata:
name: training-job
spec:
podGroupTemplates:
- name: workers
schedulingPolicy:
gang:
minCount: 4

そのテンプレートからPodGroupが作成されます。

apiVersion: scheduling.k8s.io/v1beta1
kind: PodGroup
metadata:
name: training-job-workers-0
spec:
workloadRef:
workloadName: training-job
templateName: workers
schedulingPolicy:
gang:
minCount: 4

各Podは名前でグループに参加します。

apiVersion: v1
kind: Pod
metadata:
name: worker-0
spec:
schedulingGroup:
podGroupName: training-job-workers-0
containers:
- name: trainer
image: trainer:1.0
# ...

この構成では、Kubernetesは少なくとも4つのワーカーがまとめて実行可能になったときにのみワーカーをスケジュールします。クラスターに4つ分の空きがなければ、1つも起動しません。

8. ユーザー名前空間でのKubelet実行(Rootlessモード)

機能グループ: SIG Node | KEP: #2033

Kubernetes v1.37では、kubeletをユーザー名前空間内で実行するRootlessモードがBetaに昇格しました。

この機能が導入される前、kubeletなどのノードコンポーネントはホスト上でrootとして動作していました。kubeletが侵害されると、攻撃者はノード全体のroot権限を取得できてしまう可能性がありました。

v1.37では、KubeletInUserNamespaceフィーチャーゲートがBetaになりました。kubeletとその他のノードコンポーネントをLinuxのユーザー名前空間内で実行します。名前空間の内側ではrootに見えますが、ホスト上では非特権ユーザーにマッピングされます。kubeletの日常的な使い方を変えることなく、隔離のレイヤーが1つ追加されます。この機能はv1.22から開発が続けられてきたもので、Beta到達は大きな前進です。

Kubernetes v1.37のAlpha機能

9. Eviction Request API

機能グループ: SIG Node | KEP: #4563

この機能が導入される前、メンテナンスのためのノードのドレインはクライアント側の操作でした。kubectl drainのようなツールがPodを1つずつ退避させ、PodDisruptionBudgetを尊重していましたが、その意図はクラスター内ではなくクライアント側にありました。コントローラーやアプリケーションは、ノードがドレイン中であることを把握したり、安全な引き継ぎを調整したり、判断に関与したりできませんでした。ステートフルなアプリは、メンテナンスが迫っていることを知らされないまま、都合の悪いタイミングで退避させられる可能性がありました。

v1.37では、Alpha機能としてEvictionRequest APIが追加され、強制的な削除ではなく協調的な退避が可能になります。リクエスターがPodに対してEvictionRequestを作成し、新しいspec.evictionResponders Podフィールドを通じて登録されたコンポーネントが、グレースフルな引き継ぎを処理します。v1.37では、新しいNodeライフサイクルコンディション(MaintenancePlanned、MaintenanceInProgress、GracefulNodeShutdownInProgress、DrainInProgress、Drained)も追加され、コントローラーはこれらを監視してノードがメンテナンスフローのどの段階にあるかを把握できます。これらを組み合わせることで、アプリケーションやオペレーターは、たとえばPodが消える前にリーダーを移動したり状態をフラッシュしたりするなど、自分たちの都合に合わせてドレインを進められます。

10. Pod単位のチェックポイントとリストア

機能グループ: SIG Node | KEP: #5823

この機能が導入される前、Kubernetesは単一コンテナのチェックポイント(KEP #2008)が可能で、主にフォレンジック分析向けでした。1つのコンテナの状態はスナップショットできましたが、Pod全体を一度に取得することはできず、マルチコンテナのPodを1つの単位としてキャプチャすることはできませんでした。

v1.37では、Alpha機能としてPod単位のチェックポイントとリストアが追加されます。Container Runtime Interface(CRI)をCheckpointPodとRestorePodの呼び出しで拡張し、kubeletと対応ランタイムがPod内のすべてのコンテナをまとめてスナップショットし、後でリストアできるようにします。現時点ではフォレンジック用途に有用であり、実行中のPodをノード間で移動させるといった将来の用途への土台にもなります。この機能には、新しいCRI呼び出しをサポートするコンテナランタイムが必要です。

Dynamic Resource Allocation(DRA)— 継続中の取り組み

機能グループ: SIG Node / SIG Scheduling

Dynamic Resource Allocation(DRA)は、GPUをはじめとする特殊なハードウェアやデバイスをリクエスト・共有するためのKubernetesネイティブな仕組みで、スケジューラーが割り当て状況を把握できます。DRAのコア機能はv1.34でGAに到達しました。v1.37では、複数のDRA機能が前進しています。

Device Taints and Tolerations(GA化):デバイスtaintにより、ノード全体ではなく単一のデバイスが「回避すべき」と宣言でき、claim側はtolerationを追加してそれを受け入れられます。v1.37でGAに昇格し、resource.k8s.io/v1 APIで利用可能です。ノード全体をサービスから外すことなく、不良GPUの1台だけをcordonしたりマークしたりできます。

DRA Extended Resource(GA化):Podのrequestsで、おなじみの拡張リソース形式を使ってDRA管理のデバイスをリクエストでき、その裏側の割り当てはDRAが処理します。v1.37でGAに昇格しました。

ResourceClaim Device Status(GA化):ドライバーが報告するネットワーク詳細など、claimされたデバイスのステータスがGAになりました。ツールは標準的な方法でデバイスの状態を読み取れます。

Workload Resource Claims(Beta化):リソースclaimを、ギャングスケジューリングで使用されるものと同じWorkload APIのWorkloadに紐づけられるようになり、Podのグループがデバイスclaimを共有できます。v1.37ではBetaで、DRAWorkloadResourceClaimsゲートはデフォルト無効です。

DRA Node Allocatable Resources(Alpha、リソース管理の観点で要注目):このAlphaの取り組みにより、DRAはCPU、メモリ、hugepagesといったノードリソースをデバイスとしてモデル化できるようになります。有効にすると、kubeletはPodとコンテナのcgroup、OOMスコア、Memory QoSのしきい値を設定する際に、DRAで割り当てられたリソースを考慮します。DRA claimを使用するPodについては、標準のrequestsとlimitsもインプレースでリサイズできます。まだ初期段階ですが、DRAがアドオンのデバイスだけでなくコアリソースまで管理できる未来を示すものです。

非推奨・削除

SELinuxマウントがデフォルトに(要対応):SELinuxMountフィーチャーゲートはv1.37でGAとなり、デフォルトで有効です。SELinuxが有効なクラスターでは、ボリュームのラベル付け方法が変わり、一部の既存ワークロードが動作しなくなる可能性があります。SELinuxを利用している場合は、アップグレード前にKubernetesブログのSELinuxボリュームラベルの変更を読み、影響を受けるワークロードを特定して修正するか、先にオプトアウトしてください。SELinuxを使用していないクラスターには影響ありません。

kube-proxyのIPVSモードが非推奨に:kube-proxyのIPVSモードはv1.35から非推奨となっています。v1.37では、使用時にkubeadmが警告を出すようになりました。新しいLinuxカーネルでは、v1.33からGAとなっているnftablesモードが推奨されます。古いカーネルでは引き続きiptablesがデフォルトであり、サポートも継続されます。

scheduling.k8s.io/v1alpha2 APIの削除:scheduling.k8s.io/v1alpha2バージョンはv1.37で削除されました。新しいAlpha型はv1alpha3に移行し、コアのWorkloadとPodGroupの型はv1beta1になりました。以前のワークロード対応スケジューリングAPIを使用していた場合は、アップグレード前にすべてのv1alpha2オブジェクトをAPIサーバーから削除してください。

レガシーなcAdvisorフラグとメトリクスの削除:kubeletに組み込まれたcAdvisorがスリムなビルドに移行しました。長らく非推奨だった複数のcAdvisorフラグは受け付けられなくなり、いずれかが設定されているとkubeletは起動に失敗します(維持されるのは--housekeeping-intervalのみ)。container_tasks_stateやcontainer_cpu_load_average_10sなど、一部の古いcAdvisorメトリクスはエクスポートされなくなりました。kubeletのフラグと、これらのメトリクスを使用していたダッシュボードを確認してください。

その他の削除と注意点:v1.33からロック済みだったAnyVolumeDataSourceフィーチャーゲートが削除されました。また、非推奨のkubeletコンテナランタイム設定フラグの一部の削除は、containerd v1.7サポートと足並みをそろえるため、v1.37からv1.38に延期されました。古いcontainerdをまだ運用している場合は、アップグレードを計画してください。

Kubernetes v1.37には合計67件の機能強化が含まれています。本記事で取り上げた変更以外にも、Metrics API(metrics.k8s.io)のv1到達、watchキャッシュ初期化作業の完了(残っていたWatchCacheInitializationPostStartHookゲートがStableに到達)、マニフェストベースのアドミッションコントロールのBeta化など、オートスケーリング、ストレージ、セキュリティ、可観測性にわたる多くの取り組みが含まれます。全リストについては、Kubernetesのv1.37リリースノートとチェンジログをぜひご確認ください。

PerfectScale by DoiTでワークロードを健全に保つ

Kubernetes v1.37は、リソース管理のためのより優れたツールを提供します。サイドカーを再起動なしでリサイズし、ワークロードごとにHPAの許容値を設定し、アイドル状態のワークロードをゼロまでスケールし、Memory QoSでメモリを保護できます。しかし、これらのツールは適切な数値を選んで初めて効果を発揮します。requestsとlimitsを低く設定しすぎると、OOM kill、CPUスロットリング、退避が発生します。高く設定しすぎると、使いもしないキャパシティに費用を払うことになります。変化し続けるクラスター全体で、すべてのワークロードに対してこれを手作業で行い続けるのは容易ではありません。

PerfectScale by DoiTは、こうした作業を肩代わりするKubernetesガバナンスプラットフォームです。OOM kill、CPUスロットリング、退避といったリソース起因のリスクを監視し、手動でも自律的にも適用できる、実行可能で自動化されたライトサイジングの推奨事項へと変換します。これにより、SLOを損なうことなく、ゼロスケールやインプレースリサイズといった機能によるコスト削減を手にできます。Paramount PicturesやCreditasのようなチームがPerfectScaleを活用し、クラスターの低コストと信頼性を両立しています。

サインアップまたは技術デモを予約して、クラスターのどこで無駄なコストやリスクが発生しているかを確認しましょう。

FAQ

Kubernetes v1.37はなぜ「Garhwal」と呼ばれるのですか?

リリース名はインド・ウッタラーカンド州のヒマラヤ地域Garhwalに由来します。段々畑から山あいの渓流まで、層が互いにつながり支え合うというテーマで、過去のバージョンの成果の上に積み重ねていく今回のリリースにふさわしいものです。

Kubernetes v1.37にはいくつの機能強化が含まれていますか?

合計67件です。16件がStable(GA)、23件がBeta、27件がAlphaになり、1件が削除されました。

Kubernetes v1.37の最大の新機能は何ですか?

特に注目すべき変更は、initコンテナおよびサイドカーコンテナのインプレースリサイズ(GA)、HPA許容値の設定(GA)、node declared features(GA)、HorizontalPodAutoscalerのゼロスケール(Beta)、Memory QoS(Beta)、Pod単位のリソースマネージャー(Beta)、Workload APIによるネイティブなギャングスケジューリング(Beta)です。

HorizontalPodAutoscalerでDeploymentをレプリカ数ゼロまでスケールできますか?

はい。HPAのゼロスケールはv1.37でBetaとなり、デフォルトで有効です。spec.minReplicas: 0を設定すると、キューの長さなど、ObjectメトリクスやExternalメトリクスで駆動されるワークロードで機能します。CPUやメモリのメトリクスでは機能しません。これらは稼働中のPodから取得されるもので、ゼロの状態ではPodが存在しないためです。

Pod全体を再起動せずにサイドカーコンテナをリサイズできますか?

はい。v1.37ではInPlacePodVerticalScalingInitContainersフィーチャーゲートがGAとなり、インプレースリサイズ(アプリコンテナについてはv1.35からGA)がinitコンテナとサイドカーコンテナに拡張されました。変更がライブで適用されるか、そのコンテナ1つだけが再起動されるかは、リソースごとに設定するresizePolicyによって決まります。

Kubernetes v1.37のMemory QoSとは何ですか?

Memory QoSはBetaとなり、cgroup v2の制御(memory.minとmemory.high)を使用して、コンテナがrequestしたメモリを回収から保護し、ハードリミットに達する前にスロットリングします。これにより、メモリ圧迫時のOOM killが起こりにくくなります。

Kubernetes v1.37で非推奨または削除されるものは何ですか?

SELinuxマウントがGAのデフォルトとなり、SELinuxが有効なクラスターではボリュームのラベル付けが変わる可能性があります(アップグレード前に要対応)。kube-proxyのIPVSモードはnftablesを推奨として非推奨になりました。scheduling.k8s.io/v1alpha2 APIとレガシーなcAdvisorフラグ/メトリクスは削除されました。

新しいWorkload APIのギャングスケジューリングはどのように動作しますか?

Workloadが、スケジューリングポリシー(gangなど)とminCountを持つ1つ以上のpodGroupTemplatesを定義します。Podはそのテンプレートから作成されたPodGroupに参加し、スケジューラーは少なくともminCount個のPodがまとめて実行可能になったときにのみ配置します。分散学習のような密結合ジョブに有用です。