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.
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?
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"
Upozornenie
Používanie dashboard-u v produkcii nie je odporúčané. Preto túto konfiguráciu používajte vyslovene len na testovacie účely!
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.
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.
Poznámka
Po zapnutí poskytovateľa kontajnerov Docker bude predvolene zapnutá možnosť, že každý jeden spustený kontajner bude možné ovládať pomocou reverzného proxy Traefik. Toto správanie však nie je vždy potrebné, napr. v prípadoch, ak služba v kontajneri nemá webové rozhranie.
Ak teda chcete toto správanie potlačiť, pridajte pri spúšťaní kontajnera ešte voľbu
--providers.docker.exposedbydefault=false
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.
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
.
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
.
Poznámka
Pravidlo pre smerovač je v tomto prípade založené na názve domény v požiadavke. Tým, že si nemôžeme vytvoriť vlastný doménový názov, budeme pracovať len s pravidlami na základe cesty v požiadavke.
V prípade linuxových OS je však možné aspoň lokálne nastaviť doménový
názov pomocou záznamu v súbore /etc/hosts
. Napríklad by sme
vedeli vytvoriť záznam nodered.local
na lokálnom počítači
takto:
127.0.0.1 nodered.local
Tým pádom je možné ukázať, ako používať aj pravidlá pre smerovač založené na názve domény.
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"
Poznámka
Ak služba počúva len na jednom porte, Traefik si tento port vie zistiť sám a nie je potrebné ho explicitne uvádzať. Ak je však portov viac alebo port nie je špecifikovaný, je potrebné port uviesť explicitne.
Rovnako tak nie je potrebné uvádzať, aký EntryPoint služba používa, ak je definovaný len jeden, pretože ten bude predvolene použitý. V prípade viacerých EntryPoint-ov je treba explicitne uviesť ten správny.
Kvôli zvýšeniu čitateľnosti je však dobré aj tieto konfiguračné možnosti uvádzať explicitne a vyhnúť sa tak prípadným problémom prameniacim z neuvedenia týchto hodnôt. Preto ich budeme v konfigurácii explicitne uvádzať aj my.
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 porte1883
)
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
.
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
Additional Links
- Traefik Edge Router: Overview
- Traefik: HTTPS & TLS
- Traefik: EntryPoints - Opening Connections for Incoming Requests
- Traefik: Providers - Configuration discovery in Traefik is achieved through Providers.
- Traefik: Traefik & Docker - A Story of Labels & Containers.