すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:並列クラウドディスクアタッチ機能を有効化して Pod の起動速度を向上させる

最終更新日:Mar 07, 2026

データベースなどのステートフルアプリケーションや、継続的インテグレーション、バッチ処理など短命のコンテナが多数存在するワークロードにおいて、高密度デプロイメントを実施する場合、各 Pod はデータストレージ用に複数のクラウドディスクを必要とします。多くの Pod が同時に同一ノードにスケジュールされる際、デフォルトの直列アタッチ処理により、Pod の起動時間が大幅に増加します。この問題を解決するため、並列クラウドディスクアタッチ機能を有効化してください。

前提条件

  • ACK マネージドクラスター のバージョンが 1.26 以降である必要があります。csi-plugin および csi-provisioner コンポーネントのバージョンは、1.30.4 以降である必要があります。

  • Cloud Assistant CLI をインストールおよび構成します。詳細については、「Cloud Assistant CLI のインストール」をご参照ください。

注意事項

  • 並列アタッチをサポートするのは、ディスクシリアル番号を持つクラウドディスクのみです。ディスクシリアル番号の確認方法については、「Elastic Block Storage のシリアル番号の表示」をご参照ください。

    2020 年 6 月 10 日以前に作成されたクラウドディスクには、識別可能なシリアル番号情報が含まれません。これらのディスクは正常にマウントできないため、並列アタッチを有効化できません。

  • 同一ノードから複数のクラウドディスクをアンマウントする操作は、引き続き直列で実行されます。

  • 並列アタッチを有効化した後、ECS の OpenAPI 操作(例:DescribeDisks)で返される Device フィールドおよびコンソールに表示されるマウントポイントは信頼性が低下する場合があります。アプリケーションでは、このマウントパスを使用しないでください。代わりに、クラウドディスクのシリアル番号を用いて実際のマウントパスを確認してください。

有効化手順

並列クラウドディスクアタッチ機能は、自動スクリプトの実行または手動構成のいずれかで有効化できます。

