Kubernetesのpod優先度とプリエンプト

3151 ワード

優先度が不公平を招き、占領は強盗行為であり、被害者は不思議だ.この特性は、システムの複雑さを増大させ、追加の不安定性要因をもたらす.リソースが不足している場合は、まず拡張し、ハードウェアが安いため、優先度プロパティを無効にする必要があります.
Pod優先度はpodの相対的重要度を示す.1.9以前のバージョンでは、podがリソースの問題でスケジュールできなかった場合、kubernetesは低優先度podリソースをプリエンプトし、それらを排除し、高優先度podに実行条件を提供することを試みた.
1.9以降のバージョンでは、pod優先度はpodのスケジューリング順序およびノードリソースが不足している場合の反発順序に影響します.すなわち、スケジューリング時に高優先度podを優先的に配置し、ノードリソースが不足している場合に低優先度podを先行的に排除する.
1.11以前のバージョンではpod優先度はalphaプロパティであり、1.11バージョンではbetaプロパティとなり、後続のバージョンでサポートを継続することを保証します.Alphaバージョンではデフォルトでは禁止されています.明確に開く必要があります.betaバージョンではデフォルトで開きます.関係は次の表にあります.
Kubernetes Version
Priority and Preemption State
Enabled by default
1.8
alpha
no
1.9
alpha
no
1.10
alpha
no
1.11
beta
yes
警告:クラスタ内の悪意のあるユーザーは、可能な限り高い優先度podを作成し、通常のpodが排斥されたり、スケジュールされなかったりする可能性があります.システム管理者は、リソース割当額とpod優先度を組み合わせて、ユーザーが高優先度podを作成したり、用途に対して作成した高優先度podが使用できるリソースの数を制限したりして、クラスタリソースの占有を阻止することができます.この機能は現在1.11のalphaです.
優先順位とプリエンプトの使用方法
1.11以降のバージョンでは、手順は大体次の通りです.
  • PriorityClassesを作成します.
  • podにpriorityClassNameフィールドを追加し、その値にはステップ1で作成するPriorityClassesが含まれる.

  • 各ステップの詳細は以下に示す.
    このプロパティをテストして無効にする場合は、PodPriorityコマンドラインフラグを削除するか、faluseに設定してapiServerとschedulerを再起動する必要があります.プロパティが無効になっても、古いpodは優先度関連フィールドに保持されますが、無視され、プリエンプトは禁止されます.新規作成podはpriorityClassNameフィールドを使用できません.
    プリエンプトを無効にする方法
    ヒント:Kubernetes 1.11では、重要なpodはクラスタリソースが緊張している場合でもプリエンプトメカニズムで導入できるため、この特性を無効にすることは推奨されません.まだ無効にする場合は、以下の手順で完了します.
    kubernetes 1.11以降のバージョンでは、kube-schedulerのdisablePreemptionフラグをtrueに設定すると、この機能は無効になり、優先度機能は保持されます.優先度機能を無効にすると、プリエンプト機能も無効になります.構成例は次のとおりです.
    apiVersion: componentconfig/v1alpha1
    kind: KubeSchedulerConfiguration
    algorithmSource:
      provider: DefaultProvider
    
    ...
    
    disablePreemption: true

     PriorityClass
    PriorityClassは、クラスタ管理者によって作成されるネーミングスペースではありません.サンプルコード:
    apiVersion: scheduling.k8s.io/v1alpha1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000
    globalDefault: false
    description: "This priority class should be used for XYZ service pods only."
  • .metadata.name:名前
  • .value:1億未満の32 bit整数で、数値が大きいほど優先度が高くなり、1億を超える数値がシステムに保持され、システムコンポーネントに割り当てられます.
  • .globalDefault:グローバルpod
  • に適用されるかどうかを示します.
  • .description:記述情報
  • Pod priority
    podを構成するときにpriorityClassNameフィールドを使用可能なPriorityClass名に設定すると、podの作成時に許可コントローラによって名前が対応する数値に変換されます.例は次のとおりです.
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      priorityClassName: high-priority

    1.9以降のバージョンでは、kube-schedulerはスケジューリングキューを計算する際に優先順位でキューに並び、高優先順位で先にスケジューリングし、スケジューリングが完了しなければ後の低優先順位スケジューリングを阻害しない.
    プリエンプト
    高優先度podがpending状態で正常にスケジューリングできない場合、プリエンプトがトリガーされます.スケジューラは、比較的優先度の低いpodがあり、低優先度podを削除すると高優先度podにリソースを提供することができ、このとき低優先度podが削除され、高優先度podがスケジューリングされるノードを探そうとする.
    User exposed information
    podにプリエンプトが発生した場合、そのpodのstatusのnominatedNodeNameにノード名を記録し、ユーザーがプリエンプトの発生を認識できるようにします.
    参照先:https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/