ネイティブの Kubernetes スケジューラと比較して、Container Service for Kubernetes (ACK) スケジューラは、Gang スケジューリング、CPU トポロジー認識スケジューリング、ECI エラスティックスケジューリングなどの追加機能を提供します。本トピックでは、登録済みクラスターに ack-co-scheduler コンポーネントをインストールする方法について説明します。これにより、お客様が独自に管理する Kubernetes クラスターで ACK のスケジューリング機能を利用できるようになります。この機能を活用することで、ビッグデータや AI など、さまざまなアプリケーションのパフォーマンス向上を容易に実現できます。
前提条件
-
登録済みクラスターを作成し、お客様が独自に管理する Kubernetes クラスターをそのクラスターに接続します。詳細については、「ACK One 登録済みクラスターの作成」をご参照ください。
-
システムコンポーネントは、以下の表に示すバージョン要件を満たしている必要があります。
コンポーネント
バージョン要件
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
注意事項
ジョブをデプロイする際には、.template.spec.schedulerName を ack-co-scheduler に設定して、スケジューラ名を `ack-co-scheduler` として指定する必要があります。
ack-co-scheduler コンポーネントのインストール
onectl を使用したインストール
オンプレミス環境のマシンに onectl をインストールします。詳細については、「onectl を使用した登録済みクラスターの管理」をご参照ください。
-
以下のコマンドを実行して、ack-co-scheduler コンポーネントをインストールします。
onectl addon install ack-co-scheduler期待される出力例:
Addon ack-co-scheduler, version **** installed.
コンソールを使用したインストール
-
Container Service Management Console にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、アドオン管理 をクリックします。
-
アドオン管理 ページで、その他 タブをクリックします。ack-co-scheduler コンポーネントを見つけ、カードの右下にある インストール をクリックします。
-
確認ダイアログボックスで、OK をクリックします。
Gang スケジューリング
ACK では、新しい Kube-scheduler フレームワークに基づいて Gang スケジューリングを実装しており、ネイティブのスケジューラがサポートできない「すべてまたは何もなし(all-or-nothing)」のジョブスケジューリング問題を解決します。
以下のテンプレートを使用して、TensorFlow 分散ジョブをクラスターに送信します。分散 TensorFlow ジョブの実行に関する詳細については、「Gang スケジューリングの使用」をご参照ください。
apiVersion: "kubeflow.org/v1"
kind: "TFJob"
metadata:
name: "tf-smoke-gpu"
spec:
tfReplicaSpecs:
PS:
replicas: 1
template:
metadata:
creationTimestamp: null
labels:
pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu
pod-group.scheduling.sigs.k8s.io/min-available: "2"
spec:
schedulerName: ack-co-scheduler # スケジューラ名を ack-co-scheduler に設定します。
containers:
- args:
- python
- tf_cnn_benchmarks.py
- --batch_size=32
- --model=resnet50
- --variable_update=parameter_server
- --flush_stdout=true
- --num_gpus=1
- --local_parameter_device=cpu
- --device=cpu
- --data_format=NHWC
image: registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
name: tensorflow
ports:
- containerPort: 2222
name: tfjob-port
resources:
limits:
cpu: '10'
workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
restartPolicy: OnFailure
Worker:
replicas: 4
template:
metadata:
creationTimestamp: null
labels:
pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu
pod-group.scheduling.sigs.k8s.io/min-available: "2"
spec:
schedulerName: ack-co-scheduler
containers:
- args:
- python
- tf_cnn_benchmarks.py
- --batch_size=32
- --model=resnet50
- --variable_update=parameter_server
- --flush_stdout=true
- --num_gpus=1
- --local_parameter_device=cpu
- --device=gpu
- --data_format=NHWC
image: registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
name: tensorflow
ports:
- containerPort: 2222
name: tfjob-port
resources:
limits:
cpu: 10
workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
restartPolicy: OnFailure
CPU トポロジー認識スケジューリング
CPU トポロジー認識スケジューリングを使用する前に、resource-controller コンポーネントをデプロイしてください。詳細については、「アドオンの管理」をご参照ください。
以下のテンプレートを使用して、デプロイメントで CPU トポロジー認識スケジューリングを有効化します。CPU トポロジー認識スケジューリングに関する詳細については、「CPU トポロジー認識スケジューリングの有効化」をご参照ください。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-numa
labels:
app: nginx-numa
spec:
replicas: 2
selector:
matchLabels:
app: nginx-numa
template:
metadata:
annotations:
cpuset-scheduler: "true"
labels:
app: nginx-numa
spec:
schedulerName: ack-co-scheduler # スケジューラ名を ack-co-scheduler に設定します。
containers:
- name: nginx-numa
image: nginx:1.13.3
ports:
- containerPort: 80
resources:
requests:
cpu: 4
limits:
cpu: 4
ECI エラスティックスケジューリング
ECI エラスティックスケジューリングは、Alibaba Cloud が提供するエラスティックなスケジューリングポリシーです。サービスをデプロイする際に、アノテーションを追加することで、ECS リソースのみを使用する、ECI リソースのみを使用する、または ECS リソースが不足した場合に自動的に ECI リソースを要求するといった制御が可能です。ECI エラスティックスケジューリングは、さまざまなワークロードシナリオにおける変動するエラスティックリソース需要に対応します。
ECI エラスティックスケジューリングを使用する前に、クラスターに ack-virtual-node コンポーネントをデプロイしてください。詳細については、「ACK での ECI の使用」をご参照ください。
以下のテンプレートを使用して、デプロイメントで ECI エラスティックスケジューリングを有効化します。ECI エラスティックスケジューリングの使用に関する詳細については、「ElasticResource を使用した ECI エラスティックスケジューリングの実装(非推奨)」をご参照ください。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
annotations:
alibabacloud.com/burst-resource: eci # エラスティックリソースの種類を指定するアノテーションを追加します。
labels:
app: nginx
spec:
schedulerName: ack-co-scheduler # スケジューラ名を ack-co-scheduler に設定します。
containers:
- name: nginx
image: nginx
resources:
limits:
cpu: 2
requests:
cpu: 2
template.metadata 配下の Pod アノテーション alibabacloud.com/burst-resource を設定して、エラスティックリソースの種類を指定します。alibabacloud.com/burst-resource の指定可能な値は以下のとおりです。
-
このアノテーションを指定しない場合:クラスター内の既存の ECS リソースのみを使用します。
-
eci:クラスター内の ECS リソースが不足した場合に、ECI リソースを使用します。 -
eci_only:クラスター内の ECS リソースは一切使用せず、ECI リソースのみを使用します。
共有 GPU スケジューリング
共有 GPU スケジューリングの使用方法については、「共有 GPU スケジューリングコンポーネントの実行」「GPU リソースの監視および分離」「ノードプールを用いた共有 GPU の管理」をご参照ください。