Untuk menjadwalkan aplikasi ke node dengan konfigurasi tertentu, tetapkan label pada kelompok node tersebut dan konfigurasikan nodeSelector atau nodeAffinity yang sesuai pada aplikasi.
Cara kerja
Penjadwalan Pod ke kelompok node tertentu menggunakan mekanisme penjadwalan native Kubernetes yang mencocokkan Pod dengan node dalam kelompok berdasarkan label. Prosesnya sebagai berikut.
-
Tetapkan label untuk kelompok node. Kelompok node mengelola sekelompok node dengan konfigurasi yang sama. Saat Anda mengonfigurasi Node Labels pada kelompok node, ACK menyinkronkan label tersebut ke semua node dalam kelompok, termasuk node baru yang ditambahkan selama proses scale-out.
Setelah memilih Node Pool Configuration dan mencentang Update Labels and Taints of Existing Nodes, ACK secara otomatis menyinkronkan label node ke node yang sudah ada.
-
Tentukan aturan penjadwalan Pod. Dalam file YAML Pod, gunakan
<a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector" id="09ff6ac5341l1">nodeSelector</a>atau<a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity" id="95866abd0a387">nodeAffinity</a>untuk menentukan label node target. -
(Opsional) Konfigurasikan akses eksklusif. Anda dapat mengonfigurasi taint pada kelompok node agar hanya Pod dengan toleration yang sesuai yang dijadwalkan ke kelompok tersebut.
-
Penjadwalan otomatis. Penjadwal secara otomatis menempatkan Pod ke node yang memenuhi kondisi berdasarkan aturan di atas.
Langkah 1: Tetapkan label untuk kelompok node
Anda dapat menambahkan label kustom ke kelompok node untuk mengidentifikasi properti bisnis atau lingkungan, sehingga mempermudah manajemen penjadwalan.
ACK secara otomatis membuat label unik global alibabacloud.com/nodepool-id untuk setiap kelompok node. Anda dapat menggunakan label ini untuk melakukan pencocokan eksak terhadap kelompok node tertentu.
Masuk ke Container Service Management Console . Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Pada kolom Actions dari kelompok node yang dituju, klik Edit. Buka bagian opsi lanjutan dan konfigurasikan parameter berikut.
-
Node Labels:
-
Kunci: Formatnya adalah
prefix/name.-
name(Wajib): Nama harus terdiri dari 1 hingga 63 karakter, dimulai dan diakhiri dengan karakter alfanumerik[a-z0-9A-Z], serta boleh mengandung huruf, angka, tanda hubung (-), garis bawah (_), dan titik (.). -
prefix(Opsional): Awalan harus berupa DNS subdomain. DNS subdomain terdiri dari label DNS yang dipisahkan oleh titik (.). Panjang awalan tidak boleh melebihi 253 karakter dan harus diakhiri dengan garis miring (/).Awalan
kubernetes.io/dicadangkan untuk komponen inti Kubernetes. Oleh karena itu, kunci tag dalam namespace ini harus dimulai dengan awalan yang diizinkan, sepertikubelet.kubernetes.io/ataunode.kubernetes.io/.
-
-
Nilai (Opsional): Nilai dapat terdiri dari maksimal 63 karakter. Nilai harus dimulai dan diakhiri dengan karakter alfanumerik
[a-z0-9A-Z]serta boleh mengandung huruf, angka, tanda hubung (-), garis bawah (_), dan titik (.).
-
-
(Opsional) Jika diperlukan, pilih Update Labels and Taints of Existing Nodes.
-
-
Di panel navigasi kiri, pilih . Lalu, klik Manage Labels and Taints dan lihat label node pada tab Labels.
Langkah 2: Konfigurasikan kebijakan penjadwalan aplikasi
Setelah mendapatkan label kelompok node, Anda dapat mengonfigurasi nodeAffinity atau nodeSelector dalam file YAML aplikasi untuk menjadwalkan aplikasi ke kelompok node tujuan.
-
nodeSelector: Menyediakan cara sederhana untuk menyambungkan Pod ke node melalui pencocokan eksak label. -
nodeAffinity: Lebih fleksibel dibandingkannodeSelector.-
Mendukung tidak hanya pencocokan eksak tetapi juga ekspresi seperti
In,NotIn, danExists. -
Mendukung afinitas lunak (
preferredDuringSchedulingIgnoredDuringExecution), artinya penjadwal memprioritaskan penempatan Pod ke node yang memenuhi kondisi. Jika tidak ada node semacam itu, Pod tetap dapat dijadwalkan ke node lain.
-
-
Buat file
deployment.yaml.nodeAffinitynodeAffinitymencakup kebijakan penjadwalan berikut:-
requiredDuringSchedulingIgnoredDuringExecution(afinitas keras): Pod harus dijadwalkan ke node yang memenuhi kondisi. Jika tidak ada node yang memenuhi kondisi, Pod tidak dapat dijadwalkan dan tetap dalam status Pending. -
preferredDuringSchedulingIgnoredDuringExecution(afinitas lunak): Penjadwal memprioritaskan penempatan Pod ke node yang memenuhi kondisi. Jika tidak ditemukan node semacam itu, penjadwal mengabaikan preferensi ini dan menjadwalkan Pod ke node lain yang tersedia.
Contoh berikut menunjukkan cara memastikan bahwa aplikasi berjalan pada node dengan label
pod: nginx.apiVersion: apps/v1 kind: Deployment metadata: name: nginx-with-affinity labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: affinity: nodeAffinity: # Persyaratan wajib: Pod harus dijadwalkan ke node yang memenuhi kondisi. requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: pod # Kunci label node operator: In values: - nginx # Nilai label node containers: - name: nginx-with-affinity image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # Deklarasikan kebutuhan resource kontainer di lingkungan produksi untuk memastikan Quality of Service (QoS). resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi"nodeSelectorContoh berikut menunjukkan cara memastikan bahwa aplikasi selalu berjalan pada node dengan label
pod: nginx.apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: pod: nginx # Tentukan bahwa node harus memiliki label ini agar Pod berjalan di node tujuan. containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # Deklarasikan kebutuhan resource kontainer di lingkungan produksi untuk memastikan Quality of Service (QoS). resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi" -
-
Terapkan aplikasi.
kubectl apply -f deployment.yaml -
Verifikasi status berjalan Pod dan hasil penjadwalannya.
Anda dapat menambahkan parameter
-o wideuntuk melihat node spesifik tempat Pod dijadwalkan.kubectl get pods -l app=nginx -o wideAnda dapat memeriksa apakah Pod dijadwalkan ke node tujuan dalam output tersebut.
Referensi
-
Selain mengelola node menggunakan kelompok node, Anda juga dapat menetapkan label untuk node tunggal guna mencapai penjadwalan yang lebih detail halus. Untuk informasi selengkapnya, lihat Manage node labels.
-
Jika Pod berada dalam status abnormal, misalnya tetap dalam status Pending dalam waktu lama, lihat Troubleshoot pod exceptions.
-
ACK menyediakan kebijakan penjadwalan yang lebih fleksibel, seperti scale-out berurutan dan scale-in terbalik untuk berbagai resource instans, serta penjadwalan berbasis muatan berdasarkan penggunaan resource aktual node. Untuk informasi selengkapnya, lihat Scheduling policies provided by ACK.
-
Jika Anda menggunakan penjadwalan afinitas keras dan tidak ada node dalam kluster yang memenuhi kondisi, ACK secara otomatis melakukan scale-out node baru dari kelompok node yang memiliki label yang sesuai dan telah mengaktifkan auto scaling.
-
Kluster lama yang dibuat sebelum fitur kelompok node diperkenalkan mungkin berisi node pekerja yang tidak dikelola. Untuk informasi selengkapnya, lihat Migrate unmanaged nodes to a node pool.