ハイブリッドクラウドシナリオでは、多階層エラスティックスケジューリングにより、オンプレミス環境とクラウド環境にまたがってデプロイされたビジネスが、ハイブリッドクラウドの利点をより活用できるようになります。これにより、ビジネスの高可用性を実現し、ピーク時とオフピーク時に基づいたエラスティックなリソースリクエストが可能になります。このトピックでは、ack-co-scheduler を使用して多階層エラスティックスケジューリングを実装する方法について説明します。
前提条件
登録済みクラスターが作成され、外部 Kubernetes クラスターが登録済みクラスターに接続されていること。詳細については、「ACK コンソールで登録済みクラスターを作成する」をご参照ください。
次の表に、必要なシステムコンポーネントのバージョンを示します。
コンポーネント
バージョン要件
Kubernetes
1.18.8 以降
Helm
3.0 以降
Docker
19.03.5
オペレーティングシステム
CentOS 7.6、CentOS 7.7、Ubuntu 16.04、Ubuntu 18.04、および Alibaba Cloud Linux
背景情報
ハイブリッドクラウドシナリオにおける多階層エラスティックスケジューリングは、IDC エラスティックリソースタイプを追加した、カスタムエラスティックリソース優先度スケジューリングの拡張機能です。カスタムエラスティックリソース優先度スケジューリングは、Alibaba Cloud が提供するエラスティックスケジューリングポリシーです。アプリケーションのデプロイメントまたはスケーリング中に、リソースポリシー (ResourcePolicy) をカスタマイズして、アプリケーションインスタンスの Pod が異なるタイプのノードリソースにスケジュールされる順序を設定できます。スケールイン中、Pod は元のスケジューリングシーケンスの逆の順序で削除されます。詳細については、「カスタムエラスティックリソース優先度スケジューリング」をご参照ください。
制限事項
この機能は pod-deletion-cost と競合するため、同時に使用することはできません。pod-deletion-cost の詳細については、「pod-deletion-cost」をご参照ください。
現在、この機能は ECI エラスティックスケジューリングとの混合使用をサポートしていません。ECI エラスティックスケジューリングの詳細については、「ElasticResource を使用した ECI エラスティックスケジューリングの実装 (メンテナンス終了)」をご参照ください。
ResourcePolicy を変更すると、すでにスケジュールされている Pod は元の ResourcePolicy の順序に基づいてスケールインされ、新しく作成された Pod は更新された ResourcePolicy の順序に基づいてスケールインされます。
エラスティックノードプールと併用すると、この機能によりエラスティックノードプールからのノードのエビクションが効果的に行われなくなる可能性があります。この機能を使用する場合は、エラスティックノードプールを Unit に含め、エラスティックノードプールを含む Unit の max フィールドを設定しないでください。
関連付けられた Pod が完全に削除されていない場合は、ResourcePolicy を変更しないでください。
使用方法
以下の内容を使用して、エラスティックリソースの優先度を定義する ResourcePolicy を作成します。
apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
name: xxx
namespace: xxx
spec:
selector:
key1: value1
strategy: prefer
units:
- resource: idc
max: 3
- resource: ecs
nodeSelector:
key2: value2
- resource: ecs
nodeSelector:
key3: value3
- resource: eciselector: ResourcePolicy が、同じ名前空間内でlabelkey1=value1を持つ Pod に適用されることを指定します。strategy: スケジューリング戦略の選択。現在、preferのみがサポートされています。units: ユーザー定義のスケジューリングユニット。スケールアウト中、リソースはunitsで指定された順序で追加されます。スケールイン中、リソースは逆の順序で削除されます。resource: エラスティックリソースのタイプ。現在、eci、ecs、およびidcがサポートされています。nodeSelector:nodelabelsを使用して、スケジューリングユニット内のノードを識別します。これはecsリソースにのみ適用されます。max: このリソースグループにデプロイできるインスタンスの最大数。
関連コンポーネントのインストール
多階層エラスティックスケジューリングを使用するには、次のコンポーネントをインストールする必要があります。
ack-virtual-node: オプションコンポーネント。エラスティック ECI 機能を使用する場合にのみ、登録済みクラスターに ack-virtual-node コンポーネントをインストールする必要があります。
ack-co-scheduler: このコンポーネントを使用すると、カスタム ResourcePolicy CR オブジェクトを定義し、多階層エラスティックスケジューリング機能を使用できます。
onectl でインストール
オンプレミスのマシンに onectl をインストールします。詳細については、「onectl を使用して登録済みクラスターを管理する」をご参照ください。
次のコマンドを実行して、ack-virtual-node および ack-co-scheduler コンポーネントをインストールします。
onectl addon install ack-virtual-node onectl addon install ack-co-scheduler期待される出力:
Addon ack-virtual-node, version **** installed. Addon ack-co-scheduler, version **** installed.
コンソール経由でインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスターの名前をクリックします。左側のナビゲーションウィンドウで、[コンポーネント] をクリックします。
[コンポーネント] ページで、検索ボックスで ack-virtual-node および ack-co-scheduler コンポーネントを検索し、各コンポーネントカードの右下隅にある [インストール] をクリックします。
表示されるダイアログボックスで、[OK] をクリックします。
シナリオ 1: 多階層優先度スケジューリング
次の YAML 内容を使用して、ノードプールのスケジューリング順序をカスタマイズする ResourcePolicy を作成します。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: cost-balance-policy spec: selector: app: nginx strategy: prefer units: - resource: idc - resource: ecs nodeSelector: alibabacloud.com/nodepool-id=np7b30bxxxxxxa3940936c19ea42b # 実際のノード ID に置き換えてください - resource: eci次の YAML 内容を使用して、2 つの Pod をデプロイする Deployment を作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: name: nginx annotations: addannotion: "true" labels: app: nginx # これは、前のステップで作成した ResourcePolicy のセレクターと一致する必要があります。 spec: schedulerName: ack-co-scheduler containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 resources: requests: cpu: 200m limits: cpu: 1次のコマンドを実行して Nginx アプリケーションを作成します。
kubectl apply -f nginx.yaml次のコマンドを実行して Pod をスケールアウトします。
kubectl scale deployment nginx --replicas 10期待される出力:
deployment.apps/nginx scaled次のコマンドを実行して Pod のステータスを確認します。
kubectl get pod -o wide期待される出力:
Nginx アプリケーションのレプリカ数を制御し、スケジューリング結果を確認すると、デプロイメント戦略が期待どおりであることがわかります。リソーススケジューリングの順序は、IDC リソース、次に ECS リソース、最後に ECI リソースの順に優先されます。
シナリオ 2: オンプレミス環境とクラウド環境にまたがるハイブリッドデプロイメント
次の YAML 内容を使用して、ノードプールのスケジューリング順序をカスタマイズする ResourcePolicy を作成します。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: load-balance-policy spec: selector: app: nginx strategy: prefer units: - resource: idc max: 2 - resource: ecs nodeSelector: alibabacloud.com/nodepool-id=np7b30b52e99194275a3940936c19ea42b max: 4 - resource: eci次の YAML 内容を使用して、2 つの Pod をデプロイする Deployment を作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: name: nginx annotations: addannotion: "true" labels: app: nginx # これは、前のステップで作成した ResourcePolicy のセレクターと一致する必要があります。 spec: schedulerName: ack-co-scheduler containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 resources: requests: cpu: 200m limits: cpu: 1次のコマンドを実行して Nginx アプリケーションを作成します。
kubectl apply -f nginx.yaml次のコマンドを実行して Pod をスケールアウトします。
kubectl scale deployment nginx --replicas 10期待される出力:
deployment.apps/nginx scaled次のコマンドを実行して Pod のステータスを確認します。
kubectl get pod -o wide期待される出力:
Nginx アプリケーションのレプリカ数を制御し、スケジューリング結果を確認すると、デプロイメント戦略が期待どおりであることがわかります。リソースが十分な場合、2 つの Pod は IDC に、4 つの Pod は ECS に、残りのレプリカは ECI に配置されます。