Label e selector in Kubernetes

  • Di
  • 2023-05-18 - 3 minuti
banner

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

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

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

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

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

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

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

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

Risorse utili

Post correlati

Partners

Community, aziende e persone che supportano attivamente il blog

image
image
image
image
image
image
image
image

Iscriviti alla newsletter

Per non perderti gli ultimi articoli e per vincere biglietti e gadget TheRedCode

Riceverai una volta al mese (o anche meno) gli articoli più interessanti pubblicati sul blog, e potrai provare a vincere un biglietto per uno dei prossimi eventi!

Andiamo!