Post

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.

Desktop View

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.

Caratteristiche di Traefik

Posside diverse caratteristiche che lo rendono una scelta popolare come reverse proxy. Alcune di queste includono:

  1. Supporto per numerosi protocolli, tra cui HTTP, HTTPS, TCP e UDP.
  2. Supporto per molte piattaforme di orchestrazione dei container, come Docker, Kubernetes, ECS e altri.
  3. Capacità di bilanciare il carico tra i server backend per garantire una distribuzione uniforme del traffico.
  4. Gestione della cache per migliorare le prestazioni e ridurre il carico sui server backend.
  5. Possibilità di configurare il TLS (Transport Layer Security) per proteggere le comunicazioni tra il client e il server backend.
  6. 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.


Questo post è sotto licenza CC BY 4.0 a nome dell'autore.

DISCLAIMER: Questo blog non rappresenta una testata giornalistica in quanto viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge N°62 del 07/03/2001. Leggi di più

© Cybertome. Alcuni diritti riservati.

Servizio offerto da Jekyll con tema Chirpy