ポッドスケジューリングにおける弾力性の要件を満たすために、Alibaba Cloud は優先順位ベースのリソーススケジューリングを提供しています。アプリケーションのリリースまたはスケーリング中に、カスタムリソースポリシーを設定して、アプリケーションポッドを Alibaba Cloud Container Compute Service (ACS) にスケジューリングできます。これにより、Elastic Compute Service (ECS) インスタンスと ACS ポッドをコロケーション方式でデプロイできます。
kube-scheduler v1.x.x-aliyun-6.4 以降では、ResourcePolicy の ignorePreviousPod パラメーターはデフォルトで False に設定され、ignoreTerminatingPod パラメーターはデフォルトで True に設定されます。前述のパラメーターを使用する既存の ResourcePolicy は、この変更または今後の更新の影響を受けません。
制限事項
スケールインシナリオでこの機能を pod-deletion-cost とともに使用する場合、逆順でのスケールインを実行することはできません。
maxパラメーターは、クラスターで Kubernetes 1.26 以降が実行されており、クラスターにインストールされているスケジューラのバージョンが 6.7 以降の場合にのみ使用できます。この機能をエラスティックノードプールとともに使用すると、無効なノードがエラスティックノードプールに追加される可能性があります。エラスティックノードプールがユニットに含まれていることを確認してください。ユニットに
maxパラメーターを指定しないでください。
使用方法
Container Service for Kubernetes (ACK) Pro マネージドクラスターの優先順位ベースのスケジューリング機能の詳細については、「優先順位ベースのリソーススケジューリングを設定する」をご参照ください。
前提条件
Kubernetes 1.26 以降を実行する ACK Pro マネージドクラスターが作成されていること。ACK クラスタの Kubernetes バージョンの更新方法については、「ACK クラスタの Kubernetes バージョンを更新する」をご参照ください。
クラスターの Kubernetes バージョンに基づいて、特定のバージョンのスケジューラが必要です。次の表は、各 Kubernetes バージョンに必要なスケジューラバージョンと仮想ノードバージョンを示しています。
Kubernetes バージョン
スケジューラバージョン
仮想ノードバージョン
≥ V1.26
≥ V1.26.3-aliyun-6.7.0
≥ V2.13.0
さまざまなスケジューラバージョンの機能の詳細については、「kube-scheduler」をご参照ください。
ACK Pro マネージドクラスターの ACS の計算能力を有効にする方法については、「ACK Pro マネージドクラスターで ACS の計算能力を使用する」をご参照ください。
ECS インスタンスと ACS 計算能力のコロケーションスケジューリング
サブスクリプション ECS インスタンス、従量課金 ECS インスタンス、ACS ポッドなど、複数のタイプのリソースにデプロイメントのポッドをスケジューリングするとします。リソースコストを削減するために、サブスクリプション ECS インスタンス > 従量課金 ECS インスタンス > ACS ポッドという優先順位に基づいて、ポッドをリソースにスケジューリングします。スケールインアクティビティでは、ACS ポッド、従量課金 ECS インスタンス、サブスクリプション ECS インスタンスの順序で、これらのリソースからポッドを削除します。この例では、各ノードに 2 vCPU と 4 GB のメモリがあります。ECS インスタンスと ACS 計算能力のコロケーションスケジューリングを設定するには、次の手順を実行します。
次のコマンドを実行して、異なる課金方法を示す
ラベルをノードに追加します。ノードプールを使用して、ラベルをノードに自動的に追加することもできます。kubectl label node cn-beijing.10.0.3.137 paidtype=subscription kubectl label node cn-beijing.10.0.3.138 paidtype=subscription kubectl label node cn-beijing.10.0.6.46 paidtype=pay-as-you-go kubectl label node cn-beijing.10.0.6.47 paidtype=pay-as-you-goノード
ラベルの説明paidtype=subscription: サブスクリプション
paidtype=pay-as-you-go: 従量課金
次の内容に基づいて ResourcePolicy を作成します。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: nginx namespace: default spec: selector: app: nginx # ResourcePolicy を適用するポッドのラベルを指定する必要があります。 strategy: prefer units: - resource: ecs nodeSelector: paidtype: subscription - resource: ecs nodeSelector: paidtype: pay-as-you-go - resource: acs次のテンプレートを使用して、2 つのポッドをプロビジョニングするデプロイメントを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: name: nginx labels: app: nginx # ポッドラベルは、ResourcePolicy のセレクターに指定したものと同じである必要があります。 alibabacloud.com/compute-class: general-purpose # ACS 計算能力の計算クラス。デフォルト値: general-purpose。 alibabacloud.com/compute-qos: default # ACS ポッドのサービス品質 (QoS) クラス。デフォルト値: default。 spec: containers: - name: nginx image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 resources: limits: cpu: 2 requests: cpu: 2NGINX アプリケーションをデプロイし、ポッドをクエリします。
次のコマンドを実行して、NGINX アプリケーションをデプロイします。
kubectl apply -f nginx.yaml予期される出力:
deployment.apps/nginx created次のコマンドを実行して、ポッドをクエリします。
kubectl get pods -o wide予期される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-9cdf7bbf9-b**** 1/1 Running 0 66s 172.29.112.215 cn-beijing.10.0.3.137 <none> <none> nginx-9cdf7bbf9-r**** 1/1 Running 0 66s 172.29.113.23 cn-beijing.10.0.3.138 <none> <none>出力は、2 つのポッドが
paidtype=subscriptionラベルを持つノードにスケジューリングされていることを示しています。この例では、cn-beijing.10.0.3.137 と cn-beijing.10.0.3.138 が使用されています。
NGINX アプリケーションのポッドをスケールアウトします。
次のコマンドを実行して、ポッドの数を 4 つに増やします。
kubectl scale deployment nginx --replicas 4予期される出力:
deployment.apps/nginx scaled次のコマンドを実行して、ポッドのステータスをクエリします。
kubectl get pods -o wide予期される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-9cdf7bbf9-4**** 1/1 Running 0 16s 172.29.113.155 cn-beijing.10.0.6.47 <none> <none> nginx-9cdf7bbf9-b**** 1/1 Running 0 3m48s 172.29.112.215 cn-beijing.10.0.3.137 <none> <none> nginx-9cdf7bbf9-f**** 1/1 Running 0 16s 172.29.113.88 cn-beijing.10.0.6.46 <none> <none> nginx-9cdf7bbf9-r**** 1/1 Running 0 3m48s 172.29.113.23 cn-beijing.10.0.3.138 <none> <none>paidtype=subscriptionラベルを持つノードではリソースが不足しているため、新しいポッドはpaidtype=pay-as-you-goラベルを持つノードにスケジューリングされています。この例では、cn-beijing.10.0.6.46 と cn-beijing.10.0.6.47 が使用されています。次のコマンドを実行して、ポッドの数を 6 つに増やします。
kubectl scale deployment nginx --replicas 6予期される出力:
deployment.apps/nginx scaled次のコマンドを実行して、ポッドのステータスをクエリします。
kubectl get pods -o wide予期される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-9cdf7bbf9-4**** 1/1 Running 0 3m10s 172.29.113.155 cn-beijing.10.0.6.47 <none> <none> nginx-9cdf7bbf9-b**** 1/1 Running 0 6m42s 172.29.112.215 cn-beijing.10.0.3.137 <none> <none> nginx-9cdf7bbf9-f**** 1/1 Running 0 3m10s 172.29.113.88 cn-beijing.10.0.6.46 <none> <none> nginx-9cdf7bbf9-r**** 1/1 Running 0 6m42s 172.29.113.23 cn-beijing.10.0.3.138 <none> <none> nginx-9cdf7bbf9-s**** 1/1 Running 0 36s 10.0.6.68 virtual-kubelet-cn-beijing-j <none> <none> nginx-9cdf7bbf9-v**** 1/1 Running 0 36s 10.0.6.67 virtual-kubelet-cn-beijing-j <none> <none>出力は、ECS インスタンスのリソースが不足していることを示しています。ポッドは ACS にスケジューリングされています。この例では、virtual-kubelet-cn-beijing-j が使用されています。
NGINX アプリケーションのポッドをスケールインします。
次のコマンドを実行して、ポッドの数を 4 つに減らします。
kubectl scale deployment nginx --replicas 4予期される出力:
deployment.apps/nginx scaled次のコマンドを実行して、ポッドのステータスをクエリします。
kubectl get pods -o wide予期される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-9cdf7bbf9-4**** 1/1 Running 0 4m59s 172.29.113.155 cn-beijing.10.0.6.47 <none> <none> nginx-9cdf7bbf9-b**** 1/1 Running 0 8m31s 172.29.112.215 cn-beijing.10.0.3.137 <none> <none> nginx-9cdf7bbf9-f**** 1/1 Running 0 4m59s 172.29.113.88 cn-beijing.10.0.6.46 <none> <none> nginx-9cdf7bbf9-r**** 1/1 Running 0 8m31s 172.29.113.23 cn-beijing.10.0.3.138 <none> <none> nginx-9cdf7bbf9-s**** 1/1 Terminating 0 2m25s 10.0.6.68 virtual-kubelet-cn-beijing-j <none> <none> nginx-9cdf7bbf9-v**** 1/1 Terminating 0 2m25s 10.0.6.67 virtual-kubelet-cn-beijing-j <none> <none>出力は、ACS 上で実行されているポッドが削除されていることを示しています。
次のコマンドを実行して、ポッドの数を 2 つに減らします。
kubectl scale deployment nginx --replicas 2予期される出力:
deployment.apps/nginx scaled次のコマンドを実行して、ポッドのステータスをクエリします。
kubectl get pods -o wide予期される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-9cdf7bbf9-4**** 0/1 Terminating 0 6m43s 172.29.113.155 cn-beijing.10.0.6.47 <none> <none> nginx-9cdf7bbf9-b**** 1/1 Running 0 10m 172.29.112.215 cn-beijing.10.0.3.137 <none> <none> nginx-9cdf7bbf9-f**** 0/1 Terminating 0 6m43s 172.29.113.88 cn-beijing.10.0.6.46 <none> <none> nginx-9cdf7bbf9-r**** 1/1 Running 0 10m 172.29.113.23 cn-beijing.10.0.3.138 <none> <none>paidtype=pay-as-you-goラベルを持つノード上のポッドが削除されていることが出力に示されています。数分待ってから、次のコマンドを再度実行してポッドの状態をクエリします。
kubectl get pods -o wide予期される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-9cdf7bbf9-b**** 1/1 Running 0 11m 172.29.112.215 cn-beijing.10.0.3.137 <none> <none> nginx-9cdf7bbf9-r**** 1/1 Running 0 11m 172.29.113.23 cn-beijing.10.0.3.138 <none> <none>出力は、
paidtype=subscriptionラベルが付いたノード上でのみポッドが実行されていることを示しています。
関連情報
ACK クラスタをデプロイするときに、許容とノードアフィニティを設定して、スケジューラが ECS インスタンスまたは ACS の計算能力のみを使用できるようにするか、ECS インスタンスが不足している場合にスケジューラが ACS 計算リソースを自動的に適用できるようにすることができます。さまざまなスケジューリングポリシーを設定して、さまざまなシナリオでリソースをスケーリングできます。詳細については、「ACK Pro マネージドクラスターで ACS の計算能力を使用する」をご参照ください。
高可用性と高パフォーマンスは、分散ジョブにとって不可欠です。 ACK Pro マネージドクラスターでは、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、高可用性のためにゾーン全体に分散ジョブを分散できます。また、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、高パフォーマンスのためにアフィニティ設定に基づいて特定のゾーンに分散ジョブをデプロイすることもできます。詳細については、「ノードアフィニティスケジューリング」をご参照ください。