コンテナサービス Kubernetes版 (ACS)では、Podラベルを追加して、PodのコンピューティングクラスとコンピューティングQoSクラスを指定できます。異なるタイプのインスタンスの在庫は動的です。特定のタイプのインスタンスは、さまざまな理由で在庫切れになる可能性があります。カスタム優先度に基づいてリソースをスケジューリングするには、作成するPodに複数のコンピューティングクラスまたはコンピューティングQoSクラスを指定できます。スケジューラーは、指定されたタイプのPodを順に作成しようと試み、Pod削除コストメカニズムに基づいて逆の順序でPodをスケールインします。このトピックでは、ACSクラスターでカスタム優先度に基づいてリソースをスケジューリングする方法について説明します。
前提条件
kube-scheduler がインストールされており、そのバージョンが以下の要件を満たしていること。
ACSクラスターバージョン
スケジューラーバージョン
1.30
v1.30.3-aliyun-1.1.1 以降 (すべての現行バージョン)
1.28
v1.28.9-aliyun-1.1.0 以降
1.26
v1.26.3-aliyun-1.1.0 以降
acs-virtual-node がインストールされており、そのバージョンが v2.12.0-acs.4 以降であること。
使用方法に関する注意事項
カスタム優先度に基づくリソーススケジューリングは、汎用およびパフォーマンス強化コンピューティングクラスをサポートしています。詳細については、ACS Podの概要 を参照してください。
カスタム優先度に基づくリソーススケジューリングは、KubernetesのPod削除コスト機能を使用して、Podのスケールイン順序を制御します。理論的には、Pod削除コストが最も低いPodが最初にスケールインされます。ただし、スケールインアルゴリズムは、Podコントローラーの実装に依存するさまざまな要因を考慮します。Podに controller.kubernetes.io/pod-deletion-cost
アノテーションが設定されている場合、その値はカスタム優先度ベースのリソーススケジューリングポリシーによって上書きされます。詳細については、Pod削除コスト を参照してください。
手順
ACSクラスターは、仮想ノードを介してリソースを提供します。Podのリソースプロパティは、ゾーン、コンピューティングクラス、およびコンピューティングQoSクラスです。ACSでは、ResourcePolicyを作成できます。spec.selector
を指定してPodを選択し、複数のリソースプロパティを設定できます。リソースの在庫が不足している場合、スケジューラーは他のタイプのインスタンスを順に作成しようとします。ResourcePolicyを使用するには、次の手順を実行します。
ResourcePolicyを作成します。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: rp-demo namespace: default spec: selector: # セレクターを設定してPodを選択します。スケジューリングポリシーは、app=stressラベルが付いたPodに適用されます。 app: stress units: # スケジューリング順序を指定します。 - resource: acs # ベストエフォートリソースを優先的に適用します。 podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: best-effort - resource: acs # 前のリソースの在庫が不足している場合は、デフォルトリソースを適用します。 podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default
Jobなどのワークロードを作成し、
labels
のResourcePolicyに関連付けます。apiVersion: batch/v1 kind: Job metadata: name: demo-job namespace: default spec: parallelism: 3 template: metadata: labels: app: stress # ResourcePolicyのspec.selectorに関連付けます。 spec: containers: - name: demo-job image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4 args: - 'infinity' command: - sleep resources: requests: cpu: "1" memory: "1Gi" limits: cpu: "1" memory: "1Gi" restartPolicy: Never backoffLimit: 4
詳細設定
次のYAMLコンテンツは、ResourcePolicyのカスタム優先度ベースのスケジューリングのいくつかの詳細設定を示しています。
apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
name: rp-demo
namespace: default
spec:
# 次のPod設定は、選択したPodにスケジューリングポリシーを適用するために使用されます。
selector:
app: stress
# 上記はPod設定です。
# 次のリソース設定は、スケジューリング順序を定義するために使用されます。
units:
- resource: acs # リソースタイプをacsに設定します。
podLabels: # "general-purpose"+"best-effort"リソースを優先的に適用します。
alibabacloud.com/compute-class: general-purpose
alibabacloud.com/compute-qos: best-effort
nodeSelector: # nodeSelectorを設定して、仮想ノードのゾーンを指定します。
topology.kubernetes.io/zone: cn-hangzhou-i
- resource: acs # 前のリソースの在庫が不足している場合は、"general-purpose"+"default"リソースを適用します。
podLabels:
alibabacloud.com/compute-class: general-purpose
alibabacloud.com/compute-qos: default
# 上記はリソース設定です。
# その他のパラメーターは非ACSクラスターに適しており、これらのパラメーターはすべてデフォルト値を持っています。無視しても構いません。
Pod設定
Pod設定にはラベルが含まれています。スケジューリングポリシーは、指定されたラベルを持つPodにのみ適用されます。必要に応じてリソースの順序を指定できます。
パラメーター | タイプ | 説明 | 例 |
selector | map[string]string | 指定されたラベルを持つPodは、ResourcePolicyに基づいてスケジューリングされます。 |
|
リソース設定
リソース設定はリストです。リストの各要素はリソースプロパティを表します。スケジューラーは、各要素で定義されたリソースプロパティに基づいて、ResourcePolicy に一致するPodを作成しようとします。現在のタイプのリソースの在庫が不足している場合、スケジューラーは次のリソースプロパティを試行しようとします。指定されたすべてのリソースタイプの在庫が不足している場合、PodはPending状態のままになります。スケジューラーは、Podが作成されるまで、すべてのリソースタイプを継続的に再試行します。次の表は、各要素に含まれるパラメーターについて説明しています。
パラメーター | タイプ | 説明 | 有効な値 | 例 |
resource | string | リソースタイプ。必須。値をacsに設定します。 | acs |
|
nodeSelector | map[string]string | 仮想ノードをフィルタリングするために使用されるラベル。たとえば、ゾーンの範囲。 | サポートされているラベルの詳細については、ノードアフィニティベースのスケジューリング を参照してください。 |
|
podLabels[alibabacloud.com/compute-class] | string | Podのコンピューティングクラス。 |
|
|
podLabels[alibabacloud.com/compute-qos] | string | PodのコンピューティングQoSクラス。 |
|
|
例
この例では、デフォルトおよびベストエフォートコンピューティングQoSクラスのPodを順番に作成するResourcePolicyを作成する方法を示します。
次の内容に基づいて、resource-policy.yamlという名前のファイルを作成します。
app=stress
ラベルが付いたPodに対して、コンピューティングクラスがperformance、コンピューティングQoSクラスがdefaultのリソースを適用します。apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: stress-demo namespace: default spec: selector: app: stress units: - resource: acs podLabels: alibabacloud.com/compute-class: performance alibabacloud.com/compute-qos: default
次のコマンドを実行して、クラスターにResourcePolicyをデプロイします。
kubectl apply -f resource-policy.yaml
次の内容に基づいて、stress-dep.yamlという名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: stress spec: replicas: 1 selector: matchLabels: app: stress template: metadata: labels: # ラベルをResourcePolicyと同じに保ちます。 app: stress spec: containers: - name: stress image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" resources: limits: cpu: '1' memory: 1Gi requests: cpu: '1' memory: 1Gi
次のコマンドを実行して、クラスターにstressアプリケーションをデプロイします。
kubectl apply -f stress-dep.yaml
次のコマンドを実行して、Podのステータスをクエリします。
kubectl get pod -L alibabacloud.com/compute-class,alibabacloud.com/compute-qos
予期される結果:
# 実際の出力は異なる場合があります。 NAME READY STATUS RESTARTS AGE COMPUTE-CLASS COMPUTE-QOS stress-xxxxxxxx1 1/1 Running 0 53s performance default
次の内容に基づいて、resource-policy.yamlファイルを更新します。リソースプロパティを追加して、次の順序でリソースを適用します。
コンピューティングクラスがgeneral-purpose、コンピューティングQoSクラスがbest-effortのリソースを優先的に適用します。
前述のリソースの在庫が不足している場合は、コンピューティングクラスがperformance、コンピューティングQoSクラスがdefaultのリソースを適用します。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: stress-demo namespace: default spec: selector: app: stress units: - resource: acs podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: best-effort - resource: acs podLabels: alibabacloud.com/compute-class: performance alibabacloud.com/compute-qos: default
次のコマンドを実行して、ResourcePolicyを更新します。更新されたResourcePolicyは、新しく作成されたPodに有効になります。
kubectl apply -f resource-policy.yaml
次のコマンドを実行して、stressアプリケーションを2つのPodにスケールします。
kubectl scale deployment stress --replicas=2
次のコマンドを実行して、Podのステータスをクエリします。
kubectl get pod -L alibabacloud.com/compute-class,alibabacloud.com/compute-qos
予期される結果:
# 実際の出力は異なる場合があります。 NAME READY STATUS RESTARTS AGE COMPUTE-CLASS COMPUTE-QOS stress-xxxxxxxx1 1/1 Running 0 2m14s performance default stress-xxxxxxxx2 1/1 Running 0 33s general-purpose best-effort
新しく追加されたPodのコンピューティングクラスとコンピューティングQoSクラスは、general-purposeとbest-effortです。