全部产品
Search
文档中心

Container Service for Kubernetes:Optimalkan penjadwalan dengan menggunakan ack-descheduler (pemeliharaan dihentikan)

更新时间:Jul 02, 2025

Anda dapat menggunakan ack-descheduler untuk mengoptimalkan penjadwalan pod yang tidak sesuai dengan node. Ini membantu menghindari pemborosan sumber daya dan meningkatkan pemanfaatan sumber daya dalam kluster Container Service for Kubernetes (ACK). Topik ini menjelaskan cara menggunakan ack-descheduler untuk mengoptimalkan penjadwalan pod.

Penting

ack-descheduler telah dihentikan. Lihat [Pemberitahuan Komponen] migrasi ack-descheduler untuk detail lebih lanjut. Kami menyarankan Anda bermigrasi dari ack-descheduler ke Koordinator Descheduler.

Prasyarat

Instal ack-descheduler

  1. Masuk ke Konsol ACK.

  2. Di panel navigasi kiri Konsol ACK, pilih Marketplace > App Catalog.

  3. Di halaman Marketplace, klik tab App Catalog. Temukan dan klik ack-descheduler.

  4. Di halaman ack-descheduler, klik Deploy.

  5. Di wizard Deploy, pilih kluster dan namespace, lalu klik Next.

  6. Di halaman wizard Parameters, konfigurasikan parameter dan klik OK.

    Setelah ack-descheduler diinstal, CronJob secara otomatis dibuat di namespace kube-system. Secara default, CronJob ini berjalan setiap 2 menit. Setelah instalasi selesai, Anda akan diarahkan ke halaman ack-descheduler-default. Jika semua sumber daya terkait telah dibuat, seperti yang ditunjukkan pada gambar berikut, komponen tersebut telah berhasil diinstal.ack-descheduler.png

