Tüm Ürünler
Search
Belge Merkezi

Container Service for Kubernetes:Enable disk parallel mounting to accelerate pod startups

Son Güncelleme:Oct 06, 2026

Bir düğüm üzerinde çok sayıda pod çalıştığında ve her podun birden fazla disk gerektirdiğinde — bu durum veritabanı, sürekli entegrasyon (CI) ve toplu iş yüklerinde yaygındır — varsayılan seri bağlama işlemi pod başlatma süresini uzatır. Disk paralel bağlama, diskleri eş zamanlı olarak bağlayarak başlatma gecikme süresini azaltır.

Ön koşullar

Kullanım notları

  • Paralel bağlama yalnızca seri numarası olan diskler için desteklenir. Bir diskin seri numarasını sorgulama hakkında daha fazla bilgi için Seri numarası sorgula konusuna bakın.

    10 Haziran 2020 tarihinden önce oluşturulan disklerin tanınabilir seri numaraları yoktur. Bu diskler için paralel bağlamayı etkinleştirirseniz diskler bağlanamaz.

  • Aynı düğümden birden fazla disk çıkarıldığında, çıkarma işlemleri yine seri modda çalışır.

  • Paralel bağlamayı etkinleştirdikten sonra, ECS DescribeDisks gibi API'lerden döndürülen Device alanları ve konsolda görüntülenen bağlama hedefi yanlış olabilir. İş yüklerinizde bu bağlama yoluna güvenmeyin. Gerçek bağlama yolunu belirlemek için diskin seri numarasını kullanın.

Yordam

Disk paralel bağlamayı etkinleştirmek için aşağıdaki otomatik betiği veya manuel yordamı kullanabilirsiniz.

Otomatik betik kullanın

  1. Aşağıdaki betiği enable_parallel_attach.sh adlı bir dosya olarak kaydedin.

    Betiği görüntüle

    #!/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. Diskleri paralel modda bağlamak için betiği çalıştırın.

    bash enable_parallel_attach.sh <Cluster ID>

Özelliği manuel olarak etkinleştirin

  1. Kümenin düğüm havuzuna ECS Tags ekleyin. Etiket anahtarını supportConcurrencyAttach olarak, etiket değerini ise true olarak ayarlayın. Etiketin yeni bir ECS örneğine eklendiğinden emin olun.

    1. ACK konsolu üzerinde oturum açın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.

    2. Clusters sayfasında kümenizin adına tıklayın. Sol gezinme bölmesinde Nodes > Node Pools seçeneğine tıklayın.

    3. Node Pools sayfasında, değiştirmek istediğiniz düğüm havuzunu bulun ve Actions sütunundaki Edit seçeneğine tıklayın.

    4. Sayfanın alt kısmında Advanced bölümünü bulun ve bir ECS Tags ekleyin. Anahtarı supportConcurrencyAttach olarak, değeri ise true olarak ayarlayın.

  2. Kümedeki mevcut tüm düğümlerin ECS örneklerine bir etiket ekleyin. Anahtarı supportConcurrencyAttach olarak, değeri ise true olarak ayarlayın. Daha fazla bilgi için Özel etiket ekle konusuna bakın.

  3. Sol gezinme bölmesinde Components and Add-ons seçeneğine tıklayın. Storage sekmesine tıklayın, csi-provisioner eklentisini bulun, bileşenin sağ alt köşesindeki Configuration seçeneğine tıklayın ve FeatureGate parametresini DiskADController=true,DiskParallelAttach=true olarak ayarlayın.

    Not

    DiskADController=true belirttikten sonra, disklerle ilgili attach ve detach işlemleri csi-provisioner tarafından yürütülür. DiskParallelAttach=true belirttikten sonra disk paralel bağlama özelliği etkinleşir.

  4. csi-provisioner'ı yapılandırdıktan sonra, csi-plugin'in FeatureGate parametresini DiskADController=true olarak ayarlayın.

Disk paralel bağlama performansını doğrulayın

Bu örnekte, paralel bağlama etkinleştirildikten sonra pod başlatma hızlanmasını doğrulamak amacıyla aynı düğüm üzerinde çok sayıda disk bağlanmış pod'lar oluşturulur.

Önemli

Bu konudaki test sonuçları referans değerlerdir. Gerçek sonuçlar ortamınıza bağlı olarak değişiklik gösterebilir.

  1. Birden fazla diski destekleyen bir düğümü ACK kümesine ekleyin. Örneğin, ecs.g7se.16xlarge örneği en fazla 56 diski destekler.

  2. attach-stress.yaml adlı bir test dosyası oluşturun ve aşağıdaki içeriği dosyaya kopyalayın. <YOUR-HOSTNAME> ifadesini düğümün gerçek adıyla değiştirin.

    attach-stress.yaml dosyasını görüntüle

    ---
    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 this parameter with the actual name of the node. 
          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. Uygulamanın beklendiği gibi başladığını onaylamak için aşağıdaki komutu çalıştırın. Ardından, toplu bağlama testlerine hazırlanmak için çoğaltma sayısını 0'a ölçeklendirin.

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

    Beklenen çıktı:

    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. Toplu bağlama testini başlatmak ve pod başlatma süresini ölçmek için aşağıdaki komutları çalıştırın:

    Not

    Bu durumda, küme için paralel bağlama devre dışıdır. Test için pod sayısını, düğümünüzün desteklediği maksimum disk sayısına göre ayarlayın.

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

    Beklenen çıktı:

    Tuesday October 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...
    <Omitted...>
    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...
    Tuesday October 15 19:24:55 CST 2024

    Çıktı, paralel bağlama devre dışı olduğunda 28 pod'un tamamının başlatılmasının 3 dakikadan fazla sürdüğünü göstermektedir.

  5. Yordam bölümündeki talimatları izleyerek paralel bağlamayı etkinleştirin.

  6. Önceki pod'ları silmek ve sonraki test turuna hazırlanmak için aşağıdaki komutu çalıştırın:

    Not

    Kümedeki volumeattachments kaynaklarını izleyin. Bu kaynaklar silindikten sonra diskler çıkarılır. Bu işlem birkaç dakika sürer.

    kubectl scale sts attach-stress --replicas 0
  7. Paralel bağlama etkinleştirildikten sonra pod'ların başlatılması için gereken süreyi hesaplamak üzere aşağıdaki komutu tekrar çalıştırın. Beklenen süre yaklaşık 40 saniyedir; bu, paralel bağlama devre dışı olduğundaki 3 dakikalık süreden çok daha hızlıdır.

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

    Beklenen çıktı:

    Tuesday October 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...
    <Omitted...>
    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...
    Tuesday October 15 20:03:31 CST 2024
  1. Kümedeki test uygulamalarını silmek için aşağıdaki komutu çalıştırın:

    kubectl delete -f attach-stress.yaml