Dalam skenario seperti pembelajaran mesin atau analisis data besar, pod sering kali memerlukan komunikasi yang intens. Secara default, penjadwal Kubernetes mendistribusikan pod secara merata di seluruh node dalam kluster Container Service for Kubernetes (ACK). Hal ini dapat menyebabkan latensi tinggi dalam komunikasi antar pod, sehingga meningkatkan waktu penyelesaian pekerjaan. Di kluster ACK Lingjun, penjadwalan sadar topologi jaringan dapat menetapkan pod ke domain forwarding Layer 1 atau Layer 2 yang sama, mengurangi latensi jaringan dan mempercepat penyelesaian pekerjaan.
Ikhtisar solusi
Penjadwalan sadar topologi jaringan menggunakan algoritma greedy untuk menetapkan tugas ke node Lingjun dengan rentang topologi minimal.
Misalkan kluster ACK Lingjun memiliki dua lapisan topologi jaringan: Pod dan Access Switch (ASW). ASW berfungsi sebagai antarmuka langsung untuk kluster Lingjun, sedangkan Pod mewakili topologi jaringan yang lebih luas. Transmisi antar node Lingjun memerlukan setidaknya satu hop pengalihan jaringan, sedangkan transmisi antar node ASW memerlukan setidaknya dua hop.
Untuk tugas yang membutuhkan dua node Lingjun, penjadwalan sadar topologi jaringan akan menetapkan tugas tersebut ke Node Pair A-B atau Node Pair E-F.
Untuk tugas yang membutuhkan empat node Lingjun, penjadwalan sadar topologi jaringan akan menetapkan tugas tersebut ke Node Pair A-D atau Node Pair E-H.
Untuk menentukan apakah node dalam kluster ACK Lingjun merupakan bagian dari ASW atau Pod yang sama, Anda dapat memeriksa label alibabacloud.com/asw-id dan alibabacloud.com/point-of-delivery. Label ini memberikan detail tentang lokasi jaringan.
Nyatakan struktur topologi
Untuk mengimplementasikan penjadwalan sadar topologi jaringan di kluster ACK Lingjun, definisikan persyaratan penjadwalan topologi tingkat kluster dan identifikasi informasi penjadwalan dalam tugas.
Buat file bernama
cluster-network-topology.yamluntuk menyatakan struktur topologi dua tingkat.Buat file bernama
sample-network-topology.yamluntuk menyatakan persyaratan penjadwalan sadar topologi jaringan untuk tugas.Buat file bernama
pi.yamluntuk menyatakan informasi penjadwalan sadar topologi jaringan.Saat mengirimkan tugas, sertakan informasi
JobNetworkTopologyyang relevan.Jalankan perintah berikut untuk menerapkan file YAML di kluster:
kubectl apply -f cluster-network-topology.yaml kubectl apply -f sample-network-topology.yaml kubectl apply -f pi.yaml
Demonstrasi hasil penjadwalan
Gunakan kubectl untuk terhubung ke kluster dan ambil informasi topologi jaringan.
Di kluster ACK Lingjun, komponen lingjun-networktopology-collector mengumpulkan informasi ini dan melabelinya pada node Lingjun.
Untuk node lain atau jenis kluster yang berbeda, tambahkan label secara manual dan pastikan bahwa kunci label sesuai dengan
labelKeyyang ditentukan dalamClusterNetworkTopologydi template YAML sebelumnya.# Topologi jaringan seperti: # test-pod-1 test-pod-2 # / | \ | # test-1 test-2 test-3 test-4 # / \ | | | # 0.12 0.14 0.15 0.16 0.17 ➜ network kubectl get no -l alibabacloud.com/asw-id,alibabacloud.com/point-of-delivery -ojson | jq '.items[] | {"Name":.metadata.name, "ASW":.metadata.labels."alibabacloud.com/asw-id", "POD":.metadata.labels."alibabacloud.com/point-of-delivery"}' { "Name": "cn-hongkong.10.1.0.12", "ASW": "test-1", "POD": "test-pod-1" } { "Name": "cn-hongkong.10.1.0.14", "ASW": "test-1", "POD": "test-pod-1" } { "Name": "cn-hongkong.10.1.0.15", "ASW": "test-2", "POD": "test-pod-1" } { "Name": "cn-hongkong.10.1.0.16", "ASW": "test-3", "POD": "test-pod-1" } { "Name": "cn-hongkong.10.1.0.17", "ASW": "test-4", "POD": "test-pod-2" }Jalankan perintah berikut untuk mengirimkan tugas Job yang telah dikonfigurasi dan amati eksekusinya pada dua node Lingjun dalam test-1:
➜ kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pi-8p89l 1/1 Running 0 4s 172.30.240.197 cn-hongkong.10.1.0.14 <none> <none> pi-p8swv 0/1 ContainerCreating 0 4s <none> cn-hongkong.10.1.0.12 <none> <none>Jika Anda mengatur jumlah pod dalam tugas menjadi 4, perbarui parameter
parallelism,pod-group.scheduling.sigs.k8s.io/min-availabledalam file konfigurasi YAML untuk Job sebelumnya, serta parameterworkerNumdalam file konfigurasi YAML untuk JobNetworkTopology sebelumnya.Setelah melakukan modifikasi ini, Anda akan melihat bahwa hanya node Lingjun yang menjalankan test-pod-2 yang tetap tidak terjadwal.
➜ kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pi-2kwq9 1/1 Running 0 4s 172.30.241.123 cn-hongkong.10.1.0.12 <none> <none> pi-87hm5 0/1 ContainerCreating 0 4s <none> cn-hongkong.10.1.0.16 <none> <none> pi-bsvx8 1/1 Running 0 4s 172.30.240.198 cn-hongkong.10.1.0.14 <none> <none> pi-dvwhl 0/1 ContainerCreating 0 4s <none> cn-hongkong.10.1.0.15 <none> <none>Jika Anda mengatur jumlah pod dalam tugas menjadi 5, perbarui parameter
parallelism,pod-group.scheduling.sigs.k8s.io/min-availabledalam file konfigurasi YAML untuk Job sebelumnya, serta parameterworkerNumdalam file konfigurasi YAML untuk JobNetworkTopology sebelumnya.Setelah melakukan modifikasi ini, Anda akan melihat bahwa penjadwalan tugas gagal. Pod pertama yang dijadwalkan berisi pesan kegagalan penjadwalan
all fail topology paths by MustGather reason: [path:RootNode->test-pod-1, freeSlotNum:4], [path:RootNode->DefaultTopologyName, freeSlotNum:0], [path:RootNode->test-pod-2, freeSlotNum:1]. Pesan ini menunjukkan bahwa penjadwalan gagal karena penjadwalan lintas pod tidak diizinkan.➜ kubectl get pod NAME READY STATUS RESTARTS AGE pi-75qf5 0/1 Pending 0 2s pi-8k4nd 0/1 Pending 0 2s pi-b2pmc 0/1 Pending 0 2s pi-n7c2b 0/1 Pending 0 2s pi-wf4zn 0/1 Pending 0 2s ➜ kubectl get pod -ojson | jq '.items[].status' { "conditions": [ { "lastProbeTime": null, "lastTransitionTime": "2024-05-29T07:46:27Z", "message": "0/6 nodes are available: 1 Insufficient nvidia.com/gpu, 1 [NetworkTopology begin] cluster total nodes:6, 5 node provide 5 freeSlot, 1 node unavailable cause Insufficient nvidia.com/gpu, job desireNum:5, all fail topology paths by MustGather reason: [path:RootNode->test-pod-1, freeSlotNum:4], [path:RootNode->DefaultTopologyName, freeSlotNum:0], [path:RootNode->test-pod-2, freeSlotNum:1] [NetworkTopology end], 4 NetworkTopology bestPlan empty. network topology job sample-network-topology/sample-network-topology gets rejected due to pod is unschedulable, preemption: 0/6 nodes are available: 1 No victims found on node cn-hongkong.10.1.0.10 for preemptor pod pi-75qf5, 5 Preemption is not helpful for scheduling..", "reason": "Unschedulable", "status": "False", "type": "PodScheduled" } ], "phase": "Pending", "qosClass": "BestEffort" } { "phase": "Pending", "qosClass": "BestEffort" } { "phase": "Pending", "qosClass": "BestEffort" } { "phase": "Pending", "qosClass": "BestEffort" } { "phase": "Pending", "qosClass": "BestEffort" }