Svuotamento dal load balancer#
Un deploy in place su server o VM dietro un load balancer interrompe le richieste in corso e manda traffico a un nodo che sta ripartendo. Con un pool nella configurazione di ambiente manent toglie ogni lotto di un rilascio a ondate dal load balancer prima di aggiornarlo e lo rimette in servizio solo quando il load balancer lo vede sano.
rollout:
waves:
- {name: canary, select: "canary=true"}
- {name: resto, select: "canary!=true"}
maxUnavailable: "1"
traffic:
pool:
provider: haproxy
member: "{host}" # nome del server nel backend
drain_timeout: 5m # attesa massima delle connessioni residue
min_healthy: "66%" # membri sani da tenere sempre in servizio
on_timeout: proceed # proceed | fail
settings:
dataplane_urls: "https://lb1.internal:5555,https://lb2.internal:5555"
backend: shop
credentials_secret: haproxy-dataplane
secrets:
- {name: haproxy-dataplane, ref: "vault:secret/data/lb#dataplane"}
Il pool è infrastruttura: sta solo nella configurazione di ambiente. Un descrittore con la sezione traffic viene rifiutato. Il pool richiede un rilascio a ondate: senza lotti tutti i target verrebbero svuotati insieme, e il deploy fallisce nello step config.
Sequenza di un lotto#
Per ogni lotto, intorno agli step da deploy ad activation:
drain@<passo>#<lotto>legge lo stato del pool e verifica la capacità: se togliendo il lotto i membri sani in servizio scenderebbero sottomin_healthy(per esempio perché un altro nodo è già fuori per un guasto), lo svuotamento viene rimandato. manent attendepoll_intervale riprova (drain@…#0.1,#0.2, …) fino adrain_timeout, poi il passo fallisce. È il controllo che impedisce a un deploy di finire di spegnere un servizio già degradato.drain-wait@…attende la fine delle connessioni residue, con letture e pause durevoli: un'attesa di cinque minuti sopravvive a un crash del worker. Allo scadere didrain_timeout, conon_timeout: proceedil deploy prosegue (le connessioni residue vengono chiuse dal riavvio); confailil lotto torna in servizio senza essere toccato e il passo fallisce.- Gli step del lotto:
deploy,post-teste gli step personalizzati, con il nodo fuori dal traffico. restore@…rimette il lotto in servizio prima diactivation(o alla fine del lotto) erestore-wait@…attende che il load balancer lo veda sano, fino arestore_timeout. Un nodo non torna mai in servizio senza essere sano.
Lo stato del rollout (manent status, interfaccia web) riporta per ogni passo i membri fuori dal load balancer (drained).
Errori e rollback#
Con il rollback attivo, drain e restore partecipano alle compensazioni in ordine inverso: un lotto già rimesso in servizio viene prima svuotato di nuovo, poi riportato alla release precedente, poi rimesso in servizio. Così il traffico torna solo su una release sana. Senza rollback, o con onFailure: stop, un nodo svuotato resta fuori e lo stato lo segnala.
In dry-run il pool non viene toccato.
Provider#
| Provider | Svuotamento | Vuoto quando | Rientro e salute |
|---|---|---|---|
haproxy |
Data Plane API su ogni istanza attiva: admin_state: drain |
sessioni correnti (scur) a 0 su tutte le istanze |
admin_state: ready; sano se operational_state: up ovunque |
aws-elb |
DeregisterTargets dal target group, o EnterStandby se indicato un Auto Scaling group |
target non più in draining |
RegisterTargets o ExitStandby; sano se healthy nel target group |
health-flag |
l'applicazione risponde 503 al proprio health check: chiamata HTTP o file flag via SSH | dopo drain_delay |
flag tolto; sano se health_url risponde 200 |
f5 |
iControl REST sul membro del pool LTM: session: user-disabled (proseguono le connessioni esistenti e persistenti) |
serverside.curConns a 0 |
session: user-enabled, state: user-up; sano se il monitor lo vede up |
nginx-plus |
API di NGINX Plus su ogni istanza: drain: true sul server dell'upstream |
connessioni active a 0 su tutte le istanze |
drain: false, down: false; sano se up per gli health check attivi |
nginx |
NGINX open source via SSH: parametro down sul server in un file dedicato incluso nell'upstream, poi nginx -t && nginx -s reload su ogni istanza |
dopo drain_delay |
down tolto e ricarica; sano se presente e non down |
iis-arr |
IIS Application Request Routing, PowerShell sul server ARR: stato ARR Drain del server della farm | richieste in corso del server a 0 | stato Available; sano se ARR lo vede sano. Vedi windows |
nlb |
Windows Network Load Balancing, PowerShell su un nodo del cluster: Stop-NlbClusterNode -Drain (fino a drain_timeout, poi il nodo si ferma) |
nodo Stopped |
Start-NlbClusterNode; sano se Converged. Vedi windows |
haproxy#
| Impostazione | Descrizione |
|---|---|
dataplane_urls |
URL della Data Plane API di ogni istanza attiva, separati da virgola: lo stato cambia su tutte. |
backend |
Backend con i server. |
credentials_secret |
Segreto utente:password della Data Plane API. |
api_version |
v3 (default) o v2. |
ca_file, allow_http |
CA dedicata; "true" per ammettere URL http (solo sviluppo). |
aws-elb#
| Impostazione | Descrizione |
|---|---|
region, target_group_arn |
Target group dei membri. Il membro è l'ID del target: l'ID dell'istanza (member: "{label.instance_id}") o l'IP. |
port |
Porta dei target (default: quella del target, o quella del target group). |
auto_scaling_group |
Con un Auto Scaling group lo svuotamento usa lo standby, altrimenti l'ASG potrebbe sostituire l'istanza deregistrata. |
access_key_id_secret, secret_access_key_secret, role_arn, … |
Credenziali, come per i plugin AWS. |
Permessi minimi: elasticloadbalancing:DescribeTargetHealth, RegisterTargets, DeregisterTargets sul target group; con l'Auto Scaling group anche autoscaling:DescribeAutoScalingInstances, EnterStandby, ExitStandby.
f5#
| Impostazione | Descrizione |
|---|---|
management_url |
URL di gestione del BIG-IP attivo. |
pool, partition |
Pool LTM e partizione (default Common). Il membro è indirizzo:porta (member: "{host}:{port}"). |
credentials_secret |
Segreto utente:password di un ruolo limitato ai membri del pool. |
sync_group |
Device group da sincronizzare (config-sync to-group) dopo ogni modifica. |
nginx-plus#
| Impostazione | Descrizione |
|---|---|
api_urls |
URL dell'API di ogni istanza (es. https://lb1:8080/api), separati da virgola. |
upstream |
Upstream http con i server; il membro è il server come nell'upstream (member: "{host}:{port}"). |
api_version |
Versione dell'API (default 9). |
credentials_secret |
Facoltativo: segreto utente:password se l'API è protetta con basic auth. |
nginx#
NGINX open source non ha un'API a runtime: manent riscrive via SSH un file dedicato (include dentro il blocco upstream), con una copia temporanea e un rename, e ricarica NGINX su ogni istanza. Non conosce le connessioni né la salute dei server.
| Impostazione | Descrizione |
|---|---|
lb_hosts |
Host delle istanze di NGINX, separati da virgola (ssh_port, default 22). |
upstream_file |
Percorso assoluto del file con le righe server indirizzo:porta …; gestite da manent; il membro è l'indirizzo (member: "{host}:{port}"). |
ssh_user, ssh_key_secret o ssh_password_secret, known_hosts |
Accesso SSH alle istanze, con un utente che può scrivere il file e ricaricare NGINX. |
reload_command |
Verifica e ricarica (default nginx -t && nginx -s reload). |
drain_delay |
Attesa dopo la ricarica (default 30s). |
health-flag#
Funziona con qualunque load balancer, ma non conosce gli altri membri del pool: il controllo di capacità non è disponibile e l'attesa è un tempo fisso.
| Impostazione | Descrizione |
|---|---|
mode |
http (default) o file. |
drain_url |
http: URL chiamato con drain_method (default PUT) per svuotare e con restore_method (default DELETE) per rientrare; {host}, {port} e {label.<nome>} vengono sostituiti. |
token_secret |
http: segreto con un bearer token. |
path |
file: file flag creato e rimosso via SSH (ssh_user, ssh_key_secret o ssh_password_secret, known_hosts). |
health_url |
Sonda della salute dopo il rientro (http(s)://{host}…). |
drain_delay |
Tempo che il load balancer impiega a vedere il target fuori servizio (default 30s). |
Riferimento#
traffic.pool |
Default | Descrizione |
|---|---|---|
provider |
haproxy, aws-elb, health-flag, f5, nginx-plus, nginx, iis-arr, nlb. |
|
member |
{host} |
Nome del membro di un target: {host}, {port}, {label.<nome>}. |
drain_timeout |
5m |
Attesa massima della capacità e delle connessioni residue. |
restore_timeout |
5m |
Attesa massima del rientro in salute. |
poll_interval |
5s |
Frequenza delle letture durante le attese. |
min_healthy |
1 |
Membri sani da tenere in servizio: numero o percentuale dei membri del pool. |
on_timeout |
proceed |
proceed o fail. |
settings |
Impostazioni del provider; i segreti si indicano per nome. |