Afinitas node adalah sekumpulan aturan. Ini digunakan oleh penjadwal untuk memutuskan di mana pod dapat ditempatkan di cluster. Aturan ditentukan menggunakan label pada node dan pemilih label yang ditentukan dalam definisi pod. Afinitas node memungkinkan pod menentukan afinitas terhadap sekelompok node yang dapat dijadwalkan. Kami dapat membatasi Pod agar hanya dapat berjalan di Node tertentu.
nodeSelector adalah bentuk paling sederhana dari batasan pemilihan node. nodeSelector adalah properti dari PodSpec. Agar pod memenuhi syarat untuk dijalankan pada sebuah node, node tersebut harus memiliki masing-masing label yang ditunjukkan.
Afinitas node secara konsep mirip dengan nodeSelector -- ini memungkinkan kita membatasi node mana pod kita memenuhi syarat untuk dijadwalkan, berdasarkan label pada node.
Saat ini ada dua jenis afinitas node,
- wajibDuringSchedulingIgnoredDuringExecution dan
- lebih disukaiDuringSchedulingIgnoredDuringExecution.
Apa yang dimaksud dengan Penjadwalan
- Di sini, pod belum dibuat dan akan dibuat untuk pertama kalinya.
- Biasanya saat pod dibuat, aturan afinitas akan diterapkan.
Apa Itu Selama Eksekusi
- Di sini, pod telah berjalan dan perubahan dibuat di lingkungan yang memengaruhi nodeAffinity.
Untuk mengetahui Afinitas Node secara mendetail, kunjungi kubernete.io dokumentasi resmi Kubernetes.
Dalam artikel ini, kita akan melihat cara menetapkan Pod Kubernetes ke node tertentu menggunakan Afinitas Node "requiredDuringSchedulingIgnoredDuringExecution" di cluster Kubernetes.
Prasyarat
- Cluster Kubernetes dengan setidaknya 1 node pekerja.
Jika Anda ingin belajar membuat Cluster Kubernetes, klik di sini. Panduan ini akan membantu Anda membuat cluster Kubernetes dengan 1 Master dan 2 Node di Instans AWS Ubuntu 18.04 EC2.
Apa yang akan kami lakukan?
- Konfigurasi Node-Afinitas
Konfigurasi Node-Affinity
Pertama-tama, mari dapatkan daftar node yang tersedia di cluster.
kubectl get nodes #Get all the nodes in the cluster
Periksa apakah node memiliki Taints.
kubectl describe node node01 | grep Taints #Describe the node node01 and grep Taints
kubectl describe node master | grep Taints #Describe the node master and grep Taints
Tambahkan label ke node pekerja node01.
kubectl label node node01 app=qa #Add a label
Buat file definisi penerapan dan tambahkan definisi berikut di dalamnya.
vim my-deployment-without-affinity.yml
apiVersion: apps/v1 kind: Deployment metadata: name: app-without-affinity spec: replicas: 20 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx
Dapatkan daftar Pod dan Deployment.
kubectl get pods #Get pods in the default namespace
kubectl get deployment #Get deployments in the default namespace
Buat penerapan dari definisi yang kami buat.
kubectl create -f my-deployment-without-affinity.yml #Create a deployment object
kubectl get deployment #Get deployments in the default namespace
kubectl get pods #Get pods in the default namespace
Dapatkan detail Pod yang dibuat oleh penerapan.
Di sini terlihat bahwa Pod juga mendapatkan tempat di master node. Alasan untuk ini adalah karena node tidak memiliki Taints sehingga pod bisa mendapatkan tempat di salah satu node yang tersedia.
kubectl get pods -o wide #Get pods in the default namespace with more information about them using -o wide
Sekarang, buat definisi penerapan dengan afinitas node yang mendefinisikannya.
vim my-deployment-with-affinity.yml
apiVersion: apps/v1 kind: Deployment metadata: name: app-with-afiinity spec: replicas: 6 selector: matchLabels: run: nginx template: metadata: labels: run: nginx spec: containers: - image: nginx imagePullPolicy: Always name: nginx affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: app operator: In values: - qa
Dapatkan daftar penerapan yang ada dan buat penerapan baru dengan afinitas menggunakan file yang dibuat pada langkah di atas.
kubectl get deployment #Get deployments in the default namespace
kubectl create -f my-deployment-with-affinity.yml #Create a deployment object
kubectl get deployment #Get deployments in the default namespace
Sekarang, dapat dilihat bahwa Pod kali ini ditempatkan pada node pekerja node01 saja. Alasannya adalah karena kami mendefinisikan afinitas node dalam definisi penerapan yang memastikan bahwa pod di-deploy pada node yang cocok dengan kondisi/label yang ditentukan.
kubectl get pods -o wide | grep app-with-afiinity #Get pods in the default namespace with more information about them using -o wide and grep app-with-afiinity
Kesimpulan
Dalam artikel ini, kita belajar untuk menambahkan label ke node dan melihat bagaimana pod dapat dibatasi agar dijadwalkan pada node yang diperlukan menggunakan Node Affinity. Kami juga melihat bahwa pod bahkan dapat di-deploy pada master node jika tidak memiliki Taint di dalamnya.