Migliora la gestione del traffico di rete: come integrare Traefik nella tua infrastruttura
Traefik è un reverse proxy e un load balancer moderno progettato per gestire facilmente le richieste HTTP e HTTPS. È stato creato per essere altamente scalabile e per supportare l’orchestrazione dei container, come Docker e Kubernetes. Scritto in Go il suo codice è open source.
Il ruolo di un reverse proxy
Un reverse proxy è un server che agisce come intermediario tra un client e uno o più server backend. In pratica, il client fa una richiesta al reverse proxy, che a sua volta inoltra la richiesta al server backend appropriato. Il server backend risponde al reverse proxy, che a sua volta inoltra la risposta al client.
Il vantaggio di utilizzare un reverse proxy è che esso “nasconde” l’infrastruttura dietro di esso al client. Invece di interagire direttamente con il server backend, il client interagisce esclusivamente con il reverse proxy. Inoltre, il reverse proxy può svolgere varie funzioni come il bilanciamento del carico, la gestione della cache, la gestione degli errori e tiene traccia delle possibili richieste effettuate.
Come funziona Traefik
La sua funzione è quella di un reverse proxy che è in grado di scoprire automaticamente i servizi che si trovano in un’infrastruttura a container. Ciò significa che, quando si aggiunge un nuovo servizio alla propria infrastruttura, Traefik è in grado di scoprirlo automaticamente e iniziare a instradare le richieste ad esso.
Questo è possibile grazie al supporto per diversi protocolli di discovery, come Docker, Kubernetes, ECS, Marathon e molti altri. Quando un nuovo servizio viene aggiunto a uno di questi sistemi di orchestrazione dei container, è in grado di rilevarlo e iniziare a instradare le richieste ad esso.
Fonte:https://traefik.io/traefik/
Caratteristiche di Traefik
Posside diverse caratteristiche che lo rendono una scelta popolare come reverse proxy. Alcune di queste includono:
- Supporto per numerosi protocolli, tra cui HTTP, HTTPS, TCP e UDP.
- Supporto per molte piattaforme di orchestrazione dei container, come Docker, Kubernetes, ECS e altri.
- Capacità di bilanciare il carico tra i server backend per garantire una distribuzione uniforme del traffico.
- Gestione della cache per migliorare le prestazioni e ridurre il carico sui server backend.
- Possibilità di configurare il TLS (Transport Layer Security) per proteggere le comunicazioni tra il client e il server backend.
- Un’interfaccia grafica utente (GUI) facile da usare per configurare e gestire Traefik.
Integrazione con Docker
Se si utilizza Docker per orchestrare i propri container, è possibile utilizzarlo come reverse proxy per gestire il traffico di rete e instradare verso i container. Per farlo, lo si deve eseguire in un container Docker e configurarlo per scoprire automaticamente i servizi di container che devono essere esposti. Ad esempio, il comando per eseguire Traefik in un container Docker come di seguito:
1
2
3
4
docker run -d -p 80:80 -p 443:443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $PWD/traefik.toml:/traefik.toml \
traefik:v2.5
In questo esempio, lo si sta eseguendo in un container Docker e si sta mappando la porta 80 e la porta 443 del container sulla porta 80 e la porta 443 dell’host. Inoltre, si sta montando il socket di Docker all’interno del container, così che Traefik possa scoprire automaticamente i servizi di container che devono essere esposti.
Di seguito definiamo due metodi tramite docker-compose
per usare Traefik:
Opzione A - Utilizzo di Docker Socket Proxy (Maggior Sicurezza)
Concedere l’accesso all’API di Docker a un container Docker accessibile pubblicamente è un rischio per la sicurezza, pertanto sarebbe preferibile cercare di limitare la quantità di accesso che questo container ha all’API. Possiamo ottenere questo utilizzando un container proxy che consente un accesso limitato all’API di Docker e consente solo ciò di cui abbiamo bisogno per far funzionare le cose.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
version: '3'
services:
traefik:
container_name: traefik
image: traefik:2.6
ports:
- 80:80
- 443:443
# - 8080:8080 # porta dove esposta la Dashboard
volumes:
- /opt/appdata/traefik/:/etc/traefik/
networks:
- proxy # rinominare con qualsiasi nome della network a voi più consono
labels:
traefik.http.routers.api.rule: Host(`traefik.DOMAIN.COM`) # definire il dominio e subdominio per l'api di traefik.
traefik.http.routers.api.entryPoints: https # entry point delle richieste verso traefik.
traefik.http.routers.api.service: api@internal # abiliatare le api traefik.
traefik.enable: true # abiliatre il reverse proxy per la dashboard.
environment:
DOCKER_HOST: dockersocket
CF_DNS_API_TOKEN: YOUR_SUPER_SECURE_CLOUDFLARE_API_TOKEN
restart: unless-stopped
depends_on:
- dockersocket
dockersocket:
container_name: dockersocket
image: tecnativa/docker-socket-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
environment:
CONTAINERS: 1
POST: 0
privileged: true
restart: unless-stopped
networks:
proxy:
driver: bridge
external: true
Opzione B - Esporre /var/run/docker.sock (Meno Sicuro)
Danger - Metodo Non Sicuro1 Consentire a un container l’accesso diretto a docker.sock è non sicuro e potrebbe rendere il tuo sistema vulnerabile agli attacchi. Nei riferimenti a questo post leggi per saperne di più sulle vulnerabilità legate alla condivisione di docker.sock con i container Docker e su come potrebbe compromettere il tuo server.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3'
services:
traefik:
image: traefik:v2.5
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
# Applicazione di test
app:
image: nome-applicazione-image
labels:
- "traefik.enable=true"
- "traefik.http.routers.nome-applicazione.rule=Host(`nome-applicazione.com`)"
- "traefik.http.routers.nome-applicazione.entrypoints=web"
Il servizio di Traefik è definito dalla configurazione YAML nell’elenco traefik
. Si utilizza l’immagine ufficiale di Traefik e si definiscono i comandi di avvio. Verrà cosi esposto all’esterno sulla porta 80 e sulla porta 8080 per l’API di amministrazione. Inoltre, si monta il socket di Docker per consentire di scoprire i servizi dei container in esecuzione sulla stessa macchina.
Il servizio dell’applicazione è definito dalla configurazione YAML nell’elenco app
. Si utilizza l’immagine della propria applicazione e si definiscono alcune etichette per abilitare la gestione del traffico di rete da parte di Traefik. In particolare, l’etichetta traefik.enable=true
abilita la gestione del traffico di rete per questo servizio e l’etichetta traefik.http.routers.nome-applicazione.rule=Host(nome-applicazione.com)
definisce la regola di routing che viene utilizzata per instradare il traffico verso l’applicazione. Infine, l’etichetta traefik.http.routers.nome-applicazione.entrypoints=web
definisce l’entrypoint web che deve essere utilizzato per il routing del traffico.
Questa è solo una configurazione di base, ma è possibile personalizzare ulteriormente la configurazione di Traefik in base alle proprie esigenze. Tra queste magari può essere quella di creare una network specifica isolata dalla altre reti.
Integrazione con Kubernetes
Se si utilizza Kubernetes per orchestrare i propri container, è possibile utilizzare Traefik come ingress controller per gestire il traffico di rete. Per farlo, si deve installare Traefik come ingress controller e configurarlo per scoprire automaticamente i servizi che devono essere esposti. Ad esempio, il seguente comando può essere utilizzato per installare Traefik come ingress controller in un cluster Kubernetes:
1
2
3
4
5
6
7
8
9
10
11
12
13
helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm install traefik traefik/traefik \
--namespace kube-system \
--set ports.web.http.port=80 \
--set ports.web.http.redirecttohttps=true \
--set ports.web.http.protocol=HTTP/1.1 \
--set ports.web.http.middlewares.stripprefix.stripprefix.prefixes=/api \
--set ssl.enabled=true \
--set ssl.enforced=true \
--set acme.enabled=true \
--set acme.email=<tua-email>
nell’esempio poco sopra, si sta utilizzando Helm per installare Traefik come ingress controller in un namespace Kubernetes denominato kube-system
. Inoltre, si sta configurando Traefik per esporre il protocollo HTTP sulla porta 80 e per reindirizzare automaticamente le richieste HTTP su HTTPS. Si sta anche configurando per gestire un middleware che rimuove il prefisso /api
dalle richieste in arrivo. Infine, si sta abilitando l’utilizzo di SSL con Let's Encrypt
per gestire la crittografia delle comunicazioni.
Integrazione con altre piattaforme di orchestrazione dei container
Oltre a quelle appena viste in esempio, supporta anche altre piattaforme di orchestrazione dei container come accennato in precedenza. In questi casi, la configurazione può variare a seconda della piattaforma utilizzata. Tuttavia, in generale, è possibile utilizzare le stesse funzionalità di scoperta automatica di Traefik per individuare i servizi che devono essere esposti e gestiti come reverse proxy.
Conclusioni
Traefik è un reverse proxy moderno e altamente scalabile che è in grado di gestire facilmente le richieste HTTP e HTTPS. Grazie alla sua capacità di scoprire automaticamente i servizi in un’infrastruttura a container, rende più facile l’aggiunta di nuovi servizi e la gestione del traffico di rete. Inoltre, le sue numerose funzioni, fornisce funzionalità di scoperta automatica dei servizi di container e una vasta gamma di funzionalità avanzate per la gestione del traffico di rete, come la gestione dei certificati SSL, la configurazione di middleware per la manipolazione delle richieste in arrivo e la gestione del bilanciamento del carico.
Tuttavia, è importante ricordare che la configurazione di Traefik richiede una certa esperienza e conoscenza delle tecniche di gestione del traffico di rete, quindi è importante pianificare attentamente l’implementazione per garantire una configurazione corretta e sicura.