自動スクリプトによる構成

  1. 以下のスクリプトを enable_parallel_attach.sh として保存します。

    構成スクリプトを表示するには展開してください

    #!/bin/bash
    
    set -e
    set -o pipefail
    
    readonly REQUIRED_VERSION="v1.30.4"
    CLUSTER_ID=$1
    
    if [ -z "$CLUSTER_ID" ]; then
        echo "Usage: enable_parallel_attach.sh <cluster-id>"
        exit 1
    fi
    
    check_version() {
        local ADDONS VERSION
        ADDONS=$(aliyun cs GET "/clusters/${CLUSTER_ID}/addon_instances")
    
        VERSION=$(echo "$ADDONS" | jq -r '.addons[] | select(.name=="csi-plugin") | .version')
        if ! printf "%s\n" "$REQUIRED_VERSION" "$VERSION" | sort -V -C; then
            echo "csi-plugin version $VERSION is not supported, please upgrade to $REQUIRED_VERSION or later"
            exit 1
        fi
    
        PROVISIONER=managed-csiprovisioner
        VERSION=$(echo "$ADDONS" | jq -r '.addons[] | select(.name=="managed-csiprovisioner") | .version')
        if [ -z "$VERSION" ]; then
            PROVISIONER=csi-provisioner
            VERSION=$(echo "$ADDONS" | jq -r '.addons[] | select(.name=="csi-provisioner") | .version')
        fi
        if ! printf "%s\n" "$REQUIRED_VERSION" "$VERSION" | sort -V -C; then
            echo "$PROVISIONER version $VERSION is not supported, please upgrade to $REQUIRED_VERSION or later"
            exit 1
        fi
    }
    
    update_node_pool() {
        local NODE_POOL_DOC
        NODE_POOL_DOC=$(aliyun cs GET "/clusters/${CLUSTER_ID}/nodepools/$1")
    
        if [ -n "$(echo "$NODE_POOL_DOC" | jq -r '(.scaling_group.tags // [])[] | select(.key=="supportConcurrencyAttach")')" ]; then
            echo "node pool already has supportConcurrencyAttach tag"
            return
        fi
    
        aliyun cs PUT "/clusters/${CLUSTER_ID}/nodepools/$1" --header "Content-Type=application/json" \
            --body "$(echo "$NODE_POOL_DOC" | jq -c '{
        "scaling_group": {
            "tags": ((.scaling_group.tags // []) + [{
                "key": "supportConcurrencyAttach",
                "value": "true"
            }])
        }
    }')"
    }
    
    # Configure existing nodes
    update_nodes() {
        local PAGE=1
        local IDX TOTAL NODES_DOC ARGS
        while :; do
            echo "tagging nodes, page $PAGE"
            NODES_DOC=$(aliyun cs GET "/clusters/${CLUSTER_ID}/nodes" --pageSize 50 --pageNumber $PAGE)
            TOTAL=$(echo "$NODES_DOC" | jq -r '.page.total_count')
    
            ARGS=()
            IDX=0
            for node in $(echo "$NODES_DOC" | jq -r '.nodes[] | select(.is_aliyun_node) | .instance_id'); do
                IDX=$((IDX+1))
                ARGS+=("--ResourceId.$IDX" "$node")
            done
            if [ "$IDX" != "0" ]; then
                aliyun ecs TagResources --region "$ALIBABA_CLOUD_REGION_ID" --ResourceType Instance "${ARGS[@]}" \
                    --Tag.1.Key supportConcurrencyAttach --Tag.1.Value true
                echo "finished nodes $(( (PAGE-1)*50+IDX ))/$TOTAL"
            fi
    
            if [[ $(( PAGE*50 )) -ge $TOTAL ]]; then
                break
            fi
            PAGE=$((PAGE+1))
        done
    }
    
    update_addon() {
        local ADDON=$1
        shift
        local CONFIG STATE
        CONFIG=$(aliyun cs GET "/clusters/${CLUSTER_ID}/addon_instances/${ADDON}" | \
            jq -c '.config | fromjson | (.FeatureGate // "" | split(",")) as $fg | .FeatureGate = ($fg + $ARGS.positional | unique | join(",")) | {config: . | tojson}' --args "$@")
    
        aliyun cs POST "/clusters/${CLUSTER_ID}/components/${ADDON}/config" --header "Content-Type=application/json" --body "$CONFIG"
    
        echo "Waiting for $ADDON config to complete"
        while true; do
            STATE=$(aliyun --secure cs GET "/clusters/${CLUSTER_ID}/addon_instances/${ADDON}" | jq -r '.state')
            echo "state: $STATE"
            if [ "$STATE" != "updating" ]; then
                break
            fi
            sleep 5
        done
        if [ "$STATE" != "active" ]; then
            echo "Failed to update $ADDON config"
            return 1
        fi
    }
    
    check_version
    
    aliyun cs GET "/clusters/${CLUSTER_ID}/nodepools" | jq -r '.nodepools[]|.nodepool_info|"\(.nodepool_id)\t\(.name)"' | \
    while read -r NODE_POOL_ID NODE_POOL_NAME; do
        echo "Updating tags for node pool $NODE_POOL_NAME ($NODE_POOL_ID)"
        update_node_pool "$NODE_POOL_ID"
    done
    
    ALIBABA_CLOUD_REGION_ID=$(aliyun cs GET "/clusters/${CLUSTER_ID}" | jq -r .region_id)
    
    update_nodes
    
    update_addon $PROVISIONER DiskADController=true DiskParallelAttach=true
    update_addon csi-plugin DiskADController=true
    
    echo "All done! Now the disks can be attached concurrently to the same node."
  2. 並列クラウドディスクアタッチ機能を有効化するために、スクリプトを実行します。

    bash enable_parallel_attach.sh <クラスター ID>

手動構成

  1. クラスターのノードプール構成に ECS ラベル を追加します。キーを supportConcurrencyAttach、値を true に設定し、すべての新規 ECS インスタンスにこのタグが含まれるようにしてください。

    1. Container Service Management Console にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

    2. クラスターリスト ページで、ご利用のクラスター名をクリックします。左側のナビゲーションウィンドウで、ノード > ノードプール をクリックします。

    3. ノードプールページで、対象のノードプールの アクション をクリックし、[編集] をクリックします。

    4. ノードプールの編集ページで、下部の「高度なオプション」セクションに、キーが supportConcurrencyAttach、値が trueECS ラベル を追加します。

  2. クラスター内の既存ノードのすべての ECS インスタンスに、キーが supportConcurrencyAttach、値が true のタグを追加します。詳細については、「カスタムタグの作成とアタッチ」をご参照ください。

  3. 左側のナビゲーションウィンドウで、操作 > アドオン管理 を選択します。ボリューム タブをクリックし、csi-provisioner コンポーネントを検索して、右下隅の [設定] をクリックします。FeatureGate を DiskADController=true,DiskParallelAttach=true に設定します。

    説明

    DiskADController=true を設定すると、csi-provisioner がクラウドディスクの attach および detach 操作を処理します。DiskParallelAttach=true を設定すると、並列クラウドディスクアタッチ機能が有効化されます。

  4. csi-provisioner の構成後に、csi-plugin コンポーネントの FeatureGate を DiskADController=true に設定します。

クラウドディスクの並列アタッチ性能の検証

この例では、同一ノードにクラウドディスクをマウントする複数の Pod を作成し、並列アタッチ機能の有効化によって Pod の起動速度が向上することを検証します。

