Edge Router

reverzné proxy pomocou nástroja Traefik

Motivácia

Edge router je špeciálne zariadenie, ktoré oddeľuje vašu internú sieť od vonkajšej (obyčajne od zvyšného internetu). V prípade IoT môžeme hovoriť o dvoch interpretáciách, resp. dvoch typoch zariadení z pohľadu ich umiestnenia v rámci štvorvrstvovej IoT architektúry:

  • IoT Gateway -
  • Edge Router -

Na tomto cvičení sa pozrieme na nástroj Traefik, ktorý nám pomôže vytvoriť Edge Router z našej kompozície kontajnerov (Docker Compose). Okrem toho nám pomôže vytvoriť bezpečné spojenie pre jednotlivé služby a umožniť k nim prístup pomocou HTTP protokolu pomocou definovania osobitného endpoint-u pre každú službu.

Traefik Edge Router (zdroj)

Goals

  • naučiť sa základy konfigurácie nástroja Traefik
  • osvojiť si základné koncepty nástroja Traefik
  • naučiť sa základy konfigurovania služieb pomocou značiek poskytovateľa Docker

Content

Ako Traefik pracuje?

Traefik: Architektúra (zdroj)

Prvé spustenie a Traefik Dasbhoard

Začneme tým, že do našej existujúcej kompozície vložíme službu Traefik a zapneme jeho dashboard. Dashboard budeme používať na overenie konfigurácie.

Task

Pridajte do vašej kompozície službu s menom traefik z obrazu traefik.

O službe traefik budú platiť tieto vlastnosti:

  • meno služby bude traefik
  • služba je z obrazu traefik
  • pre službu otvorte port 8080, na ktorom bude dostupný práve dashboard, a
  • prepíšte predvolený príkaz pomocou kľúčového slova command a pridajte do zoznamu jeho parametrov položku "--api.insecure=true"

Výsledná konfigurácia služby bude vyzerať takto:

traefik:
  image: traefik
  ports:
  - 8080:8080
  command:
  - "--api.insecure=true"

Task

Overte vytvorenú službu spustením prehliadača na adrese http://localhost:8080.

Ak ste postupovali správne, v prehliadači sa vám zobrazí dashboard nástroja Traefik.

Traefik: Dashboard

Automatická konfigurácia

Traefik dokáže automaticky aktualizovať svoju konfiguráciu pomocou tzv. pokystovateľov (z angl. providers), ktorými môžu byť napr. orchestračné služby (napr. Kubernetes), služby na správu kontajnerov (napr. Docker), klaudoví poskytovatelia alebo key-value store. Traefik komunikuje s API poskytovateľa a v prípade zistenia zmeny sa dynamicky aktualizuje.

V tomto kroku pridáme do konfigurácie Traefik-a možnosť zisťovať konfiguráciu od služby Docker.

Task

Rozšírte konfiguráciu nástroja Traefik pre automatické zisťovanie konfigurácie pomocou služby Docker.

V našom prípade pridáme do konfigurácie nástroja Traefik podporu pre poskytovateľa kontajnerov Docker. To zabezpečíme nasledovným rozšírením zoznamu volieb pre spustenie príkazu kontajnera:

--providers.docker=true

Aby však Traefik vedel komunikovať so službou Docker, potrebujeme namapovať lokálny socket z hosťovského systému, na ktorom je dostupné API pre Docker, do kontajnera, v ktorom je spustený Traefik. Socket je umiestnený v /var/run/docker.sock.

Služba Traefik bude po úprave vyzerať nasledovne:

traefik:
  image: traefik
  ports:
  - 8080:8080
  volumes:
  - /var/run/docker.sock:/var/run/docker.sock
  command:
  - "--api.insecure=true"
  - "--providers.docker=true"

Task

Overte správnosť vytvoreniej konfigurácie.

