Penjadwalan afinitas pod menyatakan preferensi untuk menempatkan pod secara bersamaan (co-locating). Berbeda dengan afinitas node, afinitas pod memungkinkan Anda membatasi penempatan pod berdasarkan label pod yang sudah berjalan pada node virtual. Di kluster ACS, afinitas pod diterapkan menggunakan semantik penjadwalan Kubernetes native. Tentukan domain topologi dan aturan label di bidang podAffinity atau podAntiAffinity untuk menjadwalkan pod ke domain topologi tertentu. Topik ini menjelaskan batasan dan penggunaan penjadwalan afinitas pod di ACS.
Prasyarat
kube-scheduler telah terinstal dan versinya memenuhi persyaratan berikut.
Versi kluster ACS
Versi komponen penjadwal
1.31
v1.31.0-aliyun-1.2.0 dan yang lebih baru
1.30
v1.30.3-aliyun-1.1.1 dan yang lebih baru
1.28
v1.28.9-aliyun-1.1.0 dan yang lebih baru
acs-virtual-node telah terinstal dan versinya v2.12.0-acs.4 atau yang lebih baru.
Catatan penting
Di kluster ACS, afinitas pod memiliki batasan saat digunakan dengan pod yang memenuhi semua kondisi berikut.
Konfigurasi Enable Custom Tags and the Scheduler for GPU-HPN Nodes untuk komponen penjadwal ACS diaktifkan secara default di versi baru. Untuk informasi selengkapnya, lihat kube-scheduler.
Pod menggunakan tipe komputasi GPU High-Performance Network (GPU-HPN).
schedulerNamePod adalahdefault-scheduler.Pada konfigurasi komponen penjadwal, opsi Enable Custom Tags And Scheduler For GPU-HPN Nodes tidak dipilih.
Bidang dan batasan protokol dijelaskan sebagai berikut.
Kebijakan
requiredDuringSchedulingIgnoredDuringExecution.Bidang
Deskripsi
Batasan
LabelSelector
Menemukan pod yang cocok. Pod dengan label ini dihitung untuk menentukan jumlah pod yang ada di setiap domain topologi.
Pod dari tipe instans lain—seperti general-purpose, komputasi-teroptimalkan, dan GPU—tidak dihitung dalam total ini.
Namespaces
Menentukan namespace tempat mencari pod yang cocok. Digunakan bersama LabelSelector.
Tidak didukung
NamespaceSelector
Serupa dengan bidang Namespaces, tetapi memilih namespace berdasarkan label namespace, bukan nama.
Tidak didukung
Kebijakan
preferredDuringSchedulingIgnoredDuringExecutiontidak didukung.
Untuk informasi lebih lanjut tentang setiap bidang, lihat Pod affinity and anti-affinity.
Contoh
Contoh ini menunjukkan cara menggunakan podAffinity untuk menjadwalkan aplikasi ke zona tertentu.
Jalankan perintah berikut untuk menampilkan daftar node virtual di kluster.
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-xxBuat file bernama with-affinity-pod.yaml dengan konten YAML berikut.
apiVersion: v1 kind: Pod metadata: labels: pod-affinity-label: with-pod-affinity name: with-affinity-label-pod spec: containers: - args: - 'infinity' command: - sleep image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 imagePullPolicy: IfNotPresent name: stress resources: limits: cpu: '1' memory: 1Gi requests: cpu: '1' memory: 1GiJalankan perintah berikut untuk men-deploy with-affinity-label-pod ke kluster.
kubectl apply -f with-affinity-pod.yamlJalankan perintah berikut untuk melihat distribusi pod di berbagai node.
kubectl get pod -o wideOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES with-affinity-label-pod 1/1 Running 0 75s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none>Pod dijadwalkan ke zona cn-hangzhou-i.
Buat file bernama origin-affinity-pod.yaml dengan konten YAML berikut.
apiVersion: apps/v1 kind: Deployment metadata: name: dep-pod-affinity labels: app: pod-affinity-demo spec: replicas: 4 selector: matchLabels: app: pod-affinity-demo template: metadata: labels: app: pod-affinity-demo spec: containers: - name: pod-affinity-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" resources: limits: cpu: '1' memory: 1Gi requests: cpu: '1' memory: 1Gi # Terapkan afinitas pod untuk menempatkan pod di zona yang sama dengan pod yang memiliki label <pod-affinity-label:with-pod-affinity> affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: pod-affinity-label operator: In values: - with-pod-affinity topologyKey: topology.kubernetes.io/zoneJalankan perintah berikut untuk men-deploy origin-affinity-pod.yaml ke kluster.
kubectl apply -f origin-affinity-pod.yamlJalankan perintah berikut untuk melihat distribusi pod di berbagai node.
kubectl get pod -o wideOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dep-pod-affinity-6b9d4f7c87-5jlfx 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-hwdpc 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-jfcrq 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-xwbfr 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> with-affinity-label-pod 1/1 Running 0 6m30s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none>Semua pod berjalan di zona yang sama.