GNU/Linux >> Belajar Linux >  >> Linux

Gunakan Afinitas Node di Kubernetes

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, 

  1. wajibDuringSchedulingIgnoredDuringExecution dan 
  2. 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

  1. 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?

  1. 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.


Linux
  1. Cara Menggunakan Penyedia Terraform Kubernetes

  2. Instal dan Gunakan NVM di Debian 11

  3. Bagaimana Cara Membuat Jshint Bekerja?

  1. Bagaimana Agar Apache Menggunakan Php 7.0 (bukan 7.1)?

  2. Cara Memulai Ulang Pod di Kubernetes [Kiat Cepat K8s]

  3. Survey Mengatakan:Bagaimana 267 Pengembang Menggunakan Node.js

  1. Bagaimana cara menggunakan API Jaringan E2E?

  2. Cara menggunakan Podman di dalam Kubernetes

  3. Bagaimana cara menjalankan riwayat Pod di Kubernetes Node?