全部产品
Search
文档中心

Container Service for Kubernetes:Bekerja dengan penjadwalan kapasitas

更新时间:Jul 06, 2025

Mekanisme alokasi sumber daya statis dari ResourceQuota Kubernetes asli dapat menyebabkan rendahnya pemanfaatan sumber daya dalam kluster. Untuk mengatasi masalah ini, Container Service for Kubernetes (ACK) menyediakan fitur penjadwalan kapasitas berdasarkan mekanisme ekstensi kerangka penjadwalan. Fitur ini menggunakan grup kuota elastis untuk mendukung berbagi sumber daya sambil memastikan kuota sumber daya bagi pengguna, yang secara efektif meningkatkan pemanfaatan sumber daya kluster.

Prasyarat

Sebuah kluster ACK managed Pro yang menjalankan Kubernetes 1.20 atau lebih baru telah dibuat. Untuk meningkatkan kluster, lihat Buat Kluster ACK Managed.

Fitur utama

Dalam lingkungan kluster multi-pengguna, administrator mengalokasikan sumber daya tetap untuk memastikan cukup sumber daya bagi pengguna yang berbeda. Mode tradisional menggunakan ResourceQuota Kubernetes asli untuk alokasi sumber daya statis. Namun, karena perbedaan waktu dan pola penggunaan sumber daya di antara pengguna, beberapa pengguna mungkin mengalami kendala sumber daya sementara yang lain memiliki kuota idle. Hal ini mengakibatkan rendahnya pemanfaatan sumber daya secara keseluruhan.

Untuk menyelesaikan masalah ini, ACK mendukung fitur penjadwalan kapasitas di sisi penjadwalan berdasarkan mekanisme ekstensi kerangka penjadwalan. Fitur ini meningkatkan pemanfaatan sumber daya secara keseluruhan melalui berbagi sumber daya dan memastikan alokasi sumber daya bagi pengguna. Berikut adalah fitur spesifik dari penjadwalan kapasitas:

  • Dukungan untuk mendefinisikan kuota sumber daya pada tingkat yang berbeda: Konfigurasikan beberapa tingkat kuota elastis sesuai kebutuhan bisnis, seperti bagan organisasi perusahaan. Node daun dari grup kuota elastis dapat sesuai dengan beberapa namespace, tetapi setiap namespace hanya dapat termasuk dalam satu node daun.37

  • Dukungan untuk peminjaman dan pengembalian sumber daya antar kuota elastis yang berbeda.

    • Min: Menentukan sumber daya terjamin yang dapat digunakan. Jika sumber daya kluster menjadi tidak mencukupi, total jumlah sumber daya minimum untuk semua pengguna harus lebih rendah dari total jumlah sumber daya kluster.

    • Max: Menentukan jumlah maksimum sumber daya yang dapat digunakan.39

      Workload dapat meminjam kuota sumber daya idle dari pengguna lain, tetapi total jumlah sumber daya yang dapat digunakan setelah meminjam masih tidak melebihi nilai Max. Kuota sumber daya Min yang tidak digunakan dapat dipinjam, tetapi dapat dikembalikan ketika pengguna aslinya membutuhkan penggunaannya.

  • Dukungan untuk mengonfigurasi berbagai sumber daya: Selain sumber daya CPU dan memori, juga mendukung konfigurasi sumber daya tambahan seperti GPU dan sumber daya lain yang didukung oleh Kubernetes.

  • Dukungan untuk melampirkan kuota ke node: Gunakan ResourceFlavor untuk memilih node dan mengaitkan ResourceFlavor dengan kuota dalam ElasticQuotaTree. Setelah dikaitkan, pod dalam kuota elastis hanya dapat dijadwalkan ke node yang dipilih oleh ResourceFlavor.

Contoh konfigurasi penjadwalan kapasitas