Ak ste postupovali správne, na stránke dashboard-u uvidíte v zozname poskytovateľov službu Docker, a v zozname služieb (Services) a v zozname smerovačov (Routers) uvidíte spustené Docker kontajnery.

Traefik a koncept EntryPoint-ov

EntryPoint-s are the network entry points into Traefik. They define the port which will receive the packets, and whether to listen for TCP or UDP.

Traefik: EntryPoints

Task

Vytvorte EntryPoint s názvom web, ktorý bude počúvať na porte 80.

traefik:
  image: traefik
  ports:
  - 8080:8080
  - 80:80
  volumes:
  - /var/run/docker.sock:/var/run/docker.sock
  command:
  # dashboard
  - "--api.insecure=true"

  # docker provider
  - "--providers.docker=true"
  - "--providers.docker.exposedbydefault=false"

  # entrypoints
  - "--entrypoints.web.address=:80"

Task

Overte správnosť vášho riešenia.

Ak ste postupovali správne, v zozname EntryPoint-ov v dashboard-e uvidíte EntryPoint s názvom web, ktorý počúva na porte 80.

Traefik: EntryPoint web počúvajúci na porte 80

Zabezpečenie prístupu pre nástroj Node-RED

Ako prvý zabezpečíme prístup prostredníctvom reverzného proxy pre službu Node-RED. Táto služba bude dostupná prostredníctvom EntryPoint-u web, ktorý komunikuje na porte 80 na ceste /nodered/. To znamená, že ak sa budeme chcieť k tejto službe pripojiť, otvoríme prehliadač na adrese http://localhost/nodered/.

Traefik bude čítať konfiguráciu zo značiek (kľúčové slovo labels), ktoré pridáme ku konfigurácii konkrétnej služby. To znamená, že nebudeme potrebovať upravovať konfiguráciu služby Traefik, ale budeme upravovať konfiguračné nastavenia jednotlivých služieb.

Task

Odstráňte publikovanie portu 1880 v kompozícii pre službu nodered.

Začneme tým, že služba prestane byť dostupná na porte 1880. Výsledná konfigurácia v kompozícii bude vyzerať takto:

nodered:
    image: nodered/node-red
    volumes:
        - ./nodered:/data

Task

V službe nodered zapnite správu pre službu traefik pomocou značky traefik.enable nastavenej na hodnotu true.

Upravená konfigurácia služby nodered bude vyzerať nasledovne:

nodered:
    image: nodered/node-red
    volumes:
        - ./nodered:/data
    labels:
        traefik.enable: true

Ak teraz reštartneme kompozíciu (alebo len službu nodered), v zozname HTTP smerovačov alebo HTTP služieb sa nám zobrazí nová položka pre službu nodered.

Traefik: Zapnutá správa služby nodered

Task

Do konfigurácie služby nodered pridajte pravidlo pre smerovač založené na prefixe cesty /nodered/.

Rozšírená konfigurácia služby bude vyzerať nasledovne:

nodered:
    image: nodered/node-red
    volumes:
        - ./nodered:/data
    labels:
        traefik.enable: true
        traefik.http.services.nodered.loadbalancer.server.port: 1880

        # middleware
        traefik.http.middlewares.nodered-rewrite.replacepathregex.regex: "^/nodered/(.*)"
        traefik.http.middlewares.nodered-rewrite.replacepathregex.replacement: "/$$1"

        # routers
        traefik.http.routers.nodered.entrypoints: web
        traefik.http.routers.nodered.rule: PathPrefix(`/nodered/`)
        traefik.http.routers.nodered.middlewares: "nodered-rewrite"

Task

Overte svoju konfiguráciu.

Ak ste postupovali správne, Node-RED sa vám spustí po otvorení adresy http://localhost/nodered/ v prehliadači.

Zabezpečenie prístupu k aplikácii Grafana

