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
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
- Docker - per cominciare bene con Docker e Kubernetes
- Kubernetes - Guida per gestire e orchestrare i container
- Come installare Docker (e Docker Compose)
- Esplorando il Dockerfile
- Canale di Emmecilab