Alibaba Cloud Container Compute Service (ACS) は、Pod ラベルでコンピュートクラス (compute-class) とコンピュート Quality of Service (QoS) を宣言することをサポートしています。異なるインスタンスタイプの在庫は動的に変化します。特定のタイプのインスタンスは、リソース在庫の不足などの要因により作成に失敗する場合があります。カスタム優先度スケジューリングを使用すると、Pod に複数のコンピュートクラスまたはコンピュート QoS クラスを指定できます。スケジューラは、指定された順序で対応する Pod インスタンスの作成を試みます。この機能は、Pod 削除コストメカニズムを使用して、アプリケーションの逆順スケールインも制御します。このトピックでは、ACS クラスターでカスタム優先度スケジューリングを使用する方法について説明します。
前提条件
kube-scheduler がインストールされており、そのバージョンが以下の要件を満たしていること。
ACK クラスタバージョン
スケジューラコンポーネントのバージョン
1.31
v1.31.0-aliyun-1.2.0 以降
1.30
v1.30.3-aliyun-1.1.1 以降
1.28
v1.28.9-aliyun-1.1.0 以降
acs-virtual-node がインストールされており、そのバージョンが v2.12.0-acs.4 以降であること。
注意
カスタム優先度に基づくリソーススケジューリングをサポートするコンピュートクラスの詳細については、「コンピュートクラス」をご参照ください。
カスタム優先度に基づく ACS リソーススケジューリングは、Kubernetes の Pod 削除コスト機能を使用して、Pod のスケールイン順序を制御します。理論的には、Pod 削除コストが最も低い Pod が最初にスケールインされます。ただし、スケールインアルゴリズムは、Pod コントローラーの実装に依存するさまざまな要因を考慮します。作成した Pod に
controller.kubernetes.io/pod-deletion-costアノテーションがある場合、その値は ACS カスタム優先度リソーススケジューリングポリシーによって上書きされることに注意してください。
デプロイメントの spec.selector.matchLabels などのワークロードのラベルセレクターで、alibabacloud.com/compute-class や alibabacloud.com/compute-qos などのシステム予約ラベルを使用しないでください。システムは、カスタム優先度スケジューリング中にこれらのラベルを変更する可能性があります。これにより、コントローラーが 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 # まず、best-effort タイプのリソースをリクエストします。 podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: best-effort - resource: acs # 前者が在庫切れの場合は、default タイプのリソースをリクエストします。 podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: defaultJob などの任意のタイプのワークロードを作成します。
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
詳細設定パラメーター
次の ResourcePolicy の詳細な YAML 例は、カスタム優先度スケジューリングの詳細設定パラメーターのフォーマットを示しています。
このトピックでは、ACS クラスターで ResourcePolicy を使用するための一般的な構成のみを説明します。ResourcePolicy 機能のすべての構成の詳細については、「カスタムエラスティックリソース優先度スケジューリング」をご参照ください。
apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
name: rp-demo
namespace: default
spec:
# 以下はアプリケーション構成です。Pod のグループをマークするために使用されます。条件を満たす Pod は、このスケジューリングポリシーに従います。
selector:
app: stress
# アプリケーション構成の終わり。
# 以下はリソース構成です。スケジューリング順序を記述するために使用されます。
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 以外のクラスターに適用されます。ResourcePolicy には作成後にデフォルト値が設定されるため、無視できます。アプリケーション構成
アプリケーション構成はラベルのセットで構成されます。これらのラベルを持つ Pod のみがこのポリシーに従います。アプリケーションタイプに基づいて、異なるリソース順序を構成できます。
構成項目 | タイプ | 説明 | 例 |
selector | map[string]string | これらのラベルをすべて持つ Pod は、この 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 を記述します。 |
|
|
例
この例では、ResourcePolicy を使用して、アプリケーションに対して default および best-effort のコンピュート QoS を持つリソースを順次リクエストする方法を示します。
次の内容で 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 を更新します。更新されたポリシーは、後続に作成される Pod に適用されます。
kubectl apply -f resource-policy.yaml次のコマンドを実行して、手順 3 で作成した stress アプリケーションを 2 つのレプリカにスケールアウトします。
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新しいレプリカには、コンピュートクラス `general-purpose` とコンピュート QoS `best-effort` があることがわかります。