Dalam contoh kluster ini, nodenya adalah mesin ecs.sn2.13xlarge dengan 56 vCPU dan 224 GiB memori.

  1. Buat namespace berikut.

    kubectl create ns namespace1
    kubectl create ns namespace2
    kubectl create ns namespace3
    kubectl create ns namespace4
  2. Buat grup kuota elastis yang sesuai berdasarkan file YAML berikut:

    Lihat File YAML

    apiVersion: scheduling.sigs.k8s.io/v1beta1
    kind: ElasticQuotaTree
    metadata:
      name: elasticquotatree
      namespace: kube-system # Grup kuota elastis hanya berlaku jika dibuat di namespace kube-system.
    spec:
      root:
        name: root # Konfigurasikan kuota sumber daya root. Jumlah maksimum sumber daya untuk root harus sama dengan jumlah minimum sumber daya untuk root.
        max:
          cpu: 40
          memory: 40Gi
          nvidia.com/gpu: 4
        min:
          cpu: 40
          memory: 40Gi
          nvidia.com/gpu: 4
        children: # Konfigurasikan kuota sumber daya untuk daun level-2 dari root.
          - name: root.a
            max:
              cpu: 40
              memory: 40Gi
              nvidia.com/gpu: 4
            min:
              cpu: 20
              memory: 20Gi
              nvidia.com/gpu: 2
            children: # Konfigurasikan kuota sumber daya untuk daun level-3 dari root.
              - name: root.a.1
                namespaces: # Konfigurasikan namespace.
                  - namespace1
                max:
                  cpu: 20
                  memory: 20Gi
                  nvidia.com/gpu: 2
                min:
                  cpu: 10
                  memory: 10Gi
                  nvidia.com/gpu: 1
              - name: root.a.2
                namespaces: # Konfigurasikan namespace.
                  - namespace2
                max:
                  cpu: 20
                  memory: 40Gi
                  nvidia.com/gpu: 2
                min:
                  cpu: 10
                  memory: 10Gi
                  nvidia.com/gpu: 1
          - name: root.b
            max:
              cpu: 40
              memory: 40Gi
              nvidia.com/gpu: 4
            min:
              cpu: 20
              memory: 20Gi
              nvidia.com/gpu: 2
            children: # Konfigurasikan kuota sumber daya untuk daun level-3 dari root.
              - name: root.b.1
                namespaces: # Konfigurasikan namespace.
                  - namespace3
                max:
                  cpu: 20
                  memory: 20Gi
                  nvidia.com/gpu: 2
                min:
                  cpu: 10
                  memory: 10Gi
                  nvidia.com/gpu: 1
              - name: root.b.2
                namespaces: # Konfigurasikan namespace.
                  - namespace4
                max:
                  cpu: 20
                  memory: 20Gi
                  nvidia.com/gpu: 2
                min:
                  cpu: 10
                  memory: 10Gi
                  nvidia.com/gpu: 1

    Sesuai dengan file YAML di atas, konfigurasikan namespace yang sesuai di bidang namespaces dan konfigurasikan kuota elastis anak yang sesuai di bidang children. Persyaratan berikut harus dipenuhi:

    • Dalam kuota elastis yang sama, Min ≤ Max.

    • Jumlah total nilai Min dari kuota elastis anak harus kurang dari atau sama dengan nilai Min dari kuota induk.

    • Min dari node root sama dengan Max dan kurang dari atau sama dengan total sumber daya kluster.

    • Setiap namespace termasuk dalam satu daun. Sebuah daun dapat berisi beberapa namespace.

  3. Periksa apakah grup kuota elastis berhasil dibuat.

    kubectl get ElasticQuotaTree -n kube-system

    Keluaran yang Diharapkan:

    NAME               AGE
    elasticquotatree   68s

