全部产品
Search
文档中心

Container Service for Kubernetes:Penjadwalan dengan kesadaran topologi

更新时间:Jul 02, 2025

Container Service for Kubernetes (ACK) memungkinkan Anda menggunakan penjadwalan gang bersama dengan penjadwalan berbasis kesadaran topologi untuk menjadwalkan pod melalui daftar domain topologi hingga menemukan domain yang sesuai dengan persyaratan pod. Selain itu, Anda dapat mengaitkan kumpulan node di ACK dengan set penyebaran Elastic Compute Service (ECS) untuk melakukan penjadwalan afinitas dalam dimensi lebih rendah, seperti domain topologi. Dengan menjadwalkan pod ke instance ECS dalam set penyebaran yang sama, latensi jaringan antar-pod dapat dikurangi. Topik ini menjelaskan cara mengonfigurasi penjadwalan dengan kesadaran topologi.

Pengenalan Penjadwalan dengan Kesadaran Topologi

Pod yang dibuat oleh pekerjaan pembelajaran mesin atau analisis data besar sering kali perlu berkomunikasi secara intensif. Secara default, penjadwal Kubernetes mendistribusikan pod secara merata di seluruh node dalam kluster ACK. Akibatnya, pod mungkin berkomunikasi dengan latensi tinggi dan waktu penyelesaian pekerjaan bertambah. Untuk meningkatkan efisiensi pekerjaan tersebut, Anda dapat menjadwalkan pod dalam zona yang sama atau pada rak yang sama. Hal ini membantu mengurangi jumlah lompatan antar-pod sehingga komunikasi pod menjadi lebih cepat. Kubernetes memungkinkan penjadwalan pod berdasarkan afinitas node dan afinitas pod. Namun, terdapat beberapa kekurangan pada mekanisme afinitas node dan afinitas pod di Kubernetes.

  • Anda tidak dapat mengonfigurasi penjadwal untuk melalui semua domain topologi selama penjadwalan pod. Pada penjadwalan afinitas Kubernetes, sebuah pekerjaan akan menjadwalkan pod ke node tempat pod pertama dari pekerjaan tersebut dijadwalkan. Jika node tersebut tidak dapat memenuhi persyaratan pod lainnya, beberapa pod mungkin tertunda. Zona pod tidak berubah secara otomatis meskipun domain topologi lain memenuhi persyaratan pod tersebut.

  • Hal ini disebabkan karena node hanya memiliki label spesifik zona. Semua pod dijadwalkan ke zona yang sama oleh penjadwalan afinitas. Penjadwal tidak dapat menjadwalkan pod dalam dimensi lebih rendah, seperti domain topologi.

Melalui domain topologi selama penjadwalan pod

Anda dapat menambahkan label penjadwalan gang ke pekerjaan untuk memastikan bahwa permintaan sumber daya semua pod yang dibuat oleh pekerjaan tersebut dipenuhi secara bersamaan. Ini memungkinkan kube-scheduler untuk melalui beberapa domain topologi selama penjadwalan pod.

  1. Tambahkan label penjadwalan gang berikut ke pod. Untuk informasi lebih lanjut tentang penjadwalan gang, lihat Bekerja dengan penjadwalan gang.

    ...
    labels:
      pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu # Tentukan nama PodGroup, seperti tf-smoke-gpu. 
      pod-group.scheduling.sigs.k8s.io/min-available: "3" # Atur nilai ke jumlah pod yang dibuat oleh pekerjaan. 
    ...
  2. Tambahkan batasan penjadwalan dengan kesadaran topologi berikut ke pod di bagian label.

    annotations:
      alibabacloud.com/topology-aware-constraint: {\"name\":\"test\",\"required\":{\"topologies\":[{\"key\":\"kubernetes.io/hostname\"}],\"nodeSelectors\":[{\"matchLabels\":{\"test\":\"abc\"}}]}}

    Nilai dari alibabacloud.com/topology-aware-constraint harus berupa string JSON yang valid. String JSON harus dalam format berikut.

    {
      "name": xxx # Tentukan nama kustom. 
      "required": {
        "topologies": [
          {
            "key": xxx # Kunci domain topologi untuk penjadwalan afinitas. 
          }
        ],
        "nodeSelectors": [
          {
            # Anda dapat merujuk ke format LabelSelector dalam afinitas node Kubernetes. 
            "matchLabels": {},
            "matchExpressions": {} 
          }
        ]
      }
    }

    Setelah konfigurasi selesai, penjadwal akan menjadwalkan semua pod dengan label pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu ke node dengan label test=abc. Output berikut menunjukkan hasil penjadwalan:

    kubectl get pod -ojson | jq '.items[] | {"name":.metadata.name,"ann":.metadata.annotations["alibabacloud.com/topology-aware-constraint"], "node": spec.nodeName}'
    {
        "name": "nginx-deployment-basic-69f47fc6db-6****"
        "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}} "
        "node": "cn-shenzhen.10.0.2.4"
    }
    {
        "name":"nginx-deployment-basic-69f47fc6db-h****"
        "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}} "
        "node": "cn-shenzhen.10.0.2.4"
    }

Jadwalkan pod ke set penyebaran yang sama untuk mengurangi latensi jaringan

Dalam beberapa skenario, Anda mungkin perlu melakukan penjadwalan afinitas dalam dimensi lebih rendah, seperti domain topologi. ECS memungkinkan Anda membuat set penyebaran untuk mengurangi latensi jaringan antar-instance ECS dalam set penyebaran. Untuk informasi lebih lanjut tentang penggunaan set penyebaran di ACK, lihat Praktik terbaik untuk mengaitkan set penyebaran dengan kumpulan node.

Saat membuat kumpulan node yang dikaitkan dengan set penyebaran, tambahkan label node kustom untuk membedakan kumpulan node dari kumpulan node lainnya, seperti yang ditunjukkan pada gambar berikut.

image.png

Setelah konfigurasi selesai, tambahkan anotasi dan label berikut untuk menjadwalkan pekerjaan ke set penyebaran.

  1. Tambahkan label penjadwalan gang berikut ke pod. Untuk informasi lebih lanjut tentang penjadwalan gang, lihat Bekerja dengan penjadwalan gang.

    labels:
      pod-group.scheduling.sigs.k8s.io/name: xxx # Tentukan nama PodGroup. 
      pod-group.scheduling.sigs.k8s.io/min-available: "x" # Atur nilai ke jumlah pod yang dibuat oleh pekerjaan.
  2. Tambahkan batasan penjadwalan dengan kesadaran topologi berikut ke pod di bagian label.

    Penting

    Ganti matchLabels dalam contoh ini dengan label node kustom dari kumpulan node yang dikaitkan dengan set penyebaran dan ganti name dengan nilai sebenarnya.

    annotations:
      alibabacloud.com/topology-aware-constraint: {\"name\":\"test\",\"required\":{\"topologies\":[{\"key\":\"alibabacloud.com/nodepool-id\"}],\"nodeSelectors\":[{\"matchLabels\":{\"np-type\":\"low-latency\"}}]}}