重要

本トピックのテストデータは参考用です。実際の結果はご利用の環境によって異なります。

  1. 複数のクラウドディスクをアタッチできるノードを ACK クラスターに追加します。たとえば、ecs.g7se.16xlarge インスタンスは最大 56 個のクラウドディスクのアタッチをサポートします。

  2. 以下の内容で attach-stress.yaml というファイルを作成します。<YOUR-HOSTNAME> は、実際のノード名に置き換えてください。

    attach-stress.yaml ファイルを表示するには展開してください

    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alibabacloud-disk
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_auto
    volumeBindingMode: WaitForFirstConsumer
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: attach-stress
    spec:
      selector:
        matchLabels:
          app: attach-stress
      serviceName: attach-stress
      replicas: 1
      podManagementPolicy: Parallel
      persistentVolumeClaimRetentionPolicy:
        whenScaled: Retain
        whenDeleted: Delete
      template:
        metadata:
          labels:
            app: attach-stress
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: kubernetes.io/hostname
                    operator: In
                    values:
                    - <YOUR-HOSTNAME>  # 実際のノード名に置き換えてください。
          hostNetwork: true
          containers:
          - name: attach-stress
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/busybox
            command: ["/bin/sh", "-c", "trap exit TERM; while true; do date > /mnt/0/data; sleep 1; done"]
            volumeMounts:
            - name: volume-0
              mountPath: /mnt/0
            - name: volume-1
              mountPath: /mnt/1
      volumeClaimTemplates:
      - metadata:
          name: volume-0
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: alibabacloud-disk
          resources:
            requests:
              storage: 1Gi
      - metadata:
          name: volume-1
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: alibabacloud-disk
          resources:
            requests:
              storage: 1Gi
  3. 以下のコマンドを実行して、アプリケーションが正常に起動することを確認します。その後、一括アタッチテストの準備として、レプリカ数を 0 にスケールダウンします。

    kubectl apply -f attach-stress.yaml
    kubectl rollout status sts attach-stress
    kubectl scale sts attach-stress --replicas 0

    期待される出力:

    storageclass.storage.k8s.io/alibabacloud-disk created
    statefulset.apps/attach-stress created
    partitioned roll out complete: 1 new pods have been updated...
    statefulset.apps/attach-stress scaled
  4. 以下のコマンドを実行して一括アタッチテストを開始し、Pod の起動にかかる時間を記録します。

    説明

    このクラスターでは、並列アタッチ機能はまだ有効化されていません。テスト用のレプリカ数は、ご利用のノードがサポートするクラウドディスクの最大数に基づいて調整してください。

    date && \
      kubectl scale sts attach-stress --replicas 28 && \
      kubectl rollout status sts attach-stress && \
      date

    期待される出力:

    Tue Oct 15 19:21:36 CST 2024
    statefulset.apps/attach-stress scaled
    Waiting for 28 pods to be ready...
    Waiting for 27 pods to be ready...
    ...
    Waiting for 3 pods to be ready...
    Waiting for 2 pods to be ready...
    Waiting for 1 pods to be ready...
    partitioned roll out complete: 28 new pods have been updated...
    Tue Oct 15 19:24:55 CST 2024

    出力より、並列アタッチ機能が無効の場合、28 個のすべての Pod の起動に 3 分以上かかっていることがわかります。

  5. 機能の有効化」の手順に従って、このクラスターで並列アタッチ機能を有効化します。

  6. 以前に作成した Pod をクリーンアップし、次のテストの準備を行います。

    説明

    クリーンアップ中に、クラスター内の volumeattachments リソースを監視してください。これらのリソースが削除されると、クラウドディスクがデタッチされます。このプロセスには数分かかります。

    kubectl scale sts attach-stress --replicas 0
  7. テストコマンドを再度実行し、並列アタッチ機能が有効化された状態での Pod 起動時間を記録します。起動時間は約 40 秒となることが期待され、前述の 3 分と比較して大幅な改善が見込まれます。

    date && \
      kubectl scale sts attach-stress --replicas 28 && \
      kubectl rollout status sts attach-stress && \
      date

    期待される出力:

    Tue Oct 15 20:02:54 CST 2024
    statefulset.apps/attach-stress scaled
    Waiting for 28 pods to be ready...
    Waiting for 27 pods to be ready...
    ...
    Waiting for 3 pods to be ready...
    Waiting for 2 pods to be ready...
    Waiting for 1 pods to be ready...
    partitioned roll out complete: 28 new pods have been updated...
    Tue Oct 15 20:03:31 CST 2024
  1. テストアプリケーションをクラスターから削除します。

    kubectl delete -f attach-stress.yaml