Selettori e affinità dei nodi
Controlli dove vengono pianificati i Pod utilizzando i selettori dei nodi e regole più espressive di affinità tra nodi e Pod.
Selettori e affinità dei nodi è una lezione DevOps Bootcamp gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento DevOps Bootcamp, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso DevOps Bootcamp include 4 lezioni in totale.
Controllare dove vengono eseguiti i Pod
Per impostazione predefinita, Kubernetes pianifica i Pod su qualsiasi nodo disponibile. Ma cosa succede se desiderate un controllo maggiore?
A volte è necessario eseguire i Pod su nodi specifici. Ad esempio, questi nodi potrebbero avere hardware speciale, licenze specifiche oppure trovarsi in determinate zone di disponibilità.
In questa lezione vedrete come indirizzare lo scheduler di Kubernetes utilizzando i Node Selector e la Node Affinity.
Perché indirizzare lo scheduler?
Immaginate di avere un Pod di database che deve essere eseguito su un nodo dotato di SSD ad alte prestazioni, oppure un'applicazione che usa intensivamente la GPU e richiede hardware specifico.
Potreste anche voler tenere separati determinati Pod per garantire la tolleranza ai guasti, oppure assicurarvi che vengano eseguiti su nodi con specifici sistemi operativi.
Kubernetes offre strumenti per esprimere queste preferenze di pianificazione.
I nodi hanno delle label
Prima di poter indicare ai Pod dove andare, i nodi devono avere un'identità. Kubernetes utilizza le label per identificare i nodi in base alle loro caratteristiche.
- Le label sono coppie chiave-valore, come
disk=ssdogpu=true. - Potete aggiungere label personalizzate ai nodi utilizzando
kubectl label nodes <node-name> <key>=<value>. - Queste label consentono di selezionare nodi specifici per il posizionamento dei Pod.
Node Selector: corrispondenza semplice
Il modo più semplice per vincolare un Pod a un determinato insieme di nodi consiste nell'utilizzare nodeSelector.
È un campo della specifica del Pod che contiene una mappa di coppie chiave-valore. Il Pod verrà pianificato solo sui nodi che presentano tutte queste label.
È come dire: "Mi serve un nodo esattamente con queste caratteristiche".
Node Selector in azione
Supponiamo di avere nodi con la label disk=ssd. Ecco come eseguire un Pod solo su questi nodi:
apiVersion: v1
kind: Pod
metadata:
name: ssd-app
spec:
containers:
- name: my-container
image: nginx
nodeSelector:
disk: ssdNode Affinity: corrispondenza avanzata
Sebbene nodeSelector sia semplice da usare, è molto rigido. E se voleste indicare nodi "preferiti" o regole di corrispondenza più complesse?
La Node Affinity offre maggiore flessibilità. Consente di esprimere requisiti "soft" o "hard" affinché i Pod vengano eseguiti su nodi con label specifiche.
Utilizza una sintassi più potente, con operatori come In, NotIn, Exists, DoesNotExist, Gt e Lt.
Affinity obbligatoria e preferita
La node affinity ha due tipi principali:
requiredDuringSchedulingIgnoredDuringExecution: il Pod deve essere pianificato su un nodo che soddisfa le regole. Se non esiste un nodo di questo tipo, il Pod non verrà pianificato.preferredDuringSchedulingIgnoredDuringExecution: lo scheduler cerca un nodo che soddisfi le regole, ma se non ne è disponibile nessuno pianifica comunque il Pod altrove. È un approccio "best effort".
Node Affinity obbligatoria
Ecco un Pod che richiede un nodo con la label env=production. Se non esiste un nodo di questo tipo, il Pod rimarrà in attesa.
apiVersion: v1
kind: Pod
metadata:
name: prod-app
spec:
containers:
- name: my-container
image: httpd
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- productionPod Affinity: contano anche gli altri Pod
E se voleste pianificare i Pod in base al luogo in cui sono in esecuzione altri Pod?
- Pod Affinity: avvicina i Pod ai nodi in cui sono già in esecuzione altri Pod con label specifiche. È utile per collocare sullo stesso nodo servizi che comunicano frequentemente.
- Pod Anti-affinity: allontana i Pod dai nodi in cui sono in esecuzione altri Pod con label specifiche. È ideale per distribuire le repliche tra più nodi e garantire un'elevata disponibilità.
La Pod Anti-affinity nella pratica
Questo manifest garantisce che due Pod con la label app=my-web non possano essere pianificati sullo stesso nodo. In questo modo migliora la tolleranza ai guasti.
topologyKey specifica il dominio a cui si applica l'anti-affinity (ad esempio, nodo o zona).
apiVersion: v1
kind: Pod
metadata:
name: web-app-pod
labels:
app: my-web
spec:
containers:
- name: web-container
image: busybox
command: ["sh", "-c", "echo 'Hello from web-app'; sleep 3600"]
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: my-web
topologyKey: "kubernetes.io/hostname"Verificate le vostre conoscenze
Desiderate assicurarvi che i Pod del vostro database critico non vengano mai pianificati su nodi con la label zone=dev. Quale tipo di regola di pianificazione utilizzereste per questa esclusione rigida basata sulle label dei nodi?
Riepilogo: controllo della pianificazione
Ottimo lavoro! Avete imparato metodi efficaci per controllare dove vengono eseguiti i vostri Pod:
- Node Label: coppie chiave-valore che identificano le caratteristiche dei nodi.
- Node Selector: corrispondenza semplice e rigida per pianificare i Pod su nodi con label specifiche.
- Node Affinity: regole più flessibili (obbligatorie o preferite) per selezionare i nodi, con l'uso di operatori.
- Pod Affinity/Anti-affinity: collocazione sullo stesso nodo o separazione dei Pod in base alla posizione di altri Pod.
Questi strumenti sono fondamentali per ottimizzare l'uso delle risorse, garantire la tolleranza ai guasti e soddisfare esigenze specifiche delle applicazioni.
Domande Frequenti
La lezione «Selettori e affinità dei nodi» è gratuita?
Sì — il testo completo di «Selettori e affinità dei nodi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso DevOps Bootcamp, passa a CoddyKit PRO. Il corso DevOps Bootcamp include 4 lezioni in totale.
Cosa imparerò in «Selettori e affinità dei nodi»?
Controlli dove vengono pianificati i Pod utilizzando i selettori dei nodi e regole più espressive di affinità tra nodi e Pod. Eserciti DevOps Bootcamp con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare DevOps Bootcamp?
Non è richiesta alcuna esperienza precedente. DevOps Bootcamp su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Selettori e affinità dei nodi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione DevOps Bootcamp?
Sì. Ogni lezione DevOps Bootcamp include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Richieste e limiti delle risorse
- Selettori e affinità dei nodi
- Taint e toleration
- Priorità e preemption dei Pod