Gunakan toleransi dan afinitas node untuk menjadwalkan Pod pada Elastic Compute Service (ECS), ECI, atau keduanya dengan fallback berbasis prioritas.
Konsep utama
-
Taint: Aturan pada node yang mencegah penjadwalan Pod tertentu ke node tersebut.
-
Toleransi: Pengaturan pada Pod yang memungkinkannya mengabaikan taint pada node.
-
Afinitas node: Properti Pod yang menariknya ke node dengan label tertentu. Terdapat dua jenis:
-
requiredDuringSchedulingIgnoredDuringExecution: Persyaratan wajib. Pod hanya dijadwalkan pada node yang sesuai. -
preferredDuringSchedulingIgnoredDuringExecution: Preferensi opsional. Penjadwal berusaha memenuhi aturan ini, tetapi akan menjadwalkan Pod di tempat lain jika tidak ditemukan kecocokan.
-
Lihat Taints and Tolerations dan Node affinity.
Prasyarat
-
Sebuah kluster Pro terkelola ACK yang menjalankan Kubernetes v1.22 atau lebih baru.
-
Add-on ack-virtual-node versi 2.10.0 atau lebih baru (lihat Virtual nodes).
-
Komponen kube-scheduler versi 5.9 atau lebih baru, dengan kebijakan penjadwalan node virtual diaktifkan.
Pada halaman Add-ons, temukan Kube Scheduler, klik Configuration, lalu pastikan bahwa Enable Virtual Node-based Pod Scheduling telah dipilih.
Contoh konfigurasi
Node virtual di kluster ACK memiliki taint virtual-kubelet.io/provider=alibabacloud:NoSchedule secara default. Untuk menjadwalkan Pod pada node virtual (ECI), tambahkan toleransi terhadap taint ini.
Contoh:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
Gabungkan toleransi dan afinitas node untuk membuat kebijakan penjadwalan sesuai kebutuhan resource yang berbeda.
-
Lebih memilih ECS: Gunakan ECS secara default; beralih ke ECI ketika kapasitas ECS tidak mencukupi.
-
Hanya gunakan ECI: Gunakan hanya resource ECI.
-
Hanya gunakan ECS: Gunakan hanya resource ECS yang tersedia.
Lebih memilih ECS
Tambahkan toleransi terhadap taint default, lalu gunakan preferredDuringSchedulingIgnoredDuringExecution untuk lebih memilih node tanpa label type: virtual-kubelet (node ECS).
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-prefer
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: type
operator: NotIn
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
Mengenai afinitas node:
-
Beberapa
nodeSelectorTermsdigabungkan dengan logika OR — Pod dijadwalkan jika salah satumatchExpressionscocok. Beberapa ekspresi dalam satumatchExpressionsdigabungkan dengan logika AND — semua harus cocok. -
preferredDuringSchedulingIgnoredDuringExecutiontidak menjamin fallback eksklusif ke ECI — Pod tetap dapat ditempatkan di ECI meskipun kapasitas ECS tersedia. Untuk kontrol yang lebih ketat, kombinasikan denganrequiredDuringSchedulingIgnoredDuringExecution.
YAML berikut lebih memilih node ECS dengan label tertentu (misalnya label_1=key_1) dan beralih ke node virtual saat diperlukan kapasitas tambahan.
Hanya gunakan ECI
Tambahkan toleransi terhadap taint default node virtual, lalu gunakan requiredDuringSchedulingIgnoredDuringExecution untuk mewajibkan penempatan pada node dengan label type: virtual-kubelet.
apiVersion: apps/v1
kind: Deployment
metadata:
name: eci-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
Hanya gunakan ECS
Secara default, Pod hanya dijadwalkan pada node ECS karena node virtual memiliki taint. Tidak diperlukan konfigurasi tambahan.
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6