Meminjam sumber daya idle

  1. Deploy layanan di namespace1 sesuai dengan file YAML berikut. Jumlah replika untuk pod adalah 5, dan setiap pod meminta 5 vCPU.

    Lihat File YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx1
      namespace: namespace1
      labels:
        app: nginx1
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx1
      template:
        metadata:
          name: nginx1
          labels:
            app: nginx1
        spec:
          containers:
          - name: nginx1
            image: nginx
            resources:
              limits:
                cpu: 5
              requests:
                cpu: 5
  2. Periksa status deployment pod di kluster.

    kubectl get pods -n namespace1

    Keluaran yang Diharapkan:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx1-744b889544-52dbg   1/1     Running   0          70s
    nginx1-744b889544-6l4s9   1/1     Running   0          70s
    nginx1-744b889544-cgzlr   1/1     Running   0          70s
    nginx1-744b889544-w2gr7   1/1     Running   0          70s
    nginx1-744b889544-zr5xz   0/1     Pending   0          70s
    • Karena ada sumber daya idle dalam kluster saat ini (root.max.cpu=40), ketika sumber daya CPU yang diminta oleh pod di namespace1 melebihi 10 (min.cpu=10), yang dikonfigurasikan oleh root.a.1, pod tersebut dapat terus meminjam sumber daya idle lainnya. Sumber daya CPU maksimum yang dapat mereka minta adalah 20 (max.cpu=20), yang dikonfigurasikan oleh root.a.1.

    • Ketika jumlah sumber daya CPU yang diminta oleh pod melebihi 20 (max.cpu=20), pod tambahan yang meminta sumber daya akan berada dalam status Pending. Oleh karena itu, dari 5 pod yang diminta, 4 berada dalam status Running dan 1 dalam status Pending.

  3. Deploy layanan di namespace2 sesuai dengan file YAML berikut. Jumlah replika untuk pod adalah 5, dan setiap pod meminta 5 vCPU.

    Lihat File YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx2
      namespace: namespace2
      labels:
        app: nginx2
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx2
      template:
        metadata:
          name: nginx2
          labels:
            app: nginx2
        spec:
          containers:
          - name: nginx2
            image: nginx
            resources:
              limits:
                cpu: 5
              requests:
                cpu: 5
  4. Periksa status deployment pod di kluster.

    kubectl get pods -n namespace1

    Keluaran yang Diharapkan:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx1-744b889544-52dbg   1/1     Running   0          111s
    nginx1-744b889544-6l4s9   1/1     Running   0          111s
    nginx1-744b889544-cgzlr   1/1     Running   0          111s
    nginx1-744b889544-w2gr7   1/1     Running   0          111s
    nginx1-744b889544-zr5xz   0/1     Pending   0          111s
    kubectl get pods -n namespace2

    Keluaran yang Diharapkan:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx2-556f95449f-4gl8s   1/1     Running   0          111s
    nginx2-556f95449f-crwk4   1/1     Running   0          111s
    nginx2-556f95449f-gg6q2   0/1     Pending   0          111s
    nginx2-556f95449f-pnz5k   1/1     Running   0          111s
    nginx2-556f95449f-vjpmq   1/1     Running   0          111s
    • Menyerupai nginx1. Karena ada sumber daya idle dalam kluster saat ini (root.max.cpu=40), ketika sumber daya CPU yang diminta oleh pod di namespace2 melebihi 10 (min.cpu=10), yang dikonfigurasikan oleh root.a.2, pod tersebut dapat terus meminjam sumber daya idle lainnya. Sumber daya CPU maksimum yang dapat mereka minta adalah 20 (max.cpu=20), yang dikonfigurasikan oleh root.a.2.

    • Ketika jumlah sumber daya CPU yang diminta oleh pod melebihi 20 (max.cpu=20), pod tambahan yang meminta sumber daya akan berada dalam status Pending. Oleh karena itu, dari 5 pod yang diminta, 4 berada dalam status Running dan 1 dalam status Pending.

    • Pada titik ini, sumber daya yang ditempati oleh pod di namespace1 dan namespace2 dalam kluster telah mencapai 40 (root.max.cpu=40), yang dikonfigurasikan oleh root.

