LoadBalancing z wykorzystaniem usługi Traefik jako PROXY w środowisku Nomad
Omówienie problemu
W sytuacji kiedy potrzebujemy uruchomić wiele instancji naszej usługi, konieczne jest przekierowanie ruchu przez serwer pośredniczący tak, aby w zależności od naszych potrzeb, trafił do żądanej usługi. Przykładem takiej sytuacji jest uruchomienie dokładnie tej samej usługi na różnych serwerach, tak aby rozproszyć ruch i zwiększyć wydajność ładowania się strony, zwłaszcza przy wzmożonym ruchu, a także zapewnić jej stabilność w wypadku niedostępności jednej z maszyn na której zostały one uruchomione. Dzisiaj przyjrzymy się możliwością usługi Traefik, która w naszym przypadku będzie odpowiedzialna za wyżej wspomniane podzielenie ruchu.
Uruchomienie serwera Traefik
Traefik jako narzędzie można uruchomić z wykorzystaniem oficjalnego kontenera dostępnego na platformie dockerhub. Całość zostanie przez nas uruchomiona z wykorzystaniem wcześniej skonfigurowanego środowiska Nomad. Do tego celu będziemy potrzebowali w najprostszej formie skonfigurowanej usługi Consul, która będzie odpowiedzialna za dostarczenie informacji o aktualnie uruchomionych kontenerach oraz ich adresach. Dzięki temu będzie możliwość uruchomienia usług na różnych serwerach, a serwer proxy będzie wiedział do której maszyny i na jakim porcie będzie miał przekierować ruch.
Aby uruchomić usługę konieczne będzie przygotowania pliku traefik.hcl,, który zleci uruchomienie usługi proxy. Do tego celu przygotowałem następującą definicję:
job "traefik" {
type = "service"
group "traefik" {
network {
port "api" {
static = 8080
}
port "http" {
static = 80
}
}
service {
name = "traefik"
}
task "traefik" {
driver = "docker"
config {
image = "traefik:v3.0"
network_mode = "host"
volumes = [
"local/traefik.yaml:/etc/traefik/traefik.yaml",
"local/config:/etc/traefik/config",
]
}
template {
data = <<EOF
log:
# level: DEBUG
accessLog: {}
api:
dashboard: true
insecure: true
providers:
file:
directory: /etc/traefik/config
watch: true
consulCatalog:
prefix: traefik
exposedByDefault: false
endpoint:
address: '127.0.0.1:8500'
scheme: http
entryPoints:
web:
address: ':80'
traefik:
address: ':8080'
EOF
destination = "local/traefik.yaml"
}
}
}
}
Dla tak przygotowanej konfiguracji należy ją uruchomić na naszej instalacji nomada z wykorzystaniem polecenia:
pmazur@pmazur-P8Z68-V ~/nomad $ nomad run traefik.hcl
==> 2024-04-08T14:44:29+02:00: Monitoring evaluation "edafe3a2"
2024-04-08T14:44:29+02:00: Evaluation triggered by job "traefik"
2024-04-08T14:44:30+02:00: Evaluation within deployment: "6b899414"
2024-04-08T14:44:30+02:00: Allocation "62eb6352" created: node "cd74249a", group "traefik"
2024-04-08T14:44:30+02:00: Evaluation status changed: "pending" -> "complete"
==> 2024-04-08T14:44:30+02:00: Evaluation "edafe3a2" finished with status "complete"
==> 2024-04-08T14:44:30+02:00: Monitoring deployment "6b899414"
✓ Deployment "6b899414" successful
2024-04-08T14:44:41+02:00
ID = 6b899414
Job ID = traefik
Job Version = 0
Status = successful
Description = Deployment completed successfully
Deployed
Task Group Desired Placed Healthy Unhealthy Progress Deadline
traefik 1 1 1 0 2024-04-08T14:54:40+02:00
Dzięki temu po przejściu na adres na którym mamy uruchomioną usługę proxy otrzymamy komunikat 404. Jest To prawidłowe zachowanie ponieważ na tym etapie nie mamy jeszcze skonfigurowanych żadnych usług, podłączonych do naszego serwera.
Aby sprawdzić jakie usługi są dostępne, możemy przejść pod adres dedykowanego panelu, w naszym wypadku na porcie 8080
. Aktualnie są tu skonfigurowane jedynie wewnętrzne usługi.
Uruchamiamy przykładową usługę
Na potrzeby przykładu przygotujemy kontener z usługą http, prezentującą różną treść w zależności od tego na który zostaniemy przekierowani przez wcześniej skonfigurowane proxy. Poniżej zamieszczam przykład konfiguracji na potrzeby wdrożenia przez Nomada.
job "httpd" {
type = "service"
group "httpd" {
network {
port "http" {
to = 80
}
}
count = 2
task "httpd" {
driver = "docker"
config {
image = "httpd"
ports = ["http"]
volumes = [
"local/htdocs:/usr/local/apache2/htdocs",
]
}
template {
data = <<EOH
<p><strong>It's Works!</strong></p>
<p>Allocation: {{ env "NOMAD_ALLOC_ID" }}
<p>Short: {{ env "NOMAD_SHORT_ALLOC_ID" }}
<p>Index: {{ env "NOMAD_ALLOC_INDEX" }}
EOH
destination = "local/htdocs/index.html"
}
template {
data = <<EOH
{status: "OK"}
EOH
destination = "local/htdocs/status"
}
service {
port = "http"
tags = [
"traefik.enable=true",
"traefik.http.routers.${NOMAD_JOB_NAME}-${NOMAD_TASK_NAME}.rule=Host(`localhost`)",
]
}
}
}
}
Przygotowany kontener będzie zawierał na swojej stronie informacje na temat alokacji do której został przydzielony przez usługę Nomad. Konieczne jest zdeployowanie kontenera.
pmazur@pmazur-P8Z68-V ~/nomad $ nomad run httpd.hcl
==> 2024-04-08T15:03:11+02:00: Monitoring evaluation "4fc2ff59"
2024-04-08T15:03:11+02:00: Evaluation triggered by job "httpd"
2024-04-08T15:03:12+02:00: Evaluation within deployment: "68118b76"
2024-04-08T15:03:12+02:00: Allocation "19bc55a8" created: node "cd74249a", group "httpd"
2024-04-08T15:03:12+02:00: Allocation "b5a862cf" created: node "cd74249a", group "httpd"
2024-04-08T15:03:12+02:00: Evaluation status changed: "pending" -> "complete"
==> 2024-04-08T15:03:12+02:00: Evaluation "4fc2ff59" finished with status "complete"
==> 2024-04-08T15:03:12+02:00: Monitoring deployment "68118b76"
✓ Deployment "68118b76" successful
2024-04-08T15:03:28+02:00
ID = 68118b76
Job ID = httpd
Job Version = 0
Status = successful
Description = Deployment completed successfully
Deployed
Task Group Desired Placed Healthy Unhealthy Progress Deadline
httpd 2 2 2 0 2024-04-08T15:13:27+02:00
Tak wygląda zdeployowana usłgua w naszym panelu.
A tak strona wygenerowana po przejściu na adres naszej usługi, pod tym samym adresem naszego serwera w tym wypadku localhost
.
Podsumowanie
Z wykorzystaniem serwera Nomad, usługi Consul, oraz narzędzia Traefik skonfigurowaliśmy skalowanie deploymentu naszych usług i ich dostępności. Niemniej nie wyczerpaliśmy jeszcze w wszystkich możliwości przedstawionych narzędzi, a kolejne tematy z tym związane jak chociażby Blue/Green deployment, czy automatyczna konfiguracja SSL z wykorzystaniem z Let’s Encrypt poruszymy następnym razem.
Dodaj komentarz