Gunakan ack-descheduler untuk mengoptimalkan penjadwalan pod

  1. Jalankan perintah berikut untuk memeriksa pengaturan DeschedulerPolicy dari ConfigMap ack-descheduler-default.

    kubectl describe cm ack-descheduler-default -n kube-system

    Output yang diharapkan:

    Klik untuk melihat detail

    Name:         descheduler
    Namespace:    kube-system
    Labels:       app.kubernetes.io/instance=descheduler
                  app.kubernetes.io/managed-by=Helm
                  app.kuberne
    
    
    tes.io/name=descheduler
                  app.kubernetes.io/version=0.20.0
                  helm.sh/chart=descheduler-0.20.0
    Annotations:  meta.helm.sh/release-name: descheduler
                  meta.helm.sh/release-namespace: kube-system
    Data
    ====
    policy.yaml:
    ----
    apiVersion: "descheduler/v1alpha1"
    kind: "DeschedulerPolicy"
    strategies:
      "RemoveDuplicates":  
         enabled: true
      "RemovePodsViolatingInterPodAntiAffinity": 
         enabled: true
      "LowNodeUtilization": 
         enabled: true
         params:
           nodeResourceUtilizationThresholds:
             thresholds:
               "cpu" : 20
               "memory": 20
               "pods": 20
             targetThresholds:
               "cpu" : 50
               "memory": 50
               "pods": 50
      "RemovePodsHavingTooManyRestarts":
         enabled: true
         params:
           podsHavingTooManyRestarts:
             podRestartThreshold: 100
             includingInitContainers: true
    Events:  <none>

    Tabel berikut menjelaskan kebijakan penjadwalan yang dikembalikan dalam output sebelumnya. Untuk informasi lebih lanjut tentang pengaturan kebijakan di bagian strategies, lihat Descheduler.

    Kebijakan

    Deskripsi

    RemoveDuplicates

    Kebijakan ini menghapus pod duplikat dan memastikan hanya satu pod yang terkait dengan ReplicaSet, ReplicationController, StatefulSet, atau Job yang berjalan di node yang sama.

    RemovePodsViolatingInterPodAntiAffinity

    Kebijakan ini menghapus pod yang melanggar aturan anti-affinitas antar-pod.

    LowNodeUtilization

    Kebijakan ini menemukan node yang kurang dimanfaatkan, mengeluarkan pod dari node lain, dan menciptakan ulang pod di node yang kurang dimanfaatkan. Parameter kebijakan ini dikonfigurasi di bagian nodeResourceUtilizationThresholds.

    RemovePodsHavingTooManyRestarts

    Kebijakan ini menghapus pod yang telah di-restart sejumlah kali tertentu.

  2. Verifikasi penjadwalan pod sebelum kebijakan penjadwalan dimodifikasi.

    1. Buat Deployment untuk menguji penjadwalan.

      Buat file nginx.yaml dan salin konten berikut ke file tersebut:

      apiVersion: apps/v1 # untuk versi sebelum 1.8.0 gunakan apps/v1beta1
      kind: Deployment
      metadata:
        name: nginx-deployment-basic
        labels:
          app: nginx
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx:1.7.9 # Ganti dengan gambar yang ingin Anda gunakan. Nilainya harus dalam format <image_name:tags>. 
              ports:
              - containerPort: 80

      Jalankan perintah berikut untuk membuat Deployment dengan file nginx.yaml:

      kubectl apply -f nginx.yaml

      Output yang diharapkan:

      deployment.apps/nginx-deployment-basic created
    2. Tunggu 2 menit dan jalankan perintah berikut untuk memeriksa node tempat pod dijadwalkan:

      kubectl get pod -o wide | grep nginx

      Output yang diharapkan:

      NAME                          READY   STATUS     RESTARTS   AGE    IP               NODE                         NOMINATED NODE   READINESS GATES
      nginx-deployment-basic-**1    1/1     Running    0          36s    172.25.XXX.XX1   cn-hangzhou.172.16.XXX.XX2   <none>           <none>
      nginx-deployment-basic-**2    1/1     Running    0          11s    172.25.XXX.XX2   cn-hangzhou.172.16.XXX.XX3   <none>           <none>
      nginx-deployment-basic-**3    1/1     Running    0          36s    172.25.XXX.XX3   cn-hangzhou.172.16.XXX.XX3   <none>           <none>

      Output menunjukkan bahwa pod nginx-deployment-basic-**2 dan pod nginx-deployment-basic-**3 dijadwalkan ke node yang sama cn-hangzhou.172.16.XXX.XX3.

      Catatan

      Jika Anda menggunakan pengaturan default untuk ConfigMap ack-descheduler-default, hasil penjadwalan bervariasi berdasarkan kondisi aktual kluster.

  3. Modifikasi kebijakan penjadwalan.

    Jika Anda menggunakan beberapa kebijakan penjadwalan, hasil penjadwalan yang tidak diinginkan mungkin diperoleh. Untuk mencegah masalah ini, modifikasi ConfigMap di Langkah 1 untuk menyimpan hanya kebijakan RemoveDuplicates.

    Catatan

    Kebijakan RemoveDuplicates memastikan bahwa pod yang dikelola oleh pengontrol replikasi didistribusikan secara merata ke node yang berbeda.

    Dalam contoh ini, nama ConfigMap diubah menjadi newPolicy.yaml setelah dimodifikasi. ConfigMap yang dimodifikasi berisi konten berikut:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: descheduler
      namespace: kube-system
      labels:
        app.kubernetes.io/instance: descheduler
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: descheduler
        app.kubernetes.io/version: 0.20.0
        helm.sh/chart: descheduler-0.20.0  
      annotations:
        meta.helm.sh/release-name: descheduler
        meta.helm.sh/release-namespace: kube-system
    data: 
      policy.yaml: |-
        apiVersion: "descheduler/v1alpha1"
        kind: "DeschedulerPolicy"
        strategies:
          "RemoveDuplicates": # Simpan hanya kebijakan RemoveDuplicates. 
             enabled: true
  4. Verifikasi penjadwalan pod setelah kebijakan penjadwalan dimodifikasi.

    1. Jalankan perintah berikut untuk menerapkan kebijakan penjadwalan baru:

      kubectl apply -f newPolicy.yaml

      Output yang diharapkan:

      configmap/descheduler created
    2. Tunggu 2 menit dan jalankan perintah berikut untuk memeriksa node tempat pod dijadwalkan:

      kubectl get pod -o wide | grep nginx

      Output yang diharapkan:

      NAME                          READY   STATUS     RESTARTS   AGE      IP               NODE                         NOMINATED NODE   READINESS GATES
      nginx-deployment-basic-**1    1/1     Running    0          8m26s    172.25.XXX.XX1   cn-hangzhou.172.16.XXX.XX2   <none>           <none>
      nginx-deployment-basic-**2    1/1     Running    0          8m1s     172.25.XXX.XX2   cn-hangzhou.172.16.XXX.XX1   <none>           <none>
      nginx-deployment-basic-**3    1/1     Running    0          8m26s    172.25.XXX.XX3   cn-hangzhou.172.16.XXX.XX3   <none>           <none>

      Output menunjukkan bahwa pod nginx-deployment-basic-**2 dijadwalkan ulang ke cn-hangzhou.172.16.XXX.XX1 oleh ack-descheduler. Dalam kasus ini, masing-masing dari tiga pod uji dijadwalkan ke node yang berbeda. Ini menyeimbangkan penjadwalan pod di antara beberapa node.