All Products
Search
Document Center

Container Service for Kubernetes:Aktifkan pemasangan disk cloud secara paralel untuk meningkatkan kecepatan startup Pod

Last Updated:Mar 25, 2026

Pada penyebaran kepadatan tinggi aplikasi berstatus seperti database atau beban kerja dengan banyak kontainer berumur pendek—misalnya integrasi berkelanjutan atau pemrosesan batch—setiap Pod memerlukan beberapa disk cloud untuk penyimpanan data. Ketika banyak Pod dijadwalkan ke node yang sama secara bersamaan, proses pemasangan serial bawaan secara signifikan memperlambat waktu startup Pod. Aktifkan pemasangan disk cloud secara paralel untuk mengatasi masalah ini.

Prasyarat

Catatan

  • Hanya disk cloud yang memiliki nomor seri disk yang mendukung pemasangan paralel. Untuk informasi selengkapnya tentang cara melihat nomor seri disk, lihat View Elastic Block Storage serial numbers.

    Disk cloud yang dibuat sebelum 10 Juni 2020 tidak berisi informasi nomor seri yang dapat diidentifikasi. Anda tidak dapat mengaktifkan pemasangan paralel untuk disk tersebut karena tidak dapat dipasang secara normal.

  • Mencopot beberapa disk cloud dari node yang sama tetap merupakan operasi serial.

  • Setelah mengaktifkan pemasangan paralel, bidang Device yang dikembalikan oleh operasi API seperti ECS DescribeDisks dan titik pemasangan yang ditampilkan di Konsol mungkin tidak dapat diandalkan. Jangan gunakan jalur pemasangan ini dalam aplikasi Anda. Sebagai gantinya, konfirmasikan jalur pemasangan aktual menggunakan nomor seri disk cloud.

Langkah Pengaktifan

Anda dapat mengaktifkan pemasangan disk cloud secara paralel dengan menjalankan skrip otomatis atau melalui konfigurasi manual.

Konfigurasi Menggunakan Skrip Otomatis

  1. Simpan skrip berikut sebagai enable_parallel_attach.sh.

    Expand to view the configuration script

    #!/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. Jalankan skrip untuk mengaktifkan pemasangan disk cloud secara paralel.

    bash enable_parallel_attach.sh <cluster ID>

Konfigurasi Manual

  1. Tambahkan ECS Tags dalam konfigurasi kelompok node kluster. Atur kuncinya menjadi supportConcurrencyAttach dan nilainya menjadi true. Pastikan semua instance ECS baru menyertakan tag ini.

    1. Masuk ke Container Service Management Console . Di panel navigasi kiri, klik Clusters.

    2. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Nodes > Node Pools.

    3. Di halaman Node Pools, klik Actions untuk kelompok node target, lalu klik Edit.

    4. Di halaman Edit Node Pool, pada bagian Advanced Options di bagian bawah, tambahkan ECS Tags dengan kunci supportConcurrencyAttach dan nilai true.

  2. Tambahkan tag dengan kunci supportConcurrencyAttach dan nilai true ke instance ECS semua node yang sudah ada di kluster. Untuk informasi selengkapnya, lihat Create and attach custom tags.

  3. Di panel navigasi kiri, pilih Operations > Add-ons. Klik tab Volumes, temukan komponen csi-provisioner, lalu klik Configure di pojok kanan bawah. Atur FeatureGate menjadi DiskADController=true,DiskParallelAttach=true.

    Catatan

    Saat Anda mengatur DiskADController=true, csi-provisioner menangani operasi attach dan detach disk cloud. Saat Anda mengatur DiskParallelAttach=true, pemasangan disk cloud secara paralel diaktifkan.

  4. Setelah mengonfigurasi csi-provisioner, atur FeatureGate komponen csi-plugin menjadi DiskADController=true.

Verifikasi kinerja pemasangan paralel disk cloud

Contoh ini membuat beberapa Pod yang memasang disk cloud pada node yang sama untuk memverifikasi bahwa pengaktifan pemasangan paralel meningkatkan kecepatan startup Pod.

Penting

Data uji dalam topik ini hanya sebagai referensi. Hasil aktual dapat berbeda tergantung lingkungan Anda.

  1. Tambahkan node yang mendukung pemasangan beberapa disk cloud ke kluster ACK Anda. Misalnya, instance ecs.g7se.16xlarge mendukung hingga 56 disk cloud yang dipasang.

  2. Buat file bernama attach-stress.yaml dengan konten berikut. Ganti <YOUR-HOSTNAME> dengan nama node aktual Anda.

    Expand to view the attach-stress.yaml file

    ---
    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>  # Replace with the actual node name.
          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. Jalankan perintah berikut untuk memastikan aplikasi berjalan normal. Kemudian, kurangi jumlah replika menjadi 0 untuk mempersiapkan uji pemasangan batch.

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

    Output yang diharapkan:

    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. Jalankan perintah berikut untuk memulai uji pemasangan batch dan catat waktu yang dibutuhkan agar Pod mulai berjalan.

    Catatan

    Fitur pemasangan paralel belum diaktifkan untuk kluster ini. Sesuaikan jumlah replika untuk pengujian berdasarkan jumlah maksimum disk cloud yang didukung oleh node Anda.

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

    Output yang diharapkan:

    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

    Output menunjukkan bahwa tanpa pemasangan paralel yang diaktifkan, dibutuhkan lebih dari 3 menit agar ke-28 Pod tersebut mulai berjalan.

  5. Aktifkan fitur pemasangan paralel untuk kluster ini dengan mengikuti langkah-langkah di Enable the feature.

  6. Jalankan perintah berikut untuk membersihkan Pod yang telah dibuat sebelumnya dan mempersiapkan pengujian berikutnya.

    Catatan

    Selama pembersihan, pantau sumber daya volumeattachments di kluster. Disk cloud dilepas setelah sumber daya ini dihapus. Proses ini membutuhkan beberapa menit.

    kubectl scale sts attach-stress --replicas 0
  7. Jalankan kembali perintah uji untuk mencatat waktu startup Pod dengan pemasangan paralel yang diaktifkan. Waktu startup diperkirakan sekitar 40 detik, peningkatan signifikan dibandingkan 3 menit sebelumnya.

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

    Output yang diharapkan:

    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. Jalankan perintah berikut untuk menghapus aplikasi uji dari kluster.

    kubectl delete -f attach-stress.yaml