ポッドの優先度の設定
ポッドの優先度と回避により、Red Hat OpenShift クラスターのワークロードを構成するポッドの相対的な優先度を示す優先度クラスを構成できます。 Red Hat OpenShift コントローラーは、ポッドの優先度を考慮に入れ、高優先度のポッド用にワーカー・ノードのスペースを確保するために低優先度のポッドを回避 (削除) することもできます。 詳しくは、 Red Hat OpenShift のドキュメントを参照。
- なぜポッドの優先順位を設定するのですか?
- クラスター管理者は、クラスター・ワークロードにとってどのポッドがより重要かを制御する必要があります。 優先度クラスは、低優先度のポッドより高優先度のポッドを優先するように Red Hat OpenShift コントローラーの決定を制御するのに役立ちます。 Red Hat OpenShift コントローラーは、保留中の高優先度のポッドをスケジュールできるように、実行中の低優先度のポッドを回避 (削除) することもできます。
ポッドの優先度を設定することによって、低優先度のワークロードがクラスター内の重要なワークロードに影響を与えるのを防ぐことができます (特に、クラスターがそのリソース容量に達し始めている場合)。
クラスターへの適切なユーザー・アクセスがセットアップされていること、および該当する場合は、セキュリティー・コンテキスト制約 (SCC) があることを確認します。 アクセス・ポリシーおよび SCC により、信頼できないユーザーが他のポッドのスケジューリングを妨げる高優先度のポッドをデプロイすることを防止できます。
優先度に基づくスケジューリングとプリエンプションはどのように機能するのでしょうか?
一般に、高優先度の保留中のポッドは、優先度付けの低いポッドより前にスケジュールされます。 ワーカーノードに残っているリソースが不足している場合、 Red Hat OpenShift コントローラーは、優先度の高いポッドをスケジューリングするために十分なリソースを確保するため、ポッドをプリエンプト(削除)することがあります。 回避は、正常終了期間、ポッド中断予定数、およびワーカー・ノード・アフィニティーによっても影響を受けます。
ポッド・デプロイメントの優先度を指定しない場合、デフォルトでは、globalDefault として設定されている優先度クラスに設定されます。 globalDefault 優先度クラスがない場合、すべてのポッドのデフォルト優先度はゼロ (0) です。 デフォルトでは、Red Hat OpenShift on IBM Cloud は globalDefault を設定しないため、ポッドのデフォルト優先度はゼロになります。
ポッドの優先度と Red Hat OpenShift コントローラーがどのように機能するかを理解するために、以下の図のシナリオについて考えみましょう。 使用可能なリソースが存在するワーカー・ノードには、優先するポッドを配置する必要があります。 そうでない場合は、シナリオ 3 のように、既存のポッドが削除されたときにクラスターの優先度の高いポッドが保留状態で残ることがあります。
- 優先度が高、中、低の 3 つのポッドが、スケジュール保留中です。 Red Hat OpenShift コントローラーは、3 つのすべてのポッドのためのスペースがある使用可能なワーカー・ノードを見つけ、高優先度のポッドが先にスケジュールされるように優先度の順にポッドをスケジュールします。
- 優先度が高、中、低の 3 つのポッドが、スケジュール保留中です。 Red Hat OpenShift コントローラーは、使用可能なワーカー・ノードを見つけますが、ワーカー・ノードには優先度が高と中のポッドをサポートするのに十分なリソースしかありません。 低優先度のポッドはスケジュールされず、保留中のままとなります。
- 優先度が高と中の 2 つのポッドが、スケジュール保留中です。 低優先度の 3 番目のポッドが使用可能なワーク・ノード上に存在します。 ただし、ワーカー・ノードには、保留中のポッドをスケジュールするための十分なリソースがありません。 Red Hat OpenShift コントローラーは、低優先度のポッドを回避 (削除) して、このポッドを保留状態に戻します。 次に、Red Hat OpenShift コントローラーは、高優先度のポッドのスケジュールを試みます。 ただし、ワーカー・ノードには、高優先度のポッドをスケジュールするための十分なリソースがないため、Red Hat OpenShift コントローラーは中優先度のポッドをスケジュールします。
詳細については、 Kubernetes のドキュメントにある「 Podの優先度とプリエンプション 」の項目を参照してください。
- Pod優先アドミッションコントローラーを無効にすることはできますか?
- いいえ ポッドの優先度を使用しない場合は、
globalDefaultを設定したり、ポッドのデプロイメントに優先度クラスを含めたりしないでください。 IBM がデフォルトの優先度クラスを使用してデプロイするクラスターに不可欠なポッドを除き、すべてのポッドのデフォルトはゼロです。 ポッドの優先度は相対的なものであるため、この基本セットアップでは、クラスターに不可欠なポッドがリソースを優先的に使用できるようにされ、その他のポッドは設定されている既存のスケジューリング・ポリシーに従ってスケジュールされます。
デフォルトの優先度クラスについて
Red Hat® OpenShift® on IBM Cloud® クラスターには、デフォルトでいくつかの優先度クラスが用意されています。
デフォルトのクラスを変更しないでください。これらは、クラスターを正しく管理するために使用されています。 アプリ・デプロイメントでこれらのクラスを使用するか、または独自の優先度クラスを作成することができます。
以下の表では、デフォルトでクラスター内にある優先度クラス、およびそれらの使用目的について説明します。
| 名前 | 設定元 | 優先度の値 | 目的 |
|---|---|---|---|
system-node-critical |
Kubernetes | 2000001000 | クラスタ作成時に 特権システムネームスペースにデプロイされる ポッドを選択し、この優先度クラスを使用して、ネットワーク、ストレージ、ロギング、モニタリング、メトリクスなどのワーカーノードの重要な機能を保護します。 |
system-cluster-critical |
Kubernetes | 2000000000 | クラスタの作成時に 特権システムネームスペースにデプロイされる ポッドを選択し、この優先度クラスを使用して、ネットワーク、ストレージ、ロギング、監視、メトリクスなどのポッドなど、クラスタの重要な機能を保護します。 |
ibm-app-cluster-critical |
IBM | 900000000 | クラスタ作成時に 特権システムネームスペースにデプロイされる ポッドを選択し、この優先度クラスを使用して、ロードバランサーのポッドなど、アプリケーションの重要な機能を保護します。 |
以下のコマンドを実行することによって、優先度クラスを使用するポッドを確認できます。
oc get pods --all-namespaces -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName
優先度クラスの作成
ポッドの優先度を設定するには、優先度クラスを使用する必要があります。
始める前に
- Red Hat OpenShift クラスターにアクセスします。
defaultネームスペース用の「 作家 または、 マネージャー IBM Cloud IAM サービスのアクセスロール 」がインストールされていることを確認してください。
-
既存の優先度クラスをリストします。 既存の優先度クラスを、新しいクラスのテンプレートとして使用することができます。
oc get priorityclasses -
コピーする優先度クラスを選択し、ローカル YAML ファイルを作成します。
oc get priorityclass <priority_class> -o yaml > Downloads/priorityclass.yaml -
優先度クラス YAML ファイルを作成します。
apiVersion: scheduling.k8s.io/v1alpha1 kind: PriorityClass metadata: name: <priority_class_name> value: <1000000> globalDefault: <false> description: "Use this class for XYZ service pods only."YAML ファイルの構成要素について コンポーネント 説明 name必須: 作成する優先度クラスの名前。 value必須: 10 億 (1000000000) 以下の整数を入力します。 数字が大きければ大きいほど優先度が高くなります。 値は、クラスター内の他の優先度クラスの値に対する相対値です。 優先使用 (削除) したくないシステムに重要なポッドには、非常に大きな数値を予約してください。 例えば、デフォルトのクラスターに不可欠な優先度クラスは 900000000 から 2000001000 の範囲の値であるため、新しい優先度クラスにはこれらの数値より小さい値を入力して、これらのポッドより高い優先度が付けられないようにします。
globalDefaultオプション: この優先度クラスを、 true値を使用せずにスケジュールされたすべてのポッドに適用されるグローバル・デフォルトにするには、このフィールドをpriorityClassNameに設定します。 グローバル・デフォルトとして設定できるのは、クラスター内の 1 つの優先度クラスのみです。 グローバル・デフォルトがない場合、priorityClassNameが指定されていないポッドの優先度はゼロ (0) になります。デフォルトの優先度クラス は
globalDefaultを設定しません。 クラスター内に他の優先度クラスを作成した場合は、それらのクラスがglobalDefaultを設定していないことをoc describe priorityclass <name>を実行して確認します。descriptionオプション: ユーザーにその優先度クラスを使用する理由を通知します。 ストリングを引用符 ( "") で囲みます。 -
クラスター内に優先度クラスを作成します。
oc apply -f filepath/priorityclass.yaml -
優先度クラスが作成されたことを確認します。
oc get priorityclasses
うまくできました。 優先度クラスを作成しました。 優先度クラスについて、およびポッドのデプロイメントに使用する優先度クラス (使用する必要がある場合) をチームに知らせてください。
ポッドへの優先度の割り当て
優先度クラスをポッドの仕様に割り当てて、Red Hat OpenShift on IBM Cloud クラスター内のポッドの優先度を設定します。
始める前に
- Red Hat OpenShift クラスターにアクセスします。
- ポッドをデプロイする名前空間に対してライターまたは管理者の IBM Cloud IAM サービス・アクセス役割を持っていることを確認してください。
- 優先度によって既存のポッドが回避され、クラスターのリソースの消費方法に影響を与える可能性があるため、優先度スケジューリングの仕組みを理解します。
すでにデプロイされているポッドとの関連性を考慮して、自身のポッドに適切な優先度クラスを選択できるよう、以下の手順に従って、他のデプロイ済みポッドの重要度を確認してください。
-
名前空間内の他のポッドが使用する優先度クラスを表示します。
oc get pods -n <namespace> -o custom-columns=NAME:.metadata.name,PRIORITY:.spec.priorityClassName -
優先度クラスの詳細を取得し、value の数値をメモします。 数値がより大きいポッドには、数値が小さいポッドの前の優先度が付けられます。 確認する優先度クラスごとに、このステップを繰り返します。
oc describe priorityclass <priorityclass_name> -
使用する優先度クラスを取得するか、独自の優先度クラスを作成します。
oc get priorityclasses -
ポッドの仕様で、前のステップで取得した優先度クラスの名前を持つ
priorityClassNameフィールドを追加します。apiVersion: apps/v1 kind: Deployment metadata: name: ibmliberty spec: replicas: 1 selector: matchLabels: app: ibmliberty template: metadata: labels: app: ibmliberty spec: containers: - name: ibmliberty image: icr.io/ibm/liberty:latest ports: - containerPort: 9080 priorityClassName: <priorityclass_name> -
デプロイ先の名前空間で、優先度付けされたポッドを作成します。
oc apply -f filepath/pod-deployment.yaml