Kluster ACS merepresentasikan node sebagai node virtual dan mengekspos atribut node—seperti zona ketersediaan, wilayah, dan model GPU—sebagai label Kubernetes. Gunakan nodeSelector atau nodeAffinity dalam spesifikasi Pod Anda untuk menjadwalkan Pod pada node virtual dengan atribut tertentu.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
kube-scheduler terinstal dengan versi minimum sesuai kluster Anda:
Versi kluster ACS Versi minimum kube-scheduler 1.31 v1.31.0-aliyun-1.2.0 1.30 v1.30.3-aliyun-1.1.1 1.28 v1.28.9-aliyun-1.1.0 -
acs-virtual-node v2.12.0-acs.4 atau versi lebih baru telah terinstal
Opsi Enable custom labels for GPU-HPN nodes and scheduler diaktifkan secara default pada versi kube-scheduler yang lebih baru. Tidak diperlukan pengaturan manual. Untuk detailnya, lihat kube-scheduler.
Pilih metode penjadwalan
| Metode | Kapan digunakan |
|---|---|
nodeSelector |
Menempelkan Pod ke node dengan label tertentu. Opsi paling sederhana — gunakan ini terlebih dahulu. |
nodeAffinity |
Mengekspresikan aturan penjadwalan yang lebih kompleks, seperti beberapa kondisi label atau pencocokan berbasis operator (In, NotIn, Exists). |
Label node yang tersedia
Node virtual ACS mengekspos label berikut untuk penjadwalan:
| Kunci label | Deskripsi | Contoh nilai |
|---|---|---|
topology.kubernetes.io/zone |
Zona ketersediaan | cn-hangzhou-j |
topology.kubernetes.io/region |
Wilayah | cn-hangzhou |
kubernetes.io/hostname |
Nama node virtual | virtual-kubelet-cn-hangzhou-j |
nodeSelector
nodeSelector mencocokkan Pod ke node virtual berdasarkan label. Tambahkan label target di bawah nodeSelector dalam spesifikasi Pod Anda. Untuk contoh lengkap, lihat Jadwalkan Pod ke zona tertentu.
nodeAffinity
nodeAffinity mendukung pencocokan berbasis label yang sama seperti nodeSelector, tetapi dengan sintaksis yang lebih ekspresif. Fitur ini memiliki dua mode:
| Mode | Perilaku |
|---|---|
requiredDuringSchedulingIgnoredDuringExecution (afinitas keras) |
Penjadwal hanya menempatkan Pod pada node yang memenuhi aturan tersebut. Jika tidak ada node yang cocok, Pod tidak akan dijadwalkan. |
preferredDuringSchedulingIgnoredDuringExecution (afinitas lunak) |
Penjadwal berusaha menemukan node yang cocok. Jika tidak tersedia, Pod tetap dijadwalkan pada node yang memenuhi syarat lainnya. |
Jika Anda menentukan nodeSelector dan nodeAffinity pada Pod yang sama, keduanya harus terpenuhi agar Pod dapat dijadwalkan. Di dalam nodeSelectorTerms, beberapa term dievaluasi dengan logika OR—Pod dijadwalkan jika salah satu term cocok. Di dalam satu term, beberapa entri matchExpressions dievaluasi dengan logika AND—semua ekspresi harus cocok.
Batasan untuk Pod GPU-HPN
Batasan berikut berlaku ketika ketiga kondisi berikut terpenuhi:
-
Pod menggunakan tipe komputasi GPU-HPN (GPU High-Performance Network).
-
schedulerNamePod adalahdefault-scheduler. -
Enable Custom Tags And Scheduler For GPU-HPN Nodes tidak dipilih dalam konfigurasi komponen penjadwal.
| Field | Batasan |
|---|---|
requiredDuringSchedulingIgnoredDuringExecution |
Di dalam nodeSelectorTerms, hanya label afinitas yang didukung yang diperbolehkan dalam matchExpressions. matchFields tidak dapat ditentukan. |
preferredDuringSchedulingIgnoredDuringExecution |
Tidak didukung. |
Untuk tipe instans general-purpose, komputasi-teroptimalkan, dan GPU, nodeAffinity tidak memiliki batasan tersebut.
Jadwalkan Pod ke zona tertentu
Contoh ini menggunakan nodeSelector untuk menjadwalkan Penyebaran ke zona cn-hangzhou-j.
-
Daftar node virtual di kluster Anda.
kubectl get nodeOutput yang diharapkan:
NAME STATUS ROLES AGE VERSION virtual-kubelet-cn-hangzhou-i Ready agent 5h42m v1.28.3-xx virtual-kubelet-cn-hangzhou-j Ready agent 5h42m v1.28.3-xx -
Buat file bernama
dep-node-selector-demo.yamldengan konten berikut.apiVersion: apps/v1 kind: Deployment metadata: name: dep-node-selector-demo labels: app: node-selector-demo spec: replicas: 4 selector: matchLabels: app: node-selector-demo template: metadata: labels: app: node-selector-demo spec: containers: - name: node-selector-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" # Pin pods to the cn-hangzhou-j zone nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-j -
Terapkan manifes.
kubectl apply -f dep-node-selector-demo.yaml -
Verifikasi bahwa semua Pod dijadwalkan ke zona
cn-hangzhou-j.kubectl get pod -o wideOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dep-node-selector-demo-b4578576b-cgpfq 1/1 Running 0 112s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-fs8kl 1/1 Running 0 110s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-nh8zm 1/1 Running 0 2m8s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-rpp8l 1/1 Running 0 2m8s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none>Keempat Pod berjalan di
virtual-kubelet-cn-hangzhou-j, yang mengonfirmasi bahwa penjadwalan tingkat zona berfungsi sebagaimana diharapkan.