Niektorým službám v prípade použitia pravidiel pre smerovače na základe cesty nestačí nastaviť len pravidlo s vhodným “rewrite” pravidlom pre middleware. Častokrát je potrebné na základe dokumentácie nastaviť aj iné veci. Tak je to napríklad v prípade databázového systému InfluxDB, ktorý nie je možné (aktuálne) používať v prípade pravidiel založených na ceste, ale len na základe domény.

V prípade aplikácie Grafana to však možné je. Niekoľko informácií o tom, ako je možné aplikáciu spúšťať pomocou reverzného proxy, je možné nájsť na tejto adrese.

Task

Zabezpečte, aby aplikácia [Grafana] pracovala na ceste /grafana.

Tentokrát miesto “rewrite” pravidla pre middleware použijeme premenné prostredia, pomocou ktorých nastavíme hodnotu ROOL_URL. Výsledná konfigurácia bude následne vyzerať takto:

grafana:
    image: grafana/grafana
    labels:
        traefik.enable: true
        traefik.http.routers.grafana.rule: PathPrefix(`/grafana`)
        traefik.http.routers.grafana.entrypoints: web
        traefik.http.services.grafana.loadbalancer.server.port: 3000
    environment:
    - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/grafana
    - GF_SERVER_SERVE_FROM_SUB_PATH=true

Mosquitto MQTT Broker

Traefik sa netýka len HTTP protokolu. Ako jeho EntryPoint môže byť použitý ľubovoľný port. V tomto kroku si preto ukážeme, ako je možné použiť Traefik aj pre MQTT broker Mosquitto.

Task

Rozšírte konfiguráciu služby traefik vytvorením nového EntryPoint-u pre komunikačný protokol MQTT.

Za týmto účelom potrebujeme spraviť dve veci:

  • otvoriť port 1883, na ktorom komunikuje služba MQTT, a
  • pridať do konfigurácie pomocou parametrov príkazového riadku nový EntryPoint (pomenujeme ho mqtt a bude komunikovať na porte 1883)

Výsledná konfigurácia môže vyzerať napríklad takto:

traefik:
  image: traefik
  ports:
    # Web UI
    - 8080:8080
    # HTTP
    - 80:80
    # MQTT
    - 1883:1883
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  command:
    # dashboard
    - "--api.insecure=true"
    # docker provider
    - "--providers.docker=true"
    - "--providers.docker.exposedbydefault=false"
    # entrypoints
    - "--entrypoints.web.address=:80"
    - "--entrypoints.mqtt.address=:1883"

Task

Upravte konfiguráciu služby mosquitto v kompozícii tak, aby mohla komunikovať prostredníctvom reverzného proxy Traefik.

Pre splnenie úlohy je potrebné v konfigurácii služby vypnúť komunikáciu prostredníctvom portu 1883 a nastaviť nasledovné značky pomocou kľúčového slova labels v kontajneri:

  • povoliť službe Traefik starať sa o službu Mosquitto
  • nastaviť komunikačný port pre Traefik
  • vybrať si správny EntryPoint

Výsledná konfigurácia môže vyzerať napríklad takto.

mosquitto:
    image: eclipse-mosquitto
    restart: unless-stopped
    volumes:
        - ./mosquitto/:/mosquitto/config
    labels:
        traefik.enable: true
        traefik.tcp.services.mosquitto.loadbalancer.server.port: 1883
        traefik.tcp.routers.mosquitto.entrypoints: mqtt
        traefik.tcp.routers.mosquitto.rule: HostSNI(`*`)

Task

Overte vytvorenú konfiguráciu.

Ak ste postupovali správne, v zozname EntryPoint-ov služby Traefik uvidíte aj EntryPoint s názvom MQTT, ktorý komunikuje na porte 1883.

Traefik: MQTT EntryPoint

Komunikáciu prostredníctvom MQTT broker-a si následne môžete vyskúšať pomocou ľubovoľného MQTT klienta, napr. pomocou nástrojov z balíka mosquitto-clients:

$ mosquitto_pub -h localhost -t messages -m "hello world" -r
$ mosquitto_sub -h localhost -t messages
hello world