civil-and-structural-engineering
Distribuzione di contenitori Docker con Traefik come un proxy dinamico inverso
Table of Contents
Traefik, un moderno proxy dinamico inverso e bilanciamento del carico, automatizza queste attività integrando direttamente con Docker. A differenza delle tradizionali proxies che richiedono aggiornamenti manuali di configurazione dei file ogni volta che un contenitore inizia o si ferma, Traefik ascolta la testa di demoni Docker e si riconfigura sul volano.
Cos'è Traefik?
Traefik è un delega inversa open source e bilanciatore di carico costruito appositamente per microservizi e architetture containerizzate. Supporta più fornitori - Docker, Kubernetes, Consul, Amazon ECS, e altri - consentendo la scoperta automatica del servizio e il routing dinamico. Quando un nuovo contenitore è iniziato con le etichette appropriate, Traefik rileva immediatamente e aggiorna le sue regole di routing senza un riavvio o intervento manuale.
- SV/TLS automatico[[]] con gestione automatica del certificato tramite Let's Encrypt (ACME).
- Supporto per i servizi di posta[] per il limitatore di velocità, l'autenticazione, la riscrittura delle richieste e altro ancora.
- Il monitoraggio del completamento[] con una dashboard web e metriche Prometheus.
- Basare il bilanciamento[] attraverso più istanze dei container.
- Configurazione dinamica[[]] tramite file, etichette o API.
L'architettura di Traefik separa ] punti di entrata[] (porti dove arriva il traffico), routers (regole corrispondenti richieste in arrivo), e servizi[]]] (gruppi container backend).
Prerequisiti
Prima di immergersi nella configurazione, assicurarsi di avere i seguenti:
- Un server o una macchina locale in esecuzione Docker Engine (versione 20.10 o successiva consigliata).
- La familiarità di base con i comandi Docker e i concetti di rete.
- Nome di dominio (per esempi HTTPS) e capacità di puntare i record DNS sul server.
- Porte 80] e 443]] aperto sul firewall per il traffico HTTP e HTTPS.
Se si utilizza un provider cloud come AWS o DigitalOcean, assicurarsi che il gruppo di sicurezza consenta il traffico in entrata su questi porti.
Impostazione Docker con Traefik
Questa sezione attraversa i passi fondamentali: creare una rete Docker dedicata, lanciare il contenitore Traefik con una configurazione appropriata e verificare che sia in esecuzione correttamente.
Creazione di una rete Docker
Tutti i contenitori — Traefik stesso e i contenitori di applicazione — dovrebbero condividere la stessa rete Docker per una comunicazione senza soluzione di continuità.
docker network create traefik-net
Utilizzando una rete personalizzata previene i conflitti con la rete di ponti predefiniti e consente ai contenitori di risolversi a vicenda per nome. Traefik utilizzerà le etichette Docker per scoprire i servizi, ma la connettività di rete è necessaria per il traffico per raggiungere i contenitori di applicazione.
Eseguire il contenitore Traefik
Avviare Traefik con il seguente comando. Si noti che montamo la presa Docker per consentire a Traefik di ascoltare per eventi container, porte mappa 80 e 443, e legare un file di configurazione.
docker run -d \
--name=traefik \
--network=traefik-net \
-p 80:80 \
-p 443:443 \
-p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $PWD/traefik.yml:/traefik.yml \
-v $PWD/acme.json:/acme.json \
traefik:v2.9
Explanation of the options:
- e : Esporre punti di ingresso HTTP e HTTPS.
- : Esporre il cruscotto (sicurarlo più tardi con l'autenticazione).
- : Fornisci l'accesso all'API Docker. Questo è necessario per il rilevamento dinamico, ma introduce implicazioni di sicurezza (discusso in seguito).
- e : configurazione statica a montaggio binario e archiviazione del certificato SSL.
Assicurare che il file esiste con i permessi (leggi / scrivi solo per la radice) prima di iniziare Traefik:
touch acme.json && chmod 600 acme.json
Configurazione Traefik
La configurazione di Traefik è suddivisa in due parti: static] configurazione (solitamente in un file) e [dinamica[]] configurazione (da fornitori come le etichette Docker). Il file statico definisce i punti di ingresso, i provider e le impostazioni globali come il livello di registrazione e l'attivazione del cruscotto.
Configurazione statica (traefik.yml)
Creare un file nella stessa directory da cui eseguire il contenitore. Di seguito è un esempio di produzione-ready con punti di ingresso HTTP e HTTPs, configurazione del fornitore Docker e Let's Encrypt for SSL.
entryPoints:
web:
address: ":80"
# Redirect HTTP to HTTPS if desired (commented out for initial setup)
# http:
# redirections:
# entryPoint:
# to: web-secure
# scheme: https
web-secure:
address: ":443"
dashboard:
address: ":8080"
providers:
docker:
exposedByDefault: false # Only expose containers with traefik.enable=true
network: traefik-net
api:
dashboard: true
debug: true
certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: /acme.json
httpChallenge:
entryPoint: web
log:
level: INFO
Punti chiave:
- Punti di entrata[]: Definire i porti nominati. Il [ punto di entrata utilizza la porta 80; ] usa 443; usa 8080.
- Providers[[]: Il fornitore di Docker è configurato con [ – solo i contenitori con l'etichetta saranno indirizzati, evitando così l'esposizione accidentale dei servizi.
- API & Dashboard[[[]: Abilitare il cruscotto per il debugging. In produzione, si dovrebbe garantire questo con middleware di autenticazione (vedere sezione avanzata).
- Certificate risolutore[[]: Usa il protocollo ACME di Crittografia con la sfida HTTP-01. Sostituisci [ con la tua email.
- Livello di log[: Impostare ] per il normale funzionamento; utilizzare durante la risoluzione dei problemi.
Configurazione dinamica tramite etichette Docker
Quando Traefik viene eseguito con il provider Docker, legge le etichette dai container in esecuzione. Le etichette sono metadati attaccati ai container che definiscono regole di routing, middleware e altre impostazioni. Ad esempio, un semplice servizio web potrebbe avere etichette come:
docker run -d \
--name=app1 \
--network=traefik-net \
-l "traefik.enable=true" \
-l "traefik.http.routers.app1.rule=Host(`app1.example.com`)" \
-l "traefik.http.routers.app1.entrypoints=web-secure" \
-l "traefik.http.routers.app1.tls.certResolver=letsencrypt" \
my-web-image
Le etichette sono analizzate da Traefik per costruire router, servizi e middleware dinamicamente. Qualsiasi cambiamento nelle etichette ha effetto immediatamente senza riavviare Traefik.
Distribuzione di contenitori di applicazione
Ora discutiamo contenitori di applicazione reali con etichette che dicono a Traefik come indirizzare il traffico. Di seguito sono due modelli comuni: un servizio di dominio singolo e un routing basato sul percorso per più servizi.
Esempio 1: Servizio Web semplice con HTTPS
Si supponga che si dispone di un contenitore che esegue un'app web sul porto 80 internamente. L'obiettivo è quello di servirlo a .
docker run -d \
--name=myapp \
--network=traefik-net \
-l "traefik.enable=true" \
-l "traefik.http.routers.myapp.rule=Host(`myapp.example.com`)" \
-l "traefik.http.routers.myapp.entrypoints=web-secure" \
-l "traefik.http.routers.myapp.tls=true" \
-l "traefik.http.routers.myapp.tls.certResolver=letsencrypt" \
-l "traefik.http.services.myapp.loadbalancer.server.port=80" \
my-web-app-image
Si noti che specifichiamo esplicitamente la porta interna ([[]) perché il contenitore può esporre più porte. Se la porta del contenitore è corretta, Traefik può auto-rilevarla, ma esplicita è più sicura.
Esempio 2: Routing basato su percorso per servizi multipli
Supponiamo che abbiate due microservizi — e — sia sullo stesso dominio ]. Route al [[FLT: 30]] contenitore e a ]].
Per il servizio API:
docker run -d \
--name=api \
--network=traefik-net \
-l "traefik.enable=true" \
-l "traefik.http.routers.api.rule=Host(`app.example.com`) && PathPrefix(`/api`)" \
-l "traefik.http.routers.api.entrypoints=web-secure" \
-l "traefik.http.routers.api.tls=true" \
-l "traefik.http.routers.api.tls.certResolver=letsencrypt" \
-l "traefik.http.services.api.loadbalancer.server.port=3000" \
api-image
Per il frontend:
docker run -d \
--name=frontend \
--network=traefik-net \
-l "traefik.enable=true" \
-l "traefik.http.routers.frontend.rule=Host(`app.example.com`) && PathPrefix(`/`)" \
-l "traefik.http.routers.frontend.entrypoints=web-secure" \
-l "traefik.http.routers.frontend.tls=true" \
-l "traefik.http.routers.frontend.tls.certResolver=letsencrypt" \
-l "traefik.http.services.frontend.loadbalancer.server.port=80" \
frontend-image
Traefik valuta le regole in ordine di specificità; i percorsi più specifici (come []) sono abbinati per primo, garantendo le corrette maniglie di backend ogni richiesta.
Caratteristiche avanzate Traefik
Oltre al routing di base, Traefik offre potenti funzionalità che migliorano la sicurezza, l'affidabilità e l'osservabilità.
I medi
I middleware sono funzioni che elaborano le richieste prima di raggiungere il backend, possono essere incatenati e riutilizzati attraverso i router.
- BasicAuth[]: Proteggere la dashboard o un ambiente di stadiazione.
- RateLimit[]: richieste di treppia da un unico IP.
- Headers[]: Aggiungi intestazioni di sicurezza (ad esempio , ]]).
- RedirectScheme[: Forza HTTP alla reindirizzamento HTTPS.
- IPWhiteList[[]]: Limitare l'accesso a intervalli IP specifici.
Esempio: proteggere il cruscotto Traefik con HTTP Basic Auth. Prima creare un file :
htpasswd -nB user | tee -a .htpasswd
Quindi definire un middleware in un file di configurazione dinamico (o tramite etichette sul contenitore Traefik) e fare riferimento sul router del cruscotto.Per semplicità, posizionare middleware in un file separato (ad esempio, ) e caricarlo tramite il provider di file:
http:
middlewares:
dashboard-auth:
basicAuth:
usersFile: /etc/traefik/.htpasswd
Quindi aggiornare il contenitore Traefik per montare anche e il file , e aggiungere una sezione del file provider :
providers:
file:
filename: /dynamic.yml
Infine, etichettare il router del cruscotto per utilizzare il middleware (o definire il router del cruscotto nel provider di file).
Bilanciamento del carico
Traefik distribuisce richieste in entrata utilizzando un algoritmo di rotoballo per impostazione predefinita. È possibile regolare pesi e stickiness tramite etichette. Ad esempio, diffondere il traffico 70/30 tra due versioni di un'app:
docker run -d \
--name=myapp-v1 \
--network=traefik-net \
-l "traefik.http.services.myapp.loadbalancer.server.port=80" \
-l "traefik.http.routers.myapp.rule=Host(`app.example.com`)" \
-l "traefik.http.routers.myapp.service=myapp" \
myapp:v1
docker run -d \
--name=myapp-v2 \
--network=traefik-net \
-l "traefik.http.services.myapp.loadbalancer.server.port=80" \
-l "traefik.http.services.myapp.loadbalancer.server.weight=30" \
myapp:v2
Controlli sanitari
Traefik può monitorare la salute del contenitore e smettere di instradare in caso di malsano. Configurare i controlli sanitari sul servizio del bilanciatore di carico tramite etichette:
-l "traefik.http.services.myapp.loadbalancer.healthcheck.path=/health"
-l "traefik.http.services.myapp.loadbalancer.healthcheck.interval=10s"
-l "traefik.http.services.myapp.loadbalancer.healthcheck.timeout=3s"
Se un contenitore non riesce a controllare la salute, Traefik lo rimuove dalla piscina fino a quando non passa di nuovo.
Monitoraggio con Dashboard e Metrics
Il cruscotto (disponibile per impostazione predefinita alla porta 8080) fornisce visibilità in tempo reale su router, servizi, middleware e salute.
metrics:
prometheus:
addEntryPointsLabels: true
addServicesLabels: true
Quindi raschiare il punto finale metrico (default ) da Prometheus e visualizzare con Grafana.
Vantaggi dell'utilizzo di Traefik
Traefik semplifica i flussi di lavoro di distribuzione dei container in modi che i tradizionali proxy inversa non possono corrispondere:
- Zero-touch routing[[: I nuovi contenitori vengono scoperti e indirizzati automaticamente senza riavviare i file di configurazione del proxy o della modifica.
- Integrated SSL[[]: Let's Encrypt integration automatizza l'emissione e il rinnovo del certificato, riducendo gli errori di sovraccarico manuale e di scadenza del certificato.
- Layer 7 routing[[]: Supporto per il prefisso del percorso, host, intestazioni, parametri di query e combinazioni di regole complesse.
- ecosistema di middleware[[]: ricco insieme di middleware incorporati per sicurezza, trasformazione e ottimizzazione.
- Multi-provider supporto[[]: Usa Docker, Kubernetes, Console, o anche la configurazione semplice basata su file — Traefik si adatta.
- Observability[[]: Dashboard, logs e metriche aiutano a diagnosticare rapidamente i problemi di routing.
Questi vantaggi si traducono in cicli di distribuzione più veloci, meno errori di configurazione e più facile scaling. Quando un contenitore viene replicato, Traefik carica automaticamente le bilanciazioni tra le istanze; quando un contenitore si blocca, il proxy inverso interrompe immediatamente l'invio del traffico ad esso.
Risoluzione dei problemi Problemi comuni
Anche con l'automazione di Traefik, possono sorgere problemi, qui di seguito sono frequenti insidie e le loro soluzioni.
- Container non appare in percorsi[[]: Verificare che il contenitore è attaccato alla stessa rete Docker ([]) e ha l'etichetta .
- Certificato SSL non ottenuto[[[[]]: Assicurare che il dominio si risolva all'IP pubblico del server. Controllare che la porta 80 sia raggiungibile per la sfida HTTP-01. Se si utilizza una sfida DNS, configurare correttamente il provider.
- Dashboard non raggiungibile[[]: Il cruscotto viene servito sulla porta 8080 per impostazione predefinita. Se si modifica il nome o la porta del punto di entrata, regolare le etichette per il router del cruscotto. Inoltre, assicurarsi che il sia impostato in configurazione statica.
- Regole di compensazione non corrispondenti[[]]: Traefik valuta le regole in ordine string. Se due router corrispondono alla stessa richiesta, viene utilizzata la regola più specifica.
- 502 Bad Gateway[[]: Questo di solito indica che Traefik non può raggiungere il container backend. Assicurare che il contenitore ascolti sul porto specificato in [ e che la rete del contenitore permette il traffico da Traefik (entrambi devono essere sulla stessa rete di sovrapposizione o ponte).
Inizia sempre con quando si cerca di risolvere i problemi per vedere le decisioni di routing dettagliate.
Considerazioni di sicurezza
Eseguire Traefik con il montaggio a presa Docker introduce il rischio intrinseco: se un aggressore ottiene il controllo del contenitore Traefik, possono manipolare il demone Docker.
- Ristricizzare l'accesso alla presa Docker[[]: Utilizzare soluzioni proxy socket come per filtrare le chiamate API.
- Running Traefik come utente non root[[]] con capacità limitate (utilizza ] e drop ).
- Reti di isolamento: Non collegare Traefik alla stessa rete di contenitori non fidati.
- Abilita l'autenticazione per il cruscotto[] e l'utilizzo di HTTPS per gli endpoint di admin.
- Aggiornamenti regolari[: Tenere Traefik e la sua immagine di base fino ad oggi.
Inoltre, configurare le regole firewall per limitare l'accesso alla porta 8080 solo da IP interni (ad esempio, la tua VPN).
Confronto con altri proxy inversa
Traefik non è l'unico proxy inverso per Docker; Nginx e HAProxy sono alternative popolari.
- vs. Nginx[]: Nginx richiede la gestione manuale dei file di configurazione o strumenti come nginx-proxy. Traefik fornisce l'integrazione nativa Docker senza script aggiuntivi. Nginx ha un supporto più ampio della comunità ed è più leggero per semplici configurazioni, ma la riconfigurazione dinamica di Traefik è superiore per ambienti in rapida evoluzione.
- vs. HAProxy[[]: HAProxy eccelle al bilanciamento e alle prestazioni del carico TCP grezzo, ma manca di scoperta automatica del servizio e integrazione Let's Encrypt. Traefik è più opinionizzato e più facile da configurare per HTTP/HTTPS in un ecosistema containerizzato.
- vs. Caddy[]: Caddy dispone anche di HTTPS automatico e di una semplice configurazione, ma Traefik offre un supporto middleware più ricco e una dashboard. Caddy è più semplice per le implementazioni single-container; Traefik scale meglio per i microservizi.
Per le squadre che utilizzano Docker Compose o Kubernetes, l'integrazione dei fornitori di Traefik riduce significativamente il peso operativo.
Conclusioni
Traefik trasforma l'implementazione dei container Docker, agendo come un proxy inverso intelligente e autoconfigurante. La sua capacità di scoprire automaticamente i servizi, gestire i certificati SSL e il traffico di route basato sulle etichette elimina molti passaggi manuali che rallentano lo sviluppo e le operazioni.