Traefik ist ein Open-Source-Reverse-Proxy fĂŒr die einfache Handhabung von Microservices und / oder nur Containern mit Ihren Anwendungen.
Der Reverse-Proxy-Server (Reverse-Proxy, Reverse-Proxy) wird verwendet, um Anforderungen vom externen Netzwerk an alle Server / Dienste im internen Netzwerk (z. B. einen Webserver, eine Datenbank oder einen Dateispeicher) weiterzuleiten und ermöglicht:
- GewÀhrleistung der Verschleierung der Struktur des internen Netzwerks und der Einzelheiten der darin befindlichen Dienste;
- Lastausgleich (Lastausgleich) zwischen Instanzen desselben Dienstes oder Servern mit denselben Aufgaben;
- Stellen Sie eine verschlĂŒsselte (HTTPS) Verbindung zwischen dem Client und einem beliebigen Dienst bereit. In diesem Fall wird eine SSL-Sitzung zwischen dem Client und dem Proxy erstellt und eine unverschlĂŒsselte HTTP-Verbindung zwischen dem Proxy und dem Dienst im internen Netzwerk hergestellt. Wenn der Dienst HTTPS unterstĂŒtzt, können Sie eine verschlĂŒsselte Verbindung im internen Netzwerk organisieren.
- Organisieren Sie die Zugriffskontrolle auf Dienste (Clientauthentifizierung) und installieren Sie eine Firewall (Firewall).
In diesem Artikel wird die Verwendung von Traefik in Docker als Reverse-Proxy fĂŒr andere Docker-Container sowie fĂŒr nicht containerisierte Dienste beschrieben.
EinfĂŒhrung
Traefik âEdge Routerâ, . , , : -, Traefik ; -, Traefik EE â , HA (Hight Availability, ), (), , . , Traefik.
Traefik (â â) , .
:
- Docker
- Kubernetes
- Consul Catalog
- Marathon
- Rancher
- File
.
, , â âFileâ, ( ), - , , -. .
Traefik, âFileâ TOML YAML, YAML , - , . Traefik Docker. docker-compose, .
* Linux.
Traefik
docker docker-compose, .
traefik
, ,
mkdir ~/traefik
cd ~/traefik
() Traefik docker-compose.yml
. :
version: '3'
services:
traefik:
image: traefik:v2.2
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
80 443 HTTP HTTPS . Docker . Traefik traefik.yml
data
.
networks Docker-, Traefik .
.
( , ):
entryPoints:
http:
address: ":80"
https:
address: ":443"
http
https
( , a
b
) .
â Docker, :
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
Traefik , . â Traefik ( ).
HTTP HTTPS ( ):
http:
routers:
http-catchall:
rule: HostRegexp(`{host:.+}`)
entrypoints:
- http
middlewares:
- redirect-to-https
middlewares:
redirect-to-https:
redirectScheme:
scheme: https
permanent: false
Traefik HTTP , TCP UDP, http
.
Traefik 2 routers () middlewares( ), .
:
http-catchall
â , ,http
Traefik;rule:
â , ,HostRegexp
,Host
.+
( ), Traefik â (host
),{name:reg_exp}
;entrypoints
â , ,http
;middlewares
â , ( ).
redirect-to-https
â , ,http
Traefik;redirectScheme
â , ;scheme: https
â HTTPS ;permanent: false
â .
entryPoints:
http:
address: ":80"
https:
address: ":443"
http:
routers:
http-catchall:
rule: hostregexp(`{host:.+}`)
entrypoints:
- http
middlewares:
- redirect-to-https
middlewares:
redirect-to-https:
redirectScheme:
scheme: https
permanent: false
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
.
sudo docker-compose up -d
, (sudo docker-compose logs -f
) , .
Let's Encrypt
HTTPS - SSL , , Let's Encrypt.
(traefik.yml
) :
certificatesResolvers:
letsEncrypt:
acme:
email: postmaster@example.com
storage: acme.json
caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
httpChallenge:
entryPoint: http
:
letsEncrypt
â ;acme
â ( - );storage
â , ;httpChallenge
â acme-, â ;caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
â Let's Encrypt , API ( , ).
volumes
docker-compose.yml
, ( data/acme.json
):
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
Docker
HTTPS , , Traefik, Traefik Docker, .
Docker Traefik (labels) . docker-compose.yml
:
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=https"
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"
:
traefik.enable=true
â Traefik , ;
traefik.http.routers.traefik.entrypoints=https
â https
;
traefik.http.routers.traefik.rule=Host(
traefik.example.com)
â traefik.example.com;
traefik.http.routers.traefik.tls=true
â TLS;
traefik.http.routers.traefik.tls.certresolver=letsEncrypt
â ;
traefik.http.routers.traefik.service=api@internal
â , â api@internal
, , , ;
traefik.http.services.traefik-traefik.loadbalancer.server.port=888
â , , .
, traefik.yml
:
api:
dashboard: true
( docker-compose.yml
):
sudo docker-compose down && sudo docker-compose up -d
traefik.example.com
( , Traefik) .
, , , BasicAuth, Traefik middleware.
(admin/password)^
$ htpasswd -nb admin password
admin:$apr1$vDSqkf.v$GTJOtsd9CBiAFFnHTI2Ds1
docker-compose.yml
:
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"
- "traefik.http.routers.traefik.middlewares=traefik-auth"
, $
$$
.
traefik.http.middlewares.traefik-auth.basicauth.users=...
â middleware basicauth
users
;
traefik.http.routers.traefik.middlewares=traefik-auth
â traefik
- middleware.
version: '3'
services:
traefik:
image: traefik:v2.2
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/acme.json:/acme.json
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=https"
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"
- "traefik.http.routers.traefik.middlewares=traefik-auth"
.
, docker-compose ( docker):
labels:
- "traefik.enable=true"
- "traefik.http.routers.test.entrypoints=https"
- "traefik.http.routers.test.rule=Host(`test.example.com`)"
- "traefik.http.routers.test.tls=true"
- "traefik.http.routers.test.tls.certresolver=letsEncrypt"
- "traefik.http.services.test-service.loadbalancer.server.port=80"
traefik.http.services.test-service.loadbalancer.server.port=80
â test-service
80, test
, Traefik , .
File
, - ( IP 192.168.1.222 8080) , HTTPS. .
docker-compose.yml
volume
:
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/custom/:/custom/:ro
- ./data/acme.json:/acme.json
data/custom/
( , ).
traefik.yml
file :
providers:
...
file:
directory: /custom
watch: true
docker-compose.yml
, watch: true
Traefik ( â â, , ).
Traefik (data/custom/host.yml
):
http:
routers:
host:
entryPoints:
- https
service: service-host
rule: Host(`host.example.com`)
tls:
certResolver: letsEncrypt
services:
service-host:
loadBalancer:
servers:
- url: http://192.168.1.222:8080/
passHostHeader: true
, service: service-host
â , TLS.
:
_:
loadBalancer:
servers:
-
- ...
passHostHeader: true
, .
:
version: '3'
services:
traefik:
image: traefik:v2.2
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/custom/:/custom/:ro
- ./data/acme.json:/acme.json
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=https"
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"
- "traefik.http.routers.traefik.middlewares=traefik-auth"
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
http:
routers:
http-catchall:
rule: hostregexp(`{host:.+}`)
entrypoints:
- http
middlewares:
- redirect-to-https
middlewares:
redirect-to-https:
redirectScheme:
scheme: https
permanent: false
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
directory: /custom
watch: true
certificatesResolvers:
letsEncrypt:
acme:
email: postmaster@example.com
storage: acme.json
#caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
httpChallenge:
entryPoint: http
http:
routers:
host:
entryPoints:
- https
service: service-host
rule: Host(`host.example.com`)
tls:
certResolver: letsEncrypt
services:
service-host:
loadBalancer:
servers:
- url: http://192.168.1.222:8080/
passHostHeader: true
Traefik HTTP Docker File. SSL Let's Encrypt, HTTPS, .
TCP UDP ( , â TCP), , Traefik .
.
Mit Traefik können Sie Informationen ĂŒber Ihre Arbeit in verschiedenen Formaten sammeln. Ăberlegen Sie, wie dies mit Prometheus gemacht wird.
FĂŒgen wir einen neuen Einstiegspunkt hinzu
data/traefik.yml
:
entryPoints:
...
metrics:
address: ":8082"
docker-compose.yml
::
ports:
- 80:80
- 443:443
- 8082:8082
Und fĂŒgen Sie die Möglichkeit hinzu, Metriken fĂŒr Prometheus von diesem Port aus zu sammeln data/traefik.yml
:
metrics:
prometheus:
entryPoint: metrics
Es bleibt nur Prometheus zu konfigurieren, um Metriken von zu sammeln traefik_ip:8082
.
Wir geben den Inhalt der Dateien mit den erhaltenen Konfigurationen an:
version: '3'
services:
traefik:
image: traefik:v2.2
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
- 8082:8082
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/traefik.yml:/traefik.yml:ro
- ./data/custom/:/custom/:ro
- ./data/acme.json:/acme.json
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=https"
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik.tls=true"
- "traefik.http.routers.traefik.tls.certresolver=letsEncrypt"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.services.traefik-traefik.loadbalancer.server.port=888"
- "traefik.http.middlewares.traefik-auth.basicauth.users=admin:$$apr1$$vDSqkf.v$$GTJOtsd9CBiAFFnHTI2Ds1"
- "traefik.http.routers.traefik.middlewares=traefik-auth"
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
metrics:
address: ":8082"
metrics:
prometheus:
entryPoint: metrics
http:
routers:
http-catchall:
rule: hostregexp(`{host:.+}`)
entrypoints:
- http
middlewares:
- redirect-to-https
middlewares:
redirect-to-https:
redirectScheme:
scheme: https
permanent: false
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
directory: /custom
watch: true
certificatesResolvers:
letsEncrypt:
acme:
email: postmaster@example.com
storage: acme.json
#caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
httpChallenge:
entryPoint: http