GNU/Linux >> Znalost Linux >  >> Linux

Použijte Node Affinity v Kubernetes

Afinita uzlů je sada pravidel. Používá ho plánovač k rozhodnutí, kam lze v klastru umístit pod. Pravidla jsou definována pomocí štítků na uzlech a selektorů štítků uvedených v definici podů. Afinita uzlů umožňuje podu určit afinitu ke skupině uzlů, pro které může být naplánován. Podu můžeme omezit tak, aby bylo možné běžet pouze na konkrétních uzlech.

nodeSelector je nejjednodušší forma omezení výběru uzlů. nodeSelector je vlastnost PodSpec. Aby se pod mohl spustit na uzlu, musí mít uzel každý z uvedených štítků.

Afinita uzlů je koncepčně podobná nodeSelector – umožňuje nám omezit, pro které uzly může být náš pod naplánován, na základě štítků na uzlu.

V současnosti existují dva typy afinity uzlů, 

  1. požadovánoDuringSchedulingIgnoredDuringExecution a 
  2. preferredDuringSchedulingIgnoredDuringExecution.

Co je ThroughScheduling

  • Tady pod ještě není vytvořen a bude vytvořen poprvé.
  • Po vytvoření podu se obvykle použijí pravidla afinity.

Co je běhemExecution

  • Zde je modul spuštěný a změna je provedena v prostředí, které ovlivňuje nodeAffinity.

Chcete-li znát podrobnosti Node Affinity, navštivte kubernete.io oficiální dokumentaci Kubernetes.

V tomto článku se podíváme, jak přiřadit Kubernetes Pod ke konkrétnímu uzlu pomocí spřažení uzlu „requiredDuringSchedulingIgnoredDuringExecution“ v clusteru Kubernetes.

Předpoklady

  1. Cluster Kubernetes s alespoň 1 pracovním uzlem.
    Pokud se chcete naučit vytvářet cluster Kubernetes, klikněte sem. Tato příručka vám pomůže vytvořit cluster Kubernetes s 1 hlavním a 2 uzly na instancích AWS Ubuntu 18.04 EC2.

Co budeme dělat?

  1. Konfigurujte spřažení uzlů

Konfigurovat spřažení uzlů

Nejprve získáme seznam uzlů dostupných v clusteru.

kubectl get nodes #Get all the nodes in the cluster

Zkontrolujte, zda uzly mají skvrny.

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

Přidejte štítek k pracovnímu uzlu node01.

kubectl label node node01 app=qa #Add a label

Vytvořte soubor s definicí nasazení a přidejte do něj následující definici.

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

Získejte seznam modulů a rozmístění.

kubectl get pods #Get pods in the default namespace
kubectl get deployment #Get deployments in the default namespace

Vytvořte nasazení z definice, kterou jsme vytvořili.

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

Získejte podrobnosti o modulech vytvořených nasazením.

Zde je vidět, že Pody získávají místa také v hlavním uzlu. Důvodem je to, že uzly na sobě nemají žádné skvrny, takže pody mohou získat místa na kterémkoli z dostupných uzlů.

kubectl get pods -o wide #Get pods in the default namespace with more information about them using -o wide

Nyní vytvořte definici nasazení s definovanou afinitou uzlu.

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

Získejte seznam existujících implementací a pomocí souboru vytvořeného ve výše uvedeném kroku vytvořte novou implementaci s příbuzností.

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

Nyní je vidět, že Pody byly tentokrát umístěny pouze na pracovním uzlu node01. Důvodem je to, že jsme v definici nasazení definovali afinitu uzlů, která zajišťuje, že pody budou nasazeny na uzlech, které odpovídají definované podmínce/štítku.

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

Závěr

V tomto článku jsme se naučili přidávat štítky k uzlům a viděli jsme, jak lze pody omezit, aby byly naplánovány na požadované uzly pomocí funkce Affinity uzlů. Také jsme viděli, že moduly lze dokonce nasadit na hlavní uzel, pokud na něm není žádná skvrna.


Linux
  1. Jak používat Terraform Kubernetes Provider

  2. Jak dostat Jshint do práce?

  3. Konflikty Node.js:/sbin/node vs /usr/bin/node?

  1. Jak přimět Apache, aby používal PHP 7.0 (ne 7.1)?

  2. Jak restartovat moduly v Kubernetes [Rychlý tip K8s]

  3. Jak vypustit uzel v Kubernetes

  1. Jak přidat nebo odebrat štítky do uzlů v Kubernetes

  2. Průzkum říká:Jak 267 vývojářů používá Node.js

  3. Node.js – Získejte počet dostupných procesorů