Podの優先度とプリエンプション
PriorityClassがPodの順位を決める仕組みと、スケジューラーが重要なワークロードのために優先度の低いPodをプリエンプトして空きを作る方法を学びます。
「Podの優先度とプリエンプション」はCoddyKit上の無料Kubernetes Basicsレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKubernetes Basics学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kubernetes Basicsコースには全4レッスンが含まれています。
Podはすべて同じではありません
クラスターが満杯になると、ワークロードによって重要度が異なります。Podの優先度を使うと、リソースの割り当てをめぐる競争で、どのPodを優先すべきかをKubernetesに伝えられます。
PriorityClassとは
PriorityClassは、名前と整数値を対応付けるクラスター全体のオブジェクトです。数値が大きいほど優先度が高くなります。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: 'For critical production workloads'Podに優先度を割り当てる
PodはpriorityClassNameでクラスを指定します。スケジューラーは、参照されたクラスから数値を読み取ります。
apiVersion: v1
kind: Pod
metadata:
name: critical-app
spec:
priorityClassName: high-priority
containers:
- name: app
image: myapp:1.0優先度がスケジューリングに与える影響
複数のPodが保留中の場合、スケジューラーは優先度の高いPodから配置しようとします。優先度は、Podがスケジュールされる順序に影響します。
プリエンプションとは
クラスターが満杯で高優先度のPodをスケジュールできない場合、スケジューラーは低優先度のPodをプリエンプト(退避)して、空きを作ることがあります。
退避されたPodはPendingに戻り、別の場所で再スケジュールされる可能性があります。
プリエンプションの動作
ノードがpriority-100のPodで満杯になっているところへ、priority-1000000のPodが到着したとします。スケジューラーは、重要なPodを配置できるよう、低優先度のPodを必要な数だけ削除できます。
kubectl get events --field-selector reason=Preempted
# Pod default/batch-job was preempted by critical-appプリエンプションを無効にする
PriorityClassでは、preemptionPolicy: Neverを指定して、他のPodをプリエンプトしないようにできます。このようなPodも優先度の順序に従ってスケジュールされますが、他のPodを退避させることはありません。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-no-preempt
value: 1000000
preemptionPolicy: Neverグローバルデフォルト
PriorityClassにglobalDefault: trueを設定すると、優先度を指定していないPodにその値が適用されます。グローバルデフォルトにできるクラスは1つだけです。
組み込みのシステムクラス
Kubernetesには、重要なコンポーネント向けにsystem-cluster-criticalやsystem-node-criticalなどの予約済みクラスが用意されています。これらをアプリに再利用しないでください。
kubectl get priorityclass
# system-node-critical 2000001000
# system-cluster-critical 2000000000ベストプラクティス
- 明確な少数のティア(例: critical、normal、batch)を定義します
- 本当に重要なワークロードに限ってプリエンプションを使用します
- リソースリクエストと組み合わせて、スケジューリングの判断を正確にします
- すべてを高優先度にすることは避けます。そうすると優先度を設定する意味がなくなります
優先度とQoSの違い
優先度はスケジューリングとプリエンプションを制御します。Quality-of-Serviceクラス(requests/limitsから決まります)は、ノードに負荷がかかった際の退避を制御します。両者は関連していますが、異なる仕組みです。
理解度チェック
プリエンプションについての理解度を確認しましょう。
まとめ
PriorityClassによって、Podが整数値で順位付けされ、スケジューリングの順序に影響することを学びました。クラスターが満杯の場合、プリエンプションによって重要なPodが低優先度のPodを退避させられます。明確な少数のティアを使い、優先度を正確なリソースリクエストと組み合わせてください。
よくある質問
「Podの優先度とプリエンプション」レッスンは無料ですか?
はい。「Podの優先度とプリエンプション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kubernetes Basicsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kubernetes Basicsコースには全4レッスンが含まれています。
「Podの優先度とプリエンプション」で何を学びますか?
PriorityClassがPodの順位を決める仕組みと、スケジューラーが重要なワークロードのために優先度の低いPodをプリエンプトして空きを作る方法を学びます。 ブラウザで直接実行するハンズオンコードでKubernetes Basicsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kubernetes Basicsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKubernetes Basicsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Podの優先度とプリエンプション」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKubernetes Basicsレッスンでコードを書いて実行できますか?
はい。すべてのKubernetes Basicsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- リソースのRequestsとLimits
- ノードセレクターとアフィニティ
- TaintsとTolerations
- Podの優先度とプリエンプション