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

Logo di Codemotion
Logo di GrUSP
Logo di Python Milano
Logo di Schrodinger Hat
Logo di Python Biella Group
Logo di Fuzzy Brains
Logo di Django Girls
Logo di Improove
Logo del libro open source

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!