Alibaba Cloud Container Compute Service (ACS) は Container Service for Kubernetes と統合されています。ACK Pro クラスターを使用して、ACS が提供するコンテナコンピューティング能力に迅速にアクセスできます。このトピックでは、ACK クラスターで ACS コンピューティング能力を使用する方法について説明します。
仕組み
Container Compute Service (ACS) は、Kubernetes をユーザーインターフェースとして使用し、コンテナ仕様に準拠したコンピューティングリソースを提供するコンテナサービスです。ACS は、Kubernetes コントロールプレーンを基盤となるコンテナコンピューティング能力から分離する階層型アーキテクチャを採用しています。ACS コンピューティングリソースレイヤーは Pod のリソースのスケジューリングと割り当てを担当し、Kubernetes はこのレイヤーの上で Deployment、Service、StatefulSet、CronJob などのアプリケーションワークロードを管理します。
ACS コンテナコンピューティング能力を仮想ノードとして Kubernetes クラスターに接続できます。これにより、クラスターはノードの計算能力に制約されることなく、強力な伸縮性を得ることができます。ACS が Pod の基盤インフラストラクチャの管理を引き継ぐと、Kubernetes は個々の Pod の配置と起動を直接処理したり、基盤となる仮想マシンのリソースステータスを監視したりする必要がなくなります。ACS は、必要な Pod リソースが常に利用可能であることを保証します。
Container Service for Kubernetes (ACK) は、世界で最初に認定された Kubernetes プラットフォームの 1 つであり、コンテナ化されたアプリケーション向けのハイパフォーマンスな管理サービスを提供します。Alibaba Cloud の仮想化、ストレージ、ネットワーク、およびセキュリティ機能と統合して、クラスターの作成とスケーリングを簡素化し、コンテナ化されたアプリケーションの開発と管理に集中できるようにします。
ACK Pro クラスターでは、ACS Pod を作成する前に、手動で仮想ノードをデプロイする必要があります。クラスターをスケールアウトする必要がある場合、ノード容量を計画することなく、オンデマンドで仮想ノード上に ACS Pod を作成できます。ACS Pod は、通常のクラスターノード上の Pod と通信できます。長時間実行され、トラフィックが変動するワークロードの場合は、仮想ノードにスケジュールすることを推奨します。このアプローチにより、リソース使用率が最大化され、スケールアウト時間が短縮され、コストが削減されます。トラフィックが減少すると、これらの Pod を迅速にリリースしてコストを削減できます。仮想ノード上の各 Pod は、安全で分離されたコンテナ環境内で ACS インスタンスとして実行されます。詳細については、「ACK の概要」をご参照ください。
前提条件
-
初めてサービスを使用する場合は、必要なサービスを有効化し、必要な権限を付与してください:
-
Container Service for Kubernetes を有効化し、デフォルトロールに権限を付与し、必要なクラウドサービスを有効化します。詳細については、「ACK Pro クラスターの作成」をご参照ください。
-
Container Compute Service コンソールにログインし、画面の指示に従って ACS を有効化します。
-
-
Kubernetes 1.26 以降を実行する ACK Pro クラスターが必要です。詳細については、「ACK Pro クラスターの作成」をご参照ください。クラスターのアップグレード方法については、「ACK クラスターのアップグレード」をご参照ください。
-
ACK Pro クラスターの場合、仮想ノードコンポーネント (ACK Virtual Node) は、Kubernetes バージョンに対応するバージョン要件を満たす必要があります。
Kubernetes バージョン
ACK Virtual Node コンポーネントバージョン
1.26 以降
v2.13.0 以降
ACK Virtual Node コンポーネントのインストール
次の手順を実行します:
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[コンポーネントとアドオン] をクリックします。
-
コアコンポーネント タブで、ACK Virtual Node コンポーネントを見つけ、インストール または アップグレード をクリックして、必要なバージョンにします。
また、クラスター詳細ページの左側のナビゲーションウィンドウで [オペレーション] > [コンポーネント管理] を選択して、コンポーネント管理ページに移動することもできます。
-
ACK Virtual Node をインストールする前に [ACS の有効化と承認] を求められた場合は、画面の指示に従ってください。ACS を有効化し、必要な権限を付与した後、OK をクリックしてインストールを続行します。
-
インストールが完了したら、左側のナビゲーションウィンドウで を選択します。新しい仮想ノードの名前は、デフォルトで
virtual-kubelet-で始まります。
例:ACS CPU コンピューティング能力の使用
ACK Virtual Node コンポーネントが「前提条件」で指定されたバージョンにインストールまたはアップグレードされると、ACS と ECI の両方のコンピューティング能力をサポートします。
Pod を仮想ノードにスケジュールする場合、ACS を指定しない限り、デフォルトで Elastic Container Instance (ECI) のコンピューティング能力が使用されます。
ACK で ACS CPU コンピューティング能力を使用するには、次の手順を実行します:
-
`nodeSelector`、アフィニティ、ResourcePolicy などのメソッドを使用するか、
alibabacloud.com/acs: "true"ラベルを追加して、Pod を仮想ノードにスケジュールします。詳細については、「ノードアフィニティ」をご参照ください。説明alibabacloud.com/acs: "true"ラベルを使用したスケジューリングは、ACK Serverless クラスターではサポートされていません。現在、ACK Pro クラスター、ACK 専用クラスター、ACK One 登録済みクラスター、および ACK Edge クラスターでサポートされています。 -
ラベル
alibabacloud.com/compute-class:<compute-type>を使用して、ACS Pod のインスタンスタイプを指定します。ACS インスタンスタイプの詳細については、「ACS Pod インスタンス」をご参照ください。
以下の手順で詳細な例を示します:
-
Deployment をデプロイします。
重要alibabacloud.com/acs: "true"ラベルを追加して Pod をスケジュールする場合、WaitForFirstConsumerタイプの StorageClass はサポートされません。したがって、ACK クラスターで ACS コンピューティング能力を使用し、ACS Pod がクラウドディスクをマウントする必要がある場合は、`nodeSelector` または ResourcePolicy を使用して Pod を仮想ノードにスケジュールしてください。ResourcePolicy の設定方法の詳細については、「ACK Pro クラスターは ECS と ACS のコンピューティング能力のハイブリッドスケジューリングをサポート」をご参照ください。NodeSelector
-
次のコマンドを実行して、仮想ノードのラベルを表示します。
virtual-kubelet-cn-hangzhou-kをご利用の仮想ノード名に置き換えてください。kubectl get node virtual-kubelet-cn-hangzhou-k -oyaml次の出力は、
labelsセクションのスニペットです:apiVersion: v1 kind: Node metadata: labels: kubernetes.io/arch: amd64 kubernetes.io/hostname: virtual-kubelet-cn-hangzhou-k kubernetes.io/os: linux kubernetes.io/role: agent service.alibabacloud.com/exclude-node: "true" topology.diskplugin.csi.alibabacloud.com/zone: cn-hangzhou-k topology.kubernetes.io/region: cn-hangzhou topology.kubernetes.io/zone: cn-hangzhou-k type: virtual-kubelet # このラベルを使用して、Pod を仮想ノードにスケジュールします。 name: virtual-kubelet-cn-hangzhou-k spec: taints: - effect: NoSchedule key: virtual-kubelet.io/provider value: alibabacloud -
次の内容で nginx.yaml という名前のファイルを作成し、2 つの Pod をデプロイします。
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 alibabacloud.com/compute-class: general-purpose # ACS Pod のコンピューティングクラスを指定します。デフォルト:general-purpose。 alibabacloud.com/compute-qos: default # ACS Pod の QoS クラスを指定します。デフォルト:default。 spec: nodeSelector: type: virtual-kubelet # Pod を仮想ノードにスケジュールします。 tolerations: - key: "virtual-kubelet.io/provider" # 仮想ノードの Taint を許容します。 operator: "Exists" effect: "NoSchedule" containers: - name: nginx image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 resources: limits: cpu: 2 requests: cpu: 2 -
NGINX アプリケーションを作成し、デプロイ結果を確認します。
-
次のコマンドを実行して、NGINX アプリケーションを作成します。
kubectl apply -f nginx.yaml -
次のコマンドを実行して、デプロイ結果を確認します。
kubectl get pods -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-9cdf7bbf9-s**** 1/1 Running 0 36s 10.0.6.68 virtual-kubelet-cn-hangzhou-j <none> <none> nginx-9cdf7bbf9-v**** 1/1 Running 0 36s 10.0.6.67 virtual-kubelet-cn-hangzhou-k <none> <none>出力は、
nodeSelectorが 2 つの Pod をラベルtype=virtual-kubeletを持つノードにスケジュールしたことを示しています。
-
Pod ラベルスケジューリング
-
次の内容で nginx.yaml という名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx alibabacloud.com/acs: "true" # Pod が ACS コンピューティング能力を使用するように設定します。 alibabacloud.com/compute-class: general-purpose # ACS Pod のコンピューティングクラスを指定します。デフォルト:general-purpose。 alibabacloud.com/compute-qos: default # ACS Pod の QoS クラスを指定します。デフォルト:default。 spec: containers: - name: nginx image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6 resources: limits: cpu: 2 requests: cpu: 2 -
NGINX アプリケーションを作成し、デプロイ結果を確認します。
-
次のコマンドを実行して、NGINX アプリケーションを作成します。
kubectl apply -f nginx.yaml -
次のコマンドを実行して、デプロイ結果を確認します。
kubectl get pods -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-9cdf7bbf9-s**** 1/1 Running 0 36s 10.0.6.68 virtual-kubelet-cn-hangzhou-j <none> <none> nginx-9cdf7bbf9-v**** 1/1 Running 0 36s 10.0.6.67 virtual-kubelet-cn-hangzhou-k <none> <none>出力は、Pod が
alibabacloud.com/acs: "true"ラベルで指定されたとおり、仮想ノードにスケジュールされていることを示しています。
-
-
-
NGINX Pod の詳細を確認して、それが ACS Pod インスタンスであることを確認します。
-
次のコマンドを実行して、NGINX Pod の詳細を表示します。
kubectl describe pod nginx-9cdf7bbf9-s****期待される出力 (主要な情報):
Annotations: ProviderCreate: done alibabacloud.com/client-token: edf29202-54ac-438e-9626-a1ca007xxxxx alibabacloud.com/instance-id: acs-2ze008giupcyaqbxxxxx alibabacloud.com/pod-ephemeral-storage: 30Gi alibabacloud.com/pod-use-spec: 2-4Gi alibabacloud.com/request-id: A0EF3BF3-37E7-5A07-AC2D-68A0CFCxxxxx alibabacloud.com/schedule-result: finished alibabacloud.com/user-id: 14889995898xxxxx kubernetes.io/pod-stream-port: 10250 kubernetes.io/preferred-scheduling-node: virtual-kubelet-cn-hangzhou-j/1 kubernetes.io/resource-type: serverlessalibabacloud.com/instance-id: acs-2ze008giupcyaqbxxxxxアノテーションは、Pod が ACS Pod インスタンスであることを確認します。
-
例:ACS GPU コンピューティング能力の使用
ACS GPU コンピューティング能力を使用するプロセスは、ACS CPU コンピューティング能力を使用するプロセスと似ていますが、特定のコンポーネントバージョンといくつかの追加設定が必要です。
コンポーネント構成
異なる Kubernetes バージョンの ACK Pro クラスターでは、kube-scheduler コンポーネントが次のバージョン要件を満たす必要があります。
|
Kubernetes バージョン |
kube-scheduler バージョン |
|
1.26 以降 |
|
使用方法
...
labels:
# ラベルで ACS GPU リソース要件を宣言します。
alibabacloud.com/compute-class: gpu # GPU タイプには、固定値 'gpu' を使用します。
alibabacloud.com/compute-qos: default # QoS クラス。これは、通常の ACS コンピューティング能力と同じ意味を持ちます。
alibabacloud.com/gpu-model-series: example-model # GPU モデルシリーズ。T4 などの実際のモデルに置き換えてください。
...
-
ACS コンピューティングクラスとサービス品質 (QoS) クラスの詳細については、「コンピューティングクラスと QoS クラスの関係」をご参照ください。
-
gpu-model-seriesで利用可能な GPU モデルについては、「ACS GPU アクセラレーション Pod の GPU モデルとドライバーバージョンの指定」をご参照ください。 -
alibabacloud.com/acs: "true"ラベルを使用したスケジューリングは、ACK Serverless クラスターではサポートされていません。現在、ACK Pro クラスター、ACK 専用クラスター、ACK One 登録済みクラスター、および ACK Edge クラスターでサポートされています。
-
以下の例は、GPU コンピューティング能力を設定する 3 つの異なる方法を示しています。
NodeSelector
次の YAML を使用して GPU ワークロードを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: dep-node-selector-demo labels: app: node-selector-demo spec: replicas: 1 selector: matchLabels: app: node-selector-demo template: metadata: labels: app: node-selector-demo # ACS 属性 alibabacloud.com/compute-class: gpu alibabacloud.com/compute-qos: default alibabacloud.com/gpu-model-series: example-model # GPU モデルシリーズ。T4 などの実際のモデルに置き換えてください。 spec: # 仮想ノードのラベルを指定します。 nodeSelector: type: virtual-kubelet # 仮想ノードの Taint を許容します。 tolerations: - key: "virtual-kubelet.io/provider" # 仮想ノードの Taint を許容します。 operator: "Exists" effect: "NoSchedule" containers: - name: node-selector-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "1000h" resources: limits: cpu: 1 memory: 1Gi nvidia.com/gpu: "1" requests: cpu: 1 memory: 1Gi nvidia.com/gpu: "1"ResourcePolicy
次の YAML を使用して GPU ワークロードを作成します。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: dep-rp-demo namespace: default spec: selector: app: dep-rp-demo units: - resource: acs podLabels: alibabacloud.com/compute-class: gpu alibabacloud.com/compute-qos: default alibabacloud.com/gpu-model-series: example-model # GPU モデルシリーズ。T4 などの実際のモデルに置き換えてください。 --- apiVersion: apps/v1 kind: Deployment metadata: name: dep-rp-demo labels: app: dep-rp-demo annotations: resourcePolicy: "dep-rp-demo" # ResourcePolicy の名前を参照します。 spec: replicas: 1 selector: matchLabels: app: dep-rp-demo template: metadata: labels: app: dep-rp-demo alibabacloud.com/compute-class: gpu alibabacloud.com/compute-qos: default alibabacloud.com/gpu-model-series: example-model # GPU モデルシリーズ。T4 などの実際のモデルに置き換えてください。 spec: containers: - name: demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "1000h" resources: limits: cpu: 1 memory: 1Gi nvidia.com/gpu: "1" requests: cpu: 1 memory: 1Gi nvidia.com/gpu: "1"ResourcePolicy を使用したリソーススケジューリングの詳細については、「カスタムリソースの優先度スケジューリング」をご参照ください。
Pod ラベルスケジューリング
次の YAML を使用して GPU ワークロードを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: dep-node-selector-demo labels: app: node-selector-demo spec: replicas: 1 selector: matchLabels: app: node-selector-demo template: metadata: labels: app: node-selector-demo # ACS 属性 alibabacloud.com/acs: "true" # Pod が ACS コンピューティング能力を使用するように設定します。 alibabacloud.com/compute-class: gpu alibabacloud.com/compute-qos: default alibabacloud.com/gpu-model-series: example-model # GPU モデルシリーズ。T4 などの実際のモデルに置き換えてください。 spec: containers: - name: node-selector-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "1000h" resources: limits: cpu: 1 memory: 1Gi nvidia.com/gpu: "1" requests: cpu: 1 memory: 1Gi nvidia.com/gpu: "1" -
次のコマンドを実行して、GPU ワークロードの実行ステータスを確認します。
kubectl get pod node-selector-demo-9cdf7bbf9-s**** -oyaml期待される出力 (主要な情報):
phase: Running resources: limits: #その他のリソース nvidia.com/gpu: "1" requests: #その他のリソース nvidia.com/gpu: "1"
例:ACS GPU HPN コンピューティング能力の使用
ACS GPU HPN コンピューティング能力を使用するプロセスは、ACS CPU コンピューティング能力を使用するプロセスと似ていますが、次の要件があります:
-
この機能は、ACK Pro クラスター、ACK One 登録済みクラスター、および ACK One 分散ワークフロー Argo クラスターでのみサポートされています。
-
事前に GPU-HPN 容量予約 を購入し、クラスターに関連付ける必要があります。
-
kube-scheduler のバージョンは、次の要件を満たす必要があります:
Kubernetes バージョン
kube-scheduler バージョン
1.28
v1.28.12-aliyun-6.9.3.cd73f3fe 以降。
1.30
v1.30.3-aliyun.6.9.3.ce7e2faf 以降。
1.31
v1.31.0-aliyun.6.9.3.051bb0e8 以降。
1.32
v1.32.0-aliyun.6.9.3.515ac311 以降。
1.33
v1.33.0-aliyun.6.9.4.8b58e6b4 以降。
-
ACK Virtual Node コンポーネントは v2.15.0 以降である必要があります。
使用方法
...
labels:
# ラベルで ACS GPU リソース要件を宣言します。
alibabacloud.com/compute-class: gpu-hpn # gpu-hpn に設定する必要があります。
alibabacloud.com/compute-qos: default # QoS クラス。これは、通常の ACS コンピューティング能力と同じ意味を持ちます。
...
-
ACS コンピューティングクラスと QoS クラスの詳細については、「コンピューティングクラスと QoS クラスの関係」をご参照ください。
-
ACS Pod のその他のパラメーターについては、「ACS Pod の設定」をご参照ください。
-
ACS GPU HPN ノードは、
gpu-hpnコンピューティングクラスの Pod のみをスケジュールできます。これらの Pod のリソース宣言で GPU リソース要件を指定する必要はありません。ノードは、他のコンピューティングクラスの Pod や、コンピューティングクラスが宣言されていない Pod をスケジュールすることはできません。
-
Kubernetes の nodeSelector を使用して、Pod を GPU HPN ノードにスケジュールできます。
重要ACS GPU HPN Pod を設定する際は、次のフィールドに注意してください:
-
コンピューティングクラスを指定します:
alibabacloud.com/compute-class: gpu-hpn。 -
予約済みノードのラベルを指定します:
alibabacloud.com/node-type: reserved。 -
リソース仕様の
requestsおよびlimitsフィールドのデバイスリソース名については、NVIDIA などの実際のデバイスカードタイプに基づいて名前を指定します。
apiVersion: apps/v1 kind: Deployment metadata: name: dep-node-selector-demo labels: app: node-selector-demo spec: replicas: 1 selector: matchLabels: app: node-selector-demo template: metadata: labels: app: node-selector-demo # ACS 属性 alibabacloud.com/compute-class: gpu-hpn alibabacloud.com/compute-qos: default spec: # GPU HPN 予約済みノードのラベルを指定します。 nodeSelector: alibabacloud.com/node-type: reserved containers: - name: node-selector-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "1000h" resources: limits: cpu: 1 memory: 1Gi nvidia.com/gpu: "1" # 実際の GPU モデルに一致するリソース名を使用します。 requests: cpu: 1 memory: 1Gi nvidia.com/gpu: "1" # 実際の GPU モデルに一致するリソース名を使用します。 -
-
GPU ワークロードの実行ステータスを確認します。
kubectl get pod node-selector-demo-9cdf7bbf9-s**** -oyaml期待される出力 (主要な情報):
phase: Running resources: limits: #その他のリソース nvidia.com/gpu: "1" requests: #その他のリソース nvidia.com/gpu: "1"