Tüm Ürünler
Search
Belge Merkezi

Container Service for Kubernetes:Dynamic distribution and descheduling

Son Güncelleme:Oct 06, 2026

Küme kaynaklarının kullanılabilirliği zamanla değişir. Zamanlayıcı yerleştirme kararlarını küme kaynaklarının o anki anlık görüntüsüne dayandırdığından, başarıyla zamanlanan çoğaltmalar düğümler arızalandığında veya kaynaklar tükendiğinde daha sonra zamanlanamaz hale gelebilir. ACK One Fleet bunu varsayılan olarak otomatik yönetir: Dağıtım (Deployment), StatefulSet ve Job çoğaltmalarını ilişkili kümeler arasında PropagationPolicy kullanarak dağıtır, her 2 dakikada bir zamanlanamayan çoğaltmaları kontrol eder ve herhangi bir çoğaltma 30 saniyeden uzun süre zamanlanamaz durumda kalırsa zamanlamadan çıkarmayı tetikler.

Ön koşullar

Başlamadan önce aşağıdakileri yaptığınızdan emin olun:

Adım 1: Fleet içinde bir uygulama oluşturun

  1. Aşağıdaki içeriğe sahip web-demo.yaml adlı bir dosya oluşturun:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-demo
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: web-demo
      template:
        metadata:
          labels:
            app: web-demo
        spec:
          containers:
          - name: nginx
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/web-demo:0.5.0
            ports:
            - containerPort: 80
  2. Uygulamayı dağıtın:

    kubectl apply -f web-demo.yaml

Adım 2: Bir dağıtım ilkesi oluşturun

  1. Dinamik ağırlık tabanlı bir distribution policy oluşturun. dynamicWeight: AvailableReplicas ayarı, Fleet'in her ilişkili kümedeki tüm düğümlerdeki mevcut kaynaklara göre çoğaltma tahsis oranlarını otomatik olarak ayarlamasını sağlar.

    apiVersion: policy.one.alibabacloud.com/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: web-demo
    spec:
      resourceSelectors:
      - apiVersion: apps/v1
        kind: Deployment
        name: web-demo
      placement:
        clusterAffinity:
          clusterNames:
          - ${cluster1-id} # Your cluster ID.
          - ${cluster2-id}
        replicaScheduling:
          replicaSchedulingType: Divided
          replicaDivisionPreference: Weighted
          weightPreference:
            dynamicWeight: AvailableReplicas
  2. Uygulama dağıtım durumunu kontrol edin:

    kubectl amc get deploy web-demo -M

    Beklenen çıktı aşağıdakine benzerdir (sonuçlar, her ilişkili kümedeki mevcut kaynaklara göre değişir):

    NAME       CLUSTER      READY   UP-TO-DATE   AVAILABLE   AGE   ADOPTION
    web-demo   cxxxxxxxx1   2/2     2            2           11s   Y
    web-demo   cxxxxxxxx2   3/3     3            3           11s   Y

Adım 3: Zamanlamadan çıkarmayı doğrulayın

Yetersiz kaynakların çoğaltmaların zamanlanamaz hale gelmesine neden olduğu bir senaryoyu simüle etmek için bir kümedeki tüm düğümlere taint uygulayın ve ardından iş yükünü yeniden başlatın.

  1. Cluster1'deki tüm düğümlere NoSchedule taint'ini uygulayın:

    kubectl --kubeconfig=<cluster1.config> taint nodes foo=bar:NoSchedule --all=true
  2. İş yükünü yeniden başlatın. Cluster1'deki tüm düğümlere taint uygulandığından, yeniden başlatılan pod'lar zamanlanamaz ve Pending durumuna geçer.

    kubectl --kubeconfig=<cluster1.config> rollout restart deploy web-demo
  3. Cluster1'deki pod'ların Pending durumunda olduğunu doğrulayın:

    kubectl --kubeconfig=<cluster1.config> get pods

    Pod'lar Pending olarak görünür. Bu beklenen bir durumdur; zamanlama iptal edicinin bunları algılayıp yeniden zamanlamasını bekleyin. Fleet, zamanlanamayan çoğaltmaları her 2 dakikada bir kontrol eder ve çoğaltmalar 30 saniyeden uzun süre zamanlanamaz durumda kaldığında yeniden zamanlamayı tetikler.

  4. Yaklaşık 3 dakika sonra zamanlama sonuçlarını kontrol edin:

    kubectl amc get deploy web-demo -M

    Beklenen çıktı:

    NAME       CLUSTER      READY   UP-TO-DATE   AVAILABLE   AGE   ADOPTION
    web-demo   cxxxxxxxx2   5/5     5            5           11s   Y

    Cluster1'deki tüm çoğaltmalar Cluster2'ye yeniden zamanlanmıştır.