Traefik - proxy si load balancer

Postat la Sun 19 April 2020 in howto

Am tot auzit in ultima perioada de Traefik ca proxy ce se integreaza foarte usor cu Docker si Kubernetes. Am dorit sa il testez ca proxy (fata de HAproxy pe care l-am mai folosit) pentru proiectele mele ce ruleaza pe LXD.

Traefik este compus dintr-un excutabil pe care il copiem in /usr/local/bin/:

curl -O -L https://github.com/containous/traefik/releases/download/v2.2.0/traefik_v2.2.0_linux_amd64.tar.gz
gunzip traefik_v2.2.0_linux_amd64.tar.gz
mv traefik /usr/local/bin/

Creem fisierul principal de config /etc/traefik.yaml:

api:
  #insecure: true
  dashboard: true

entryPoints:
  web:
    address: "192.168.25.200:80"

providers:
  file:
    directory: /etc/traefik.d
  watch: true

Unde:

  • entryPoints - porturile pe care traefik asculta
  • providers - modul de autoconfigurare, prin fisiere in cazul nostru in folderul /etc/traefik.d

Fisierul de configurare ca serviciu pentru systemd il salvam /etc/systemd/system/traefik.service:

[Unit]
Description=Traefik
Documentation=https://docs.traefik.io
After=network-online.target
#AssertFileIsExecutable=/usr/bin/traefik
#AssertPathExists=/etc/traefik/traefik.toml

[Service]
# Run traefik as its own user (create new user with: useradd -r -s /bin/false -U -M traefik)
#User=traefik
#AmbientCapabilities=CAP_NET_BIND_SERVICE

# configure service behavior
Type=notify
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik.yaml
Restart=always
WatchdogSec=1s

# lock down system access
# prohibit any operating system and configuration modification
#ProtectSystem=strict
# create separate, new (and empty) /tmp and /var/tmp filesystems
#PrivateTmp=true
# make /home directories inaccessible
#ProtectHome=true
# turns off access to physical devices (/dev/...)
#PrivateDevices=true
# make kernel settings (procfs and sysfs) read-only
#ProtectKernelTunables=true
# make cgroups /sys/fs/cgroup read-only
#ProtectControlGroups=true

# allow writing of acme.json
#ReadWritePaths=/etc/traefik/acme.json
# depending on log and entrypoint configuration, you may need to allow writing to other paths, too

# limit number of processes in this unit
#LimitNPROC=1

[Install]
WantedBy=multi-user.target

Un serviciu definit in Traefik include urmatoarele componente:

  • EntryPoints - punctul de intrare al traficului (definit ca port, adresa)
  • Routers - reguli de directionare de traficului (host, cale, header,...)
  • Services - definirea serviciilor utilizate
  • Middlewares - reguli suplimentare de analiza a traficului (autentificare,SSL,limita de requesturi)

Avem o aplicatie - Gitea - instalata pe un VM unde ruleaza pe portul 3000. Definim serviciul in /etc/traefik.d/gitea.yaml:

http:
  routers:
    gitea:
      entryPoints:
      - "web"
      rule: "Host(`gitea.lxd`)"
      service: gitea
  services:
    gitea:
      loadBalancer:
        servers:
          - url: "http://10.209.214.189:3000/"
        healthCheck:
          path: "/"

Regulile de routare:

  • punctul de intrare "web" definit in /etc/traefik.yaml
  • foloseste domeniul gitea.lxd (se pot folosi regule bazate pe cale)
  • utilizeaza backend-ul gitea definit ca serviciu

Backend-ul (serviciul):

  • este definit ca loadbalacer - permite utilizarea a mai multor servere
  • pentru verificarea sanatatii serviciilor se verifica path-ul

O functionalitate foarte apreciata furnizata este un dashboard care asigura informatii despre sistem:

Definim ca acest dashboard sa fie accesibil pe domeniul traefik.lxd si sa fie protejat cu autentificare:

http:
  routers:
    traefik:
      entryPoints:
      - "web"
      rule: "Host(`traefik.lxd`)"
      service: api@internal
      middlewares:
      - "pass-auth"
  middlewares:
    pass-auth:
      basicAuth:
        users:
          - "traefik:$apr1$cr2I.Rtl$zZ6.M5WwKocymAJt.mWE.0"

Protejare cu parola se face prin middleware-ul basicAuth unde definim userii si parolele, similat cu cele din htaccess.

Pe langa servciile http, Traefik suporta traficul TCP sau UDP si chiar si cel SSH. Mai multe gasiti in documentatia oficiala.