Mengembalikan sumber daya yang dipinjam

  1. Deploy layanan di namespace3 sesuai dengan file YAML berikut. Jumlah replika untuk pod adalah 5, dan setiap pod meminta 5 vCPU.

    Lihat File YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx3
      namespace: namespace3
      labels:
        app: nginx3
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx3
      template:
        metadata:
          name: nginx3
          labels:
            app: nginx3
        spec:
          containers:
          - name: nginx3
            image: nginx
            resources:
              limits:
                cpu: 5
              requests:
                cpu: 5
  2. Jalankan perintah berikut untuk memeriksa status deployment pod di kluster:

    kubectl get pods -n namespace1

    Keluaran yang Diharapkan:

    NAME                      READY   STATUS    RESTARTS   AGE
    nginx1-744b889544-52dbg   1/1     Running   0          6m17s
    nginx1-744b889544-cgzlr   1/1     Running   0          6m17s
    nginx1-744b889544-nknns   0/1     Pending   0          3m45s
    nginx1-744b889544-w2gr7   1/1     Running   0          6m17s
    nginx1-744b889544-zr5xz   0/1     Pending   0          6m17s
    kubectl get pods -n namespace2

    Keluaran yang Diharapkan:

    NAME                      READY   STATUS    RESTARTS   AGE
    nginx2-556f95449f-crwk4   1/1     Running   0          4m22s
    nginx2-556f95449f-ft42z   1/1     Running   0          4m22s
    nginx2-556f95449f-gg6q2   0/1     Pending   0          4m22s
    nginx2-556f95449f-hfr2g   1/1     Running   0          3m29s
    nginx2-556f95449f-pvgrl   0/1     Pending   0          3m29s
    kubectl get pods -n namespace3

    Keluaran yang Diharapkan:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx3-578877666-msd7f   1/1     Running   0          4m
    nginx3-578877666-nfdwv   0/1     Pending   0          4m10s
    nginx3-578877666-psszr   0/1     Pending   0          4m11s
    nginx3-578877666-xfsss   1/1     Running   0          4m22s
    nginx3-578877666-xpl2p   0/1     Pending   0          4m10s

    Parameter min dari kuota elastis root.b.1 untuk nginx3 disetel ke 10. Untuk memastikan bahwa sumber daya min yang dikonfigurasikan tersedia, penjadwal akan mengembalikan sumber daya pod yang sebelumnya dipinjam dari root.b di bawah root.a. Ini memungkinkan nginx3 mendapatkan setidaknya 10 (min.cpu=10) core CPU untuk memastikan operasi.

    Penjadwal akan mempertimbangkan secara komprehensif faktor-faktor seperti prioritas, ketersediaan, dan waktu pembuatan pekerjaan di bawah root.a, dan memilih pod yang sesuai untuk mengembalikan sumber daya yang sebelumnya ditempati (10 vCPU). Oleh karena itu, setelah nginx3 mendapatkan 10 (min.cpu=10) core CPU, 2 pod berada dalam status Running, dan 3 lainnya tetap dalam status Pending.

  3. Deploy layanan nginx4 di namespace4 sesuai dengan file YAML berikut. Jumlah replika untuk pod adalah 5, dan setiap pod meminta 5 core CPU.

    Lihat File YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx4
      namespace: namespace4
      labels:
        app: nginx4
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: nginx4
      template:
        metadata:
          name: nginx4
          labels:
            app: nginx4
        spec:
          containers:
          - name: nginx4
            image: nginx
            resources:
              limits:
                cpu: 5
              requests:
                cpu: 5
  4. Jalankan perintah berikut untuk memeriksa status deployment pod di kluster:

    kubectl get pods -n namespace1

    Keluaran yang Diharapkan:

    NAME                      READY   STATUS    RESTARTS   AGE
    nginx1-744b889544-cgzlr   1/1     Running   0          8m20s
    nginx1-744b889544-cwx8l   0/1     Pending   0          55s
    nginx1-744b889544-gjkx2   0/1     Pending   0          55s
    nginx1-744b889544-nknns   0/1     Pending   0          5m48s
    nginx1-744b889544-zr5xz   1/1     Running   0          8m20s
    kubectl get pods -n namespace2

    Keluaran yang Diharapkan:

    NAME                      READY   STATUS    RESTARTS   AGE
    nginx2-556f95449f-cglpv   0/1     Pending   0          3m45s
    nginx2-556f95449f-crwk4   1/1     Running   0          9m31s
    nginx2-556f95449f-gg6q2   1/1     Running   0          9m31s
    nginx2-556f95449f-pvgrl   0/1     Pending   0          8m38s
    nginx2-556f95449f-zv8wn   0/1     Pending   0          3m45s
    kubectl get pods -n namespace3

    Keluaran yang Diharapkan:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx3-578877666-msd7f   1/1     Running   0          8m46s
    nginx3-578877666-nfdwv   0/1     Pending   0          8m56s
    nginx3-578877666-psszr   0/1     Pending   0          8m57s
    nginx3-578877666-xfsss   1/1     Running   0          9m8s
    nginx3-578877666-xpl2p   0/1     Pending   0          8m56s
    kubectl get pods -n namespace4

    Keluaran yang Diharapkan:

    nginx4-754b767f45-g9954   1/1     Running   0          4m32s
    nginx4-754b767f45-j4v7v   0/1     Pending   0          4m32s
    nginx4-754b767f45-jk2t7   0/1     Pending   0          4m32s
    nginx4-754b767f45-nhzpf   0/1     Pending   0          4m32s
    nginx4-754b767f45-tv5jj   1/1     Running   0          4m32s

    Parameter min dari kuota elastis root.b.2 untuk nginx4 disetel ke 10. Untuk memastikan bahwa sumber daya min yang dikonfigurasikan tersedia, penjadwal akan mengembalikan sumber daya pod yang sebelumnya dipinjam dari root.b di bawah root.a. Ini memungkinkan nginx4 mendapatkan setidaknya 10 (min.cpu=10) core CPU untuk memastikan operasi.

    Penjadwal akan mempertimbangkan secara komprehensif faktor-faktor seperti prioritas, ketersediaan, dan waktu pembuatan pekerjaan di bawah root.a, dan memilih pod yang sesuai untuk mengembalikan sumber daya yang sebelumnya ditempati (10 vCPU). Oleh karena itu, setelah nginx4 mendapatkan 10 (min.cpu=10) core CPU, 2 pod berada dalam status Running, dan 3 lainnya tetap dalam status Pending.

    Pada titik ini, semua kuota elastis dalam kluster menggunakan sumber daya terjamin mereka yang ditetapkan oleh min.

