Label e selector in Kubernetes
Published: 2023-10-03 14:23:33

---
title: Label e selector in Kubernetes
published: true
date: 2023-05-18 00:00:00 UTC
tags: 
canonical_url: 
---

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](https://amzn.to/3cSVvUG) - per cominciare bene con Docker e Kubernetes
- [Kubernetes](https://amzn.to/44bLfyR) - Guida per gestire e orchestrare i container
- [Come installare Docker (e Docker Compose)](https://www.youtube.com/watch?v=Xea_9GYFpaA)
- [Esplorando il Dockerfile](https://www.theredcode.it/esplorando-il-dockerfile/)
- [Canale di Emmecilab](https://www.youtube.com/c/EmmeCiLab/about)