Fabio로 로드 밸런싱
Fabio로 로드 밸런싱 (Load balancing with Fabio)
Fabio를 사용해 Nomad에서 HTTP(S) 및 TCP 요청을 로드 밸런싱하는 방법을 알아봐요.
출처: 문서
본문
Fabio는 인터넷에서 들어오는 HTTP(S) 및 TCP 요청을 처리할 수 있는 프런트엔드 서비스로 분산해요. Consul과 기본적으로 통합되며 라우팅을 시각화하는 선택적 웹 UI를 제공해요.
다음 단계에 따라 Fabio를 로드 밸런서로 사용해요.
- Fabio를 시스템 작업으로 배포해 애플리케이션이 어떤 클라이언트 노드에서 실행되든 들어오는 트래픽을 애플리케이션의 서버 그룹에 고르게 라우팅하게 해요.
- 애플리케이션 작업 명세의
group.service블록에urlprefix-태그를 구성해요.urlprefix-태그 요구 사항에 대한 자세한 내용은 Fabio Quickstart를 참고해요. - 모든 Nomad 클라이언트 노드를 클라우드 제공자의 로드 밸런서 뒤에 배치해 최종 사용자에게 애플리케이션 접근을 위한 단일 엔드포인트를 제공해요.
이 가이드는 Apache 웹 서버의 로드 밸런서로 Fabio를 배포하는 방법을 보여줘요.
사전 요구 사항
Nomad 설치가 Consul을 사용하도록 구성되어야 해요. 자세한 내용은 Consul 통합 콘텐츠를 참고해요.
Fabio를 시스템 작업으로 배포하기
Fabio에 대한 작업 명세를 만들고 이름을 fabio.nomad.hcl로 지어요. 다음을 참고해요.
- type은
system이므로 작업이 시스템 작업으로 실행돼요. - network_mode는
host이므로 Fabio가 클라이언트 노드에서 Consul과 통신할 수 있어요.
fabio.nomad.hcl
job "fabio" {
datacenters = ["dc1"]
type = "system"
group "fabio" {
network {
port "lb" {
static = 9999
}
port "ui" {
static = 9998
}
}
task "fabio" {
driver = "docker"
config {
image = "fabiolb/fabio"
network_mode = "host"
ports = ["lb","ui"]
}
resources {
cpu = 200
memory = 128
}
}
}
}
nomad run 명령으로 Fabio 작업을 배포해요.
$ nomad job run fabio.nomad.hcl
==> Monitoring evaluation "fba4f04a"
Evaluation triggered by job "fabio"
Allocation "6e6367d4" created: node "f3739267", group "fabio"
Allocation "d17573b4" created: node "28d7f859", group "fabio"
Allocation "f3ad9b16" created: node "510898b6", group "fabio"
Evaluation status changed: "pending" -> "complete"
==> Evaluation "fba4f04a" finished with status "complete"
이 시점에서 클라이언트 노드 중 아무 것이나 포트 9998에서 방문해 Fabio의 웹 인터페이스에 접근할 수 있어야 해요. 아직 Fabio가 라우팅할 수 있는 것을 배포하지 않았으므로 라우팅 테이블은 비어 있어야 해요. 따라서 이 시점에 포트 9999에서 클라이언트 노드 중 아무 것이나 방문하면 404 HTTP 응답을 받게 돼요. 아직 경로가 없으므로 이 오류는 예상된 것이에요.
애플리케이션 구성
Apache 웹 서버에 대한 작업을 만들고 이름을 webserver.nomad.hcl로 지어요. service 스탠자의 태그가 urlprefix-로 시작하는 것을 주목해요. Fabio는 이 특수 태그가 있는 서비스를 찾아 그에 대한 경로를 만들어요. 이 경우 작업은 / 경로를 Fabio에 등록해요. 이렇게 하면 /로 들어오는 트래픽이 Apache 웹 서버의 기본 페이지로 라우팅돼요.
webserver.nomad.hcl
job "webserver" {
datacenters = ["dc1"]
type = "service"
group "webserver" {
count = 3
network {
port "http" {
to = 80
}
}
service {
name = "apache-webserver"
tags = ["urlprefix-/"]
port = "http"
check {
name = "alive"
type = "http"
path = "/"
interval = "10s"
timeout = "2s"
}
}
restart {
attempts = 2
interval = "30m"
delay = "15s"
mode = "fail"
}
task "apache" {
driver = "docker"
config {
image = "httpd:latest"
ports = ["http"]
}
}
}
}
nomad run 명령으로 Apache 웹 서버 작업을 배포해요.
$ nomad job run webserver.nomad.hcl
==> Monitoring evaluation "c7bcaf40"
Evaluation triggered by job "webserver"
Evaluation within deployment: "e3603b50"
Allocation "20951ad4" created: node "510898b6", group "webserver"
Allocation "43807686" created: node "28d7f859", group "webserver"
Allocation "7b60eb24" created: node "f3739267", group "webserver"
Evaluation status changed: "pending" -> "complete"
==> Evaluation "c7bcaf40" finished with status "complete"
이제 웹 서버를 배포하고 Fabio에 등록했어요. 포트 9999에서 Nomad 클라이언트 중 아무 것이나 방문해 Apache의 기본 웹 페이지를 볼 수 있어야 해요. 포트 9998에서 클라이언트 노드 중 아무 것이나 가서 Fabio의 웹 인터페이스를 방문하면 라우팅 테이블이 채워진 것을 관찰할 수 있어요.
Nomad 클라이언트 노드를 클라우드 제공자 로드 밸런서 뒤에 배치하기
Nomad 클라이언트 노드는 시간이 지나며 바뀔 수 있으므로 최종 사용자에게 서비스 접근을 위한 단일 엔드포인트를 제공하는 것이 중요해요. AWS Elastic Load Balancing (ELB), Azure Load Balancer, Google Cloud Load Balancing 같은 클라우드 제공자의 로드 밸런서 뒤에 Nomad 클라이언트 노드를 배치해 이를 수행할 수 있어요.
기본 단계는 로드 밸런서를 만들고, 로드 밸런서 뒤에 Nomad 클라이언트 노드를 등록하고, 리스너를 만들고, 건강 검사를 구성하는 것을 포함해요. 이 가이드를 따랐다면 Fabio에 대한 인그레스 경로를 만들어야 해요.
클라우드 제공자의 로드 밸런서를 구성한 후에는 클라우드 로드 밸런서 DNS 이름에 접근할 수 있어야 해요.
- 포트
80에서 Apache 홈 페이지 방문 - 포트
9998에서 Fabio 웹 UI 접근