Contoh konfigurasi ResourceFlavor

Prasyarat

  • ResourceFlavor diinstal dengan merujuk pada ResourceFlavorCRD (ACK Scheduler tidak menginstalnya secara default).

    Hanya bidang nodeLabels yang efektif dalam sumber daya ResourceFlavor.

  • Versi penjadwal lebih tinggi dari 6.9.0. Untuk informasi lebih lanjut tentang catatan rilis komponen, lihat kube-scheduler. Untuk informasi lebih lanjut tentang entri pembaruan komponen, lihat Komponen.

ResourceFlavor, sebagai Kubernetes CustomResourceDefinition (CRD), membentuk hubungan pengikatan antara kuota elastis dan node dengan mendefinisikan label node (NodeLabels). Ketika dikaitkan dengan kuota elastis tertentu, pod di bawah kuota tersebut tidak hanya dibatasi oleh jumlah total sumber daya kuota tetapi juga hanya dapat dijadwalkan ke node yang sesuai dengan NodeLabels.

Contoh ResourceFlavor

Sebuah contoh ResourceFlavor adalah sebagai berikut:

apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
  name: "spot"
spec:
  nodeLabels:
    instance-type: spot

Contoh mengaitkan kuota elastis

Untuk mengaitkan kuota elastis dengan ResourceFlavor, Anda harus mendeklarasikannya di ElasticQuotaTree menggunakan bidang attributes. Kode berikut menunjukkan sebuah contoh:

apiVersion: scheduling.sigs.k8s.io/v1beta1
kind: ElasticQuotaTree
metadata:
  name: elasticquotatree
  namespace: kube-system
spec:
  root:
    children:
    - attributes:
        resourceflavors: spot
      max:
        cpu: 99
        memory: 40Gi
        nvidia.com/gpu: 10
      min:
        cpu: 99
        memory: 40Gi
        nvidia.com/gpu: 10
      name: child
      namespaces:
      - default
    max:
      cpu: 999900
      memory: 400000Gi
      nvidia.com/gpu: 100000
    min:
      cpu: 999900
      memory: 400000Gi
      nvidia.com/gpu: 100000
    name: root

Setelah dikirimkan, pod yang termasuk dalam Quota child hanya akan dijadwalkan ke node dengan label instance-type: spot.

Referensi

  • Untuk informasi lebih lanjut tentang catatan rilis kube-scheduler, lihat kube-scheduler.

  • kube-scheduler mendukung penjadwalan gang, yang mengharuskan kelompok pod terkait harus berhasil dijadwalkan secara bersamaan. Jika tidak, tidak ada satupun dari mereka yang akan dijadwalkan. kube-scheduler cocok untuk skenario tugas pemrosesan data besar, seperti Spark dan Hadoop. Untuk informasi lebih lanjut, lihat Bekerja dengan Penjadwalan Gang.