Ricerca nel sito web

Come utilizzare i selettori di nodo in Kubernetes


Su questa pagina

  1. Prerequisiti
  2. Cosa faremo
  3. Configura i selettori di nodo
  4. Conclusione

Possiamo limitare un pod in modo che possa essere eseguito solo su un particolare nodo. Ci possono esserci alcune situazioni in cui potremmo desiderare un maggiore controllo su un nodo in cui atterra un pod.

nodeSelector è una delle forme di vincolo di selezione dei nodi. nodeSelector è un campo di PodSpec. Si tratta di una semplice funzionalità di pianificazione dei pod che consente di pianificare un pod su un nodo le cui etichette corrispondono alle etichette nodeSelector container.style.width=100%;var ins=document.createElement(ins);ins.id=slotId+-asloaded;ins. className=adsbygoogle ezasloaded;ins.dataset.adClient=pid;ins.dataset.adChannel=cid;if(ffid==2){ins.dataset.fullWidthResponsive=true;}

Per saperne di più su Node Selects, fai clic qui per andare alla pagina ufficiale di Kubernetes.

In questo articolo, non avremo alcuna contaminazione sul nodo master in modo che i pod possano essere distribuiti anche sul nodo master. Quindi creeremo i pod per vederli distribuiti sul nodo di lavoro e sul nodo principale. Quindi allegheremo un'etichetta al nodo master e ai point pod per eseguire il deployment sul nodo master solo utilizzando nodeSelector.

Prerequisiti

  1. Cluster Kubernetes con almeno 1 nodo di lavoro.
    Se vuoi imparare a creare un cluster Kubernetes, fai clic qui. Questa guida ti aiuterà a creare un cluster Kubernetes con 1 master e 2 nodi su istanze AWS Ubuntu 18.04 EC2.

Cosa faremo

  1. Configura selettori di nodo

Configura i selettori di nodo

Innanzitutto, estraiamo i dettagli dei nodi nel cluster utilizzando il seguente comando.

kubectl get nodes #Get nodes available in the cluster
kubectl describe nodes node01 | grep Taint #Describe node1 node to extract details regarding Taints
kubectl describe nodes master | grep Taint #Describe master node to extract details regarding Taints

Quanto sopra mostra che i nodi non hanno contaminazioni, ciò significa che i pod possono essere posizionati su qualsiasi nodo, sia su master che su node01.

Ora, creiamo una distribuzione che non contiene alcun selettore di nodo.

vim my-deployment-without-node-selector.yaml #Create a deployment definition
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: frontend
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - image: httpd:2.4-alpine
        name: frontend

Ora siamo pronti per creare una distribuzione utilizzando il seguente comando.

kubectl get pods #Get pods available in the cluster
kubectl create -f my-deployment-without-node-selector.yaml #Create a deployment
kubectl get pods ##Get nodes available in the cluster

Ora, modifica il numero di repliche nella distribuzione modificando il file e applica le modifiche.

kubectl apply -f my-deployment-without-node-selector.yaml #Apply changes made in the deployment definition file
kubectl get pods -o wide # Get more details regarding pods using -o wide option

Nello screenshot sopra, si può vedere che vengono creati nuovi pod e che vengono pianificati anche sul nodo master.

La ragione di ciò è che entrambi i nodi, master e node01, non hanno contaminazioni.

Quindi, per limitare la pianificazione e assicurarsi che i pod ottengano posti solo sul nodo master, creiamo un'etichetta sul nodo master.

kubectl label nodes master on-master=true #Create a label on the master node
kubectl describe node master #Get more details regarding the master node

Nello screenshot qui sopra, si può vedere che il nodo master ha un'etichetta come \on-master=true\

Ora, creiamo un nuovo deployment con nodeSelector:on-master=true al suo interno per assicurarci che i pod vengano implementati solo sul nodo master.

vim my-deployment-with-node-selector.yaml #Create a deployment definition file 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: streamer-v4-deployment
  labels:
    app: streamer-v4
spec:
  replicas: 2
  selector:
    matchLabels:
      app: streamer-v4
  template:
    metadata:
      labels:
        app: streamer-v4
    spec:
      containers:
      - name: streamer-v4
        image: nginx
        ports:
        - containerPort: 8880
      nodeSelector:
        on-master: "true"

È ora possibile creare una nuova distribuzione con nodeSelector con il seguente comando.

kubectl create -f my-deployment-with-node-selector.yaml #Create a deployment
kubectl get pods -o wide | grep streamer-v4-deployment #Get more details of the pods

Nello screenshot sopra, si può vedere che i pod sono stati distribuiti solo sul nodo master.

Ora, cambiamo \replica=50\ per vedere dove verranno distribuiti i pod.

vim my-deployment-with-node-selector.yaml #Change a deployment definition

Applica le modifiche più recenti con un comando indicato di seguito.

kubectl apply -f my-deployment-with-node-selector.yaml #Apply changes to the deployment

Qui puoi vedere che tutti i pod vengono creati e distribuiti solo sul nodo \master\.

Conclusione

In questo articolo abbiamo visto come i pod possono essere limitati per essere distribuiti sul nodo specifico solo utilizzando label e nodeSelector.

Abbiamo anche visto che se il nodo master non ha Taint, i pod possono essere distribuiti su di esso.