DEV Community

Serena Sensini
Serena Sensini

Posted on • Originally published at theredcode.it on

Label e selector in Kubernetes

In che modo può esserci utile sfruttare le label e i selector per poter gestire i componenti all’interno di un cluster basato su Kubernetes?

Analizziamo il concetto di label e di selector, attraverso qualche esempio.

Intro

Le label sono coppie chiave-valore collegate a pod, controller di replica e servizi. Vengono utilizzati come attributi identificativi per oggetti come pod e controller di replica. Possono essere aggiunti a un oggetto al momento della creazione e possono essere aggiunti o modificati in fase di esecuzione.

Le label non forniscono unicità. In generale, possiamo dire che molti oggetti possono portare le stesse label. Il selector è il modo in cui è possibile raggruppare delle risorse in Kubernetes (così come in OpenShift).

L’API Kubernetes attualmente supporta due tipi di selettori:

  • Selettori basati sull’uguaglianza
  • Selettori basati su insiemi di valori

Di base, è quindi possibile utilizzare diversi operatori per poter selezionare le risorse che ci interessano: operatori come “!=”, “=” o “==”, che corrispondono relativamente all’operatore di diseguaglianza e di uguaglianza (gli ultimi due sono sinonimi).

Come funziona

Colleghiamoci al cluster e recuperiamo tutte le label associate ai Pod del progetto corrente: questo è possibile tramite l’opzione show-labels.

kubectl get pods --show-labels
>>>
NAME READY STATUS RESTARTS AGE LABELS
nodejs-postgresql-example-1-build 0/1 Completed 0 4m35s openshift.io/build.name=nodejs-postgresql-example-1
nodejs-postgresql-example-1-deploy 0/1 Completed 0 3m11s openshift.io/deployer-pod-for.name=nodejs-postgresql-example-1
nodejs-postgresql-example-1-jjcn8 1/1 Running 0 3m6s app.openshift.io/runtime=nodejs,deployment=nodejs-postgresql-example-1,deploymentconfig=nodejs-postgresql-example,name=nodejs-postgresql-example
postgresql-1-deploy 0/1 Completed 0 4m35s openshift.io/deployer-pod-for.name=postgresql-1
postgresql-1-fsw24 1/1 Running 0 4m31s deployment=postgresql-1,deploymentconfig=postgresql,name=postgresql

Enter fullscreen mode Exit fullscreen mode

Se volessimo riportare solo i Pod che fanno parte della webapp Node.js, potremmo utilizzare una di quelle che sono state assegnate e, tramite l’opzione –selector, potremmo elencare tutti i Pod relativi a Node.js che hanno una label con chiave deployment e valore nodejs-postgresql-example-1:

kubectl get pods --show-labels --selector="deployment=nodejs-postgresql-example-1"

# or 

kubectl get pods --show-labels -l="deployment=nodejs-postgresql-example-1"

# or 

kubectl get pods --show-labels -l "deployment=nodejs-postgresql-example-1"
>>>
NAME READY STATUS RESTARTS AGE LABELS
nodejs-postgresql-example-1-jjcn8 1/1 Running 0 9m48s app.openshift.io/runtime=nodejs,deployment=nodejs-postgresql-example-1,deploymentconfig=nodejs-postgresql-example,name=nodejs-postgresql-example

Enter fullscreen mode Exit fullscreen mode

Piccola nota: l’opzione –show-labels non è necessaria, ma serve a confermare l’output ottenuto!

Con questa opzione è possibile specificare anche più di una label contemporaneamente, per essere sicuri/e di matchare tutte le risorse che ci interessano, separando le chiavi con i valori da una virgola:

kubectl get pods --show-labels -l "deployment=postgresql-1,name=postgresql"
NAME READY STATUS RESTARTS AGE LABELS
postgresql-1-fsw24 1/1 Running 0 23m deployment=postgresql-1,deploymentconfig=postgresql,name=postgresql

Enter fullscreen mode Exit fullscreen mode

Se invece volessimo selezionare tutti gli oggetti che hanno la chiave deployment, sarebbe sufficiente utilizzare la seguente opzione:

kubectl get pods --show-labels --selector="deployment"
>>>
NAME READY STATUS RESTARTS AGE LABELS
nodejs-postgresql-example-1-jjcn8 1/1 Running 0 10m app.openshift.io/runtime=nodejs,deployment=nodejs-postgresql-example-1,deploymentconfig=nodejs-postgresql-example,name=nodejs-postgresql-example
postgresql-1-fsw24 1/1 Running 0 12m deployment=postgresql-1,deploymentconfig=postgresql,name=postgresql

Enter fullscreen mode Exit fullscreen mode

Inoltre, è possibile utilizzare l’opzione –selector anche per specificare più di un valore che ci si aspetta per una certa chiave: nel seguente esempio, andiamo a riportare tutti i Pod che hanno una chiave name il cui valore èpostgresql o nodejs-postgresql-example.

kubectl get pods --show-labels --selector="name in (postgresql, nodejs-postgresql-example)"
>>>
NAME READY STATUS RESTARTS AGE LABELS
nodejs-postgresql-example-1-jjcn8 1/1 Running 0 13m app.openshift.io/runtime=nodejs,deployment=nodejs-postgresql-example-1,deploymentconfig=nodejs-postgresql-example,name=nodejs-postgresql-example
postgresql-1-fsw24 1/1 Running 0 14m deployment=postgresql-1,deploymentconfig=postgresql,name=postgresql

Enter fullscreen mode Exit fullscreen mode

E come fare per escludere una label tra quelle di cui non vogliamo riportare le risorse? Possiamo utilizzare l’operatore di disuguaglianza “!=”, come mostrato di seguito: nell’output avremo tutti quei Pod che non hanno una chiave deployment con il valore specificato:

kubectl get pods --show-labels --selector="deployment!=nodejs-postgresql-example-1"
>>>
NAME READY STATUS RESTARTS AGE LABELS
nodejs-postgresql-example-1-build 0/1 Completed 0 16m openshift.io/build.name=nodejs-postgresql-example-1
nodejs-postgresql-example-1-deploy 0/1 Completed 0 14m openshift.io/deployer-pod-for.name=nodejs-postgresql-example-1
postgresql-1-deploy 0/1 Completed 0 16m openshift.io/deployer-pod-for.name=postgresql-1
postgresql-1-fsw24 1/1 Running 0 16m deployment=postgresql-1,deploymentconfig=postgresql,name=postgresql

Enter fullscreen mode Exit fullscreen mode

Questo vuol dire che saremo in grado di cancellare tutte le risorse associate a una o più label:

kubectl delete all,configmap,pvc,serviceaccount,rolebinding --selector="name in (postgresql, nodejs-postgresql-example)"
>>>
pod "nodejs-postgresql-example-1-jjcn8" deleted
pod "postgresql-1-fsw24" deleted

Enter fullscreen mode Exit fullscreen mode

Tutto ciò che abbiamo visto finora, vale anche per cluster OpenShift! 😉

Risorse utili

Top comments (0)