Traefik으로 로드 밸런싱

Traefik으로 로드 밸런싱 (Load balancing with Traefik)

Traefik을 사용해 Nomad에서 HTTP(S) 및 TCP 요청을 로드 밸런싱하는 방법을 알아봐요.

출처: 문서

본문

Traefik은 인터넷에서 들어오는 HTTP(S) 및 TCP 요청을 처리할 수 있는 프런트엔드 서비스로 분산해요. Traefik의 Consul Catalog 문서는 태그를 사용해 트래픽을 라우팅하는 기능을 포함한 통합 세부 사항을 제공해요. 추가 세부 사항은 Traefik의 Rules & Priority 문서도 참고해요.

다음 단계에 따라 Traefik을 로드 밸런서로 사용해요.

  1. 작업 명세에 Traefik 전용 태그가 있는 애플리케이션을 배포해요.
  2. Traefik을 배포해요.

이 가이드는 데모 웹 애플리케이션의 로드 밸런서로 Traefik을 배포하는 방법을 보여줘요.

사전 요구 사항

Nomad 설치가 Consul을 사용하도록 구성되어야 해요. 자세한 내용은 Consul 통합 콘텐츠를 참고해요.

데모 웹 애플리케이션 배포

데모 웹 애플리케이션에 대한 작업 명세를 만들고 파일 이름을 webapp.nomad.hcl로 지어요. 이 작업 명세는 다음을 구성해요.

  • 데모 웹 애플리케이션의 인스턴스 세 개
  • 서비스 태그를 사용한 웹 앱 라우팅. 애플리케이션이 /에서 수신하지만 Traefik의 Path 옵션 덕분에 /myapp을 경로로 정의할 수 있어요.

webapp.nomad.hcl

job "demo-webapp" {
  datacenters = ["dc1"]

  group "demo" {
    count = 3

    network {
      port  "http"{
        to = -1
      }
    }

    service {
      name = "demo-webapp"
      port = "http"

      tags = [
        "traefik.enable=true",
        "traefik.http.routers.http.rule=Path(`/myapp`)",
      ]

      check {
        type     = "http"
        path     = "/"
        interval = "2s"
        timeout  = "2s"
      }
    }

    task "server" {
      env {
        PORT    = "${NOMAD_PORT_http}"
        NODE_IP = "${NOMAD_IP_http}"
      }

      driver = "docker"

      config {
        image = "hashicorp/demo-webapp-lb-guide"
        ports = ["http"]
      }
    }
  }
}

nomad run 명령으로 웹 애플리케이션 작업을 배포해요.

$ nomad run webapp.nomad.hcl
==> Monitoring evaluation "a2061ab7"
    Evaluation triggered by job "demo-webapp"
    Evaluation within deployment: "8ca6d358"
    Allocation "1d14babe" created: node "2d6eea6e", group "demo"
    Allocation "3abb950d" created: node "a62fa99d", group "demo"
    Allocation "c65e14bf" created: node "a209a662", group "demo"
    Evaluation status changed: "pending" -> "complete"
==> Evaluation "a2061ab7" finished with status "complete"

Traefik 작업 만들고 실행하기

traefik.nomad.hcl라는 작업 명세를 만들어요. 이 작업 명세는 다음을 구성해요.

  • Traefik용 8080의 정적 포트. 이 덕분에 클러스터 안 어디에서든 traefik.service.consul:8080을 조회해 데모 웹 애플리케이션에 도달할 수 있어요.
  • Traefik 대시보드용 8081의 정적 포트.
  • Consul Catalog 활성화를 포함한 Traefik 구성용 템플릿.

traefik.nomad.hcl

job "traefik" {
  region      = "global"
  datacenters = ["dc1"]
  type        = "service"

  group "traefik" {
    count = 1

    network {
      port "http" {
        static = 8080
      }

      port "api" {
        static = 8081
      }
    }

    service {
      name = "traefik"

      check {
        name     = "alive"
        type     = "tcp"
        port     = "http"
        interval = "10s"
        timeout  = "2s"
      }
    }

    task "traefik" {
      driver = "docker"

      config {
        image        = "traefik:v3.6.6"
        network_mode = "host"

        volumes = [
          "local/traefik.toml:/etc/traefik/traefik.toml",
        ]
      }

      template {
        data = <<EOF
[entryPoints]
    [entryPoints.http]
    address = ":8080"
    [entryPoints.traefik]
    address = ":8081"

[api]
    dashboard = true
    insecure  = true

# Enable Consul Catalog configuration backend.
[providers.consulCatalog]
    prefix           = "traefik"
    exposedByDefault = false

    [providers.consulCatalog.endpoint]
      address = "127.0.0.1:8500"
      scheme  = "http"
EOF

        destination = "local/traefik.toml"
      }

      resources {
        cpu    = 100
        memory = 128
      }
    }
  }
}

작업 명세에 Traefik 구성용 인라인 템플릿이 포함되어 있지만, task.artifact 스탠자와 함께 task.template 스탠자를 사용해 S3 버킷 같은 원격 소스에서 입력 템플릿을 다운로드할 수도 있어요. 자세한 내용은 template 예시를 참고해요.

nomad run 명령으로 Traefik 작업을 배포해요.

$ nomad run traefik.nomad.hcl
==> Monitoring evaluation "e22ce276"
    Evaluation triggered by job "traefik"
    Evaluation within deployment: "c6466497"
    Allocation "695c5632" created: node "a62fa99d", group "traefik"
    Evaluation status changed: "pending" -> "complete"
==> Evaluation "e22ce276" finished with status "complete"

Traefik 대시보드 확인

http://<your-traefik-address>:8081에서 Traefik 대시보드를 방문해 설정을 확인하고 기본 모니터링을 수행해요.

로드 밸런서에 요청하기

Traefik 로드 밸런서에 접근하면 다음 예시와 유사한 응답을 받아야 해요. 클러스터 안의 노드에서 curl 명령을 실행해요.

$ curl http://traefik.service.consul:8080/myapp
Welcome! You are on node 172.31.28.103:28893

Traefik이 세 개의 Nomad 클라이언트에 걸쳐 있는 데모 웹 애플리케이션의 배포 인스턴스 중 하나로 요청을 전달한 것을 주목해요. 출력은 데모 웹 애플리케이션 호스트의 IP 주소를 보여줘요. 요청을 반복하면 어떤 백엔드 웹 서버 인스턴스가 요청을 받았는지에 따라 IP 주소가 바뀌어요.

Nomad 클라이언트 노드를 클라우드 제공자 로드 밸런서 뒤에 배치하기

Nomad 클라이언트 노드는 시간이 지나며 바뀔 수 있으므로 최종 사용자에게 서비스 접근을 위한 단일 엔드포인트를 제공하는 것이 중요해요. AWS Elastic Load Balancing (ELB), Azure Load Balancer, Google Cloud Load Balancing 같은 클라우드 제공자의 로드 밸런서 뒤에 Nomad 클라이언트 노드를 배치해 이를 수행할 수 있어요.

기본 단계는 로드 밸런서를 만들고, 클라이언트 노드를 등록하고, 리스너를 만들고, 건강 검사를 구성하는 것을 포함해요. 이 가이드를 따랐다면 Traefik에 대한 인그레스 경로를 만들어야 해요.

클라우드 제공자의 로드 밸런서를 구성한 후에는 클라우드 로드 밸런서 DNS 이름에 접근할 수 있어야 해요.

  • 포트 8080에서 데모 웹 애플리케이션 관찰
  • 포트 8081에서 Traefik 웹 UI 접근

더 알아보기 (Learn more)