Container Compute Service (ACS) は、仮想ノードを介して ACK One 登録済みクラスターと統合されており、基盤となるインフラストラクチャを管理することなく、既存のワークロードと並行してサーバーレス ACS Pod を実行できます。
仕組み
ACS は、Kubernetes コントロールとコンピューティングを分離する階層型アーキテクチャを使用しています。Kubernetes コントロール層はワークロード (Deployment、Service、StatefulSet、CronJob) を管理し、コンピューティング層は Pod にリソースをスケジュールし、割り当てます。
ACK One 登録済みクラスターでは、ack-virtual-node コンポーネントが ACS が提供する仮想ノードをプロビジョニングします。これらの仮想ノードにスケジュールされた Pod は、ノード容量を計画する必要なくオンデマンドでスケーリングする、隔離されたサーバーレスコンテナである ACS Pod として実行されます。ACS Pod は、同じクラスター内の物理ノード上の Pod と通信します。
前提条件
開始する前に、以下を確認してください。
データセンターまたは別のクラウドプロバイダーの Kubernetes クラスターに接続された ACK One 登録済みクラスター。Kubernetes 1.24 以降を推奨します。「登録済みクラスターの作成」をご参照ください。
ack-virtual-nodeコンポーネントがバージョン 2.13.0 以降でインストールされていること。「ack-virtual-node に Resource Access Management (RAM) 権限を付与する」および「ack-virtual-node のインストール」をご参照ください。
スケジューリング方法の選択
ACS は、仮想ノードへの Pod のスケジューリングに 2 つの方法をサポートしています。ユースケースに基づいて選択してください。
| 方法 | 仕組み | 最適な用途 |
|---|---|---|
| ラベルスケジューリング (推奨) | Pod ラベルに alibabacloud.com/acs: "true" を追加 | 複数のワークロードの移行。`nodeSelector` または Toleration は不要 |
| NodeSelector | nodeSelector: type: virtual-kubelet を設定し、Toleration を追加 | どの Pod を仮想ノードに配置するかを明示的に制御 |
コンピューティングクラスを指定しない場合、デフォルトで Elastic Container Instance が Pod スケジューリングで優先されます。
CPU コンピューティング能力の使用
ラベルスケジューリング
ラベルに alibabacloud.com/acs: "true" を含むすべての Pod は、自動的に仮想ノードにスケジュールされます。 nodeSelector や Toleration の指定は不要です。
次の内容で
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" # ACS 仮想ノードにスケジュールします。 alibabacloud.com/compute-class: general-purpose # コンピューティングクラス。デフォルト: general-purpose。 alibabacloud.com/compute-qos: default # QoS クラス。デフォルト: default。 spec: containers: - name: nginx image: mirrors-ssl.aliyuncs.com/nginx:stable-alpine ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 2 requests: cpu: 2アプリケーションをデプロイします。
kubectl apply -f nginx.yamlPod が仮想ノードで実行されていることを確認します。
kubectl get pods -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-54bcbc9b66-**** 1/1 Running 0 3m29s 192.168.XX.XXX virtual-kubelet-cn-shanghai-l <none> <none> nginx-54bcbc9b66-**** 1/1 Running 0 3m29s 192.168.XX.XXX virtual-kubelet-cn-shanghai-l <none> <none>アノテーションを確認して、Pod が ACS Pod であることを確認します。
kubectl describe pod nginx-54bcbc9b66-****出力には
alibabacloud.com/instance-id: acs-uf6008giwgjxlvn*****アノテーションが含まれており、Pod が ACS Pod として実行されていることを確認できます。Annotations: ProviderCreate: done alibabacloud.com/instance-id: acs-uf6008giwgjxlvn***** alibabacloud.com/pod-ephemeral-storage: 30Gi alibabacloud.com/pod-use-spec: 2-2Gi kubernetes.io/pod-stream-port: 10250 network.alibabacloud.com/enable-dns-cache: false topology.kubernetes.io/region: cn-shanghai
NodeSelector
この方法では、nodeSelector および Toleration を使用して、仮想ノードを明示的に指定します。まず、仮想ノードのラベルを確認し、「type: virtual-kubelet」ラベルが設定されていることを確認します。
仮想ノードのラベルをクエリします。
virtual-kubelet-cn-shanghai-lをご利用の実際の仮想ノード名に置き換えてください。kubectl get node virtual-kubelet-cn-shanghai-l -oyaml期待される出力:
apiVersion: v1 kind: Node metadata: labels: beta.kubernetes.io/arch: amd64 beta.kubernetes.io/os: linux kubernetes.io/arch: amd64 kubernetes.io/hostname: virtual-kubelet-cn-shanghai-l kubernetes.io/os: linux kubernetes.io/role: agent service.alibabacloud.com/exclude-node: "true" topology.diskplugin.csi.alibabacloud.com/zone: cn-shanghai-l topology.kubernetes.io/region: cn-shanghai topology.kubernetes.io/zone: cn-shanghai-l type: virtual-kubelet # このラベルを nodeSelector の値として使用し、仮想ノードをターゲットにします。 name: virtual-kubelet-cn-shanghai-l spec: taints: - effect: NoSchedule key: virtual-kubelet.io/provider value: alibabacloud次の内容で
nginx.yamlという名前のファイルを作成します。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 # コンピューティングクラス。デフォルト: general-purpose。 alibabacloud.com/compute-qos: default # QoS クラス。デフォルト: default。 spec: nodeSelector: type: virtual-kubelet # 仮想ノードをターゲットにします。 tolerations: - key: "virtual-kubelet.io/provider" # 仮想ノードの Taint を許容します。 operator: "Exists" effect: "NoSchedule" containers: - name: nginx image: mirrors-ssl.aliyuncs.com/nginx:stable-alpine ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 2 requests: cpu: 2アプリケーションをデプロイします。
kubectl apply -f nginx.yamlPod が仮想ノードで実行されていることを確認します。
kubectl get pods -o wide期待される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-54bcbc9b66-**** 1/1 Running 0 3m29s 192.168.XX.XXX virtual-kubelet-cn-shanghai-l <none> <none> nginx-54bcbc9b66-**** 1/1 Running 0 3m29s 192.168.XX.XXX virtual-kubelet-cn-shanghai-l <none> <none>
アフィニティ、アンチアフィニティ、ResourcePolicies を含むその他のスケジューリングオプションについては、「ノードアフィニティスケジューリング」および「ACS Pod の概要」をご参照ください。
GPU コンピューティング能力の使用
ACK One 登録済みクラスターでの GPU コンピューティング能力は招待プレビュー中です。アクセスをリクエストするには、チケットを送信してください。
手順は CPU と同様ですが、2 つの相違点があります。alibabacloud.com/compute-class: gpu を設定し、alibabacloud.com/gpu-model-series ラベルを追加して GPU モデル (例: T4) を指定します。また、スケジューリングコンポーネントがバージョン要件を満たしていることを確認する必要があります。
サポートされている GPU モデルの完全なリストについては、「GPU モデル」をご参照ください。コンピューティングクラスとサービス品質 (QoS) クラスのマッピングについては、「コンピューティングクラスとコンピューティング能力 QoS クラス間のマッピング」をご参照ください。
ラベルスケジューリング
次の内容で
gpu-workload.yamlという名前のファイルを作成します。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 alibabacloud.com/acs: "true" # ACS 仮想ノードにスケジュールします。 alibabacloud.com/compute-class: gpu # GPU コンピューティング能力のために gpu に設定します。 alibabacloud.com/compute-qos: default alibabacloud.com/gpu-model-series: example-model # T4 など、GPU モデルを指定します。 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"ワークロードをデプロイします。
kubectl apply -f gpu-workload.yamlGPU ワークロードが実行中であることを確認します。
kubectl get pod node-selector-demo-9cdf7bbf9-s**** -oyaml期待される出力:
phase: Running resources: limits: # その他のリソース nvidia.com/gpu: "1" requests: # その他のリソース nvidia.com/gpu: "1"
NodeSelector
次の内容で
gpu-workload.yamlという名前のファイルを作成します。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 alibabacloud.com/compute-class: gpu # GPU コンピューティング能力のために gpu に設定します。 alibabacloud.com/compute-qos: default alibabacloud.com/gpu-model-series: example-model # T4 など、GPU モデルを指定します。 spec: nodeSelector: type: virtual-kubelet # 仮想ノードをターゲットにします。 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"ワークロードをデプロイします。
kubectl apply -f gpu-workload.yamlGPU ワークロードが実行中であることを確認します。
kubectl get pod node-selector-demo-9cdf7bbf9-s**** -oyaml期待される出力:
phase: Running resources: limits: # その他のリソース nvidia.com/gpu: "1" requests: # その他のリソース nvidia.com/gpu: "1"