Cloud Architect/Docker

Chapter 5. Docker HA Proxy

"Everything about infra" 2025. 11. 20. 17:50

안녕하세요 :)

컨테이너 환경이든, 온프레미스 환경이든

인프라 운영에 가장 중요한 부하분산 테스팅을 해볼 예정입니다.

 

오늘 소개해드릴 HA Proxy Architecture 입니다.

 

01. HA Proxy 환경 생성

먼저, 웹서버 및 HA Proxy 컨테이너에서 사용할 docker network를 생성해보자.

 

📌Web server 생성

  • 부하분산 테스팅을 위해 앞에 LB를 생성하기 이전에, 테스팅용 웹서버를 컨테이너로 생성하자.
docker run -d --name=ssunghwan-web01 --net=ssunghwan-proxy -h web01 dbgurum/haproxy:echo
docker run -d --name=ssunghwan-web02 --net=ssunghwan-proxy -h web02 dbgurum/haproxy:echo
docker run -d --name=ssunghwan-web03 --net=ssunghwan-proxy -h web03 dbgurum/haproxy:echo

 

📌HA Proxy 생성

 

컨테이너를 생성하기에 앞서, HA Proxy에서 사용할 Config 파일을 먼저 만든 후에, 컨테이너에 같이 Build

vi haproxy.cfg

 global
   stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
   log stdout format raw local0 info

defaults
   mode http
   timeout client 10s
   timeout connect 5s
   timeout server 10s
   timeout http-request 10s
   log global

frontend stats
   bind *:8404
   stats enable
   stats uri /
   stats refresh 10s

frontend myfrontend
   bind :80
   default_backend webservers

backend webservers
   server s1 ssunghwan-web01:8080 check
   server s2 ssunghwan-web02:8080 check
   server s3 ssunghwan-web03:8080 check

 

  • HA Proxy용 컨테이너를 생성하여 웹서버에 Traffic이 오면, 3개로 부하 분산을 해주는 LB 컨테이너 생성하자.
  • LB의 기본값은 라운드로빈 형태로 부하분산을 시키므로 참고바랍니다.
docker run -d --name haproxy-container --net ssunghwan-proxy -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5

 

 

생성 후, 하기와 같이 확인하는 작업은 꼭 필수!!

haproxy용 & web server용 테스팅 컨테이너 생성 완료.

 

📌Server에서 부하 분산 테스팅

  • 먼저 docker-proxy로 인해서 생성된 컨테이너에 대해 80포트가 열려있는지 확인(웹서버)
  • curl 명령으로 localhost에 트래픽을 보냈을 시에, web server 3개로 라운드로빈 형태로 부하 분산.
    • haproxy가 80포트에 대해 컨테이너의 8080포트로 proxy 해주는 역할을 해줌으로써 분산 성공
  • 또한, 로컬PC 브라우저에서 웹서버(HostOS)IP에 대한 8404 요청을 보내보자.
    • ex: http://172.x.x.x:8404
    • 현재 부하분산 트래픽에 대한 통계가 나온다!!

 


02. L7 URI 방식

앞서 테스트한 방식은 경로에 대한 트래픽 분산이 아닌, 80포트 요청에 대해 모두 8080포트로 분산을 해줬다면

이번에는 '/path'에 대해 URI 방식으로 분산하는 테스팅을 진행 해보도록 하겠습니다.

 

📌HA Proxy Config 파일 수정

  • frontend myfrontend 아래 문법은 하기와 같습니다.
    • acl [acl 이름 지정] path_beg [경로 이름] 으로 작성.
    • use_backend [웹서버 컨테이너 이름_backend] if [acl 이름 지정]
global
   stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
   log stdout format raw local0 info

defaults
    mode http
    timeout client 10s
    timeout connect 5s
    timeout server 10s
    timeout http-request 10s
    log global

frontend myfrontend
    bind :80
    acl is_web01_routing path_beg /web01
    acl is_web02_routing path_beg /web02
    acl is_web03_routing path_beg /web03

    use_backend ssunghwan-web01_backend if is_web01_routing
    use_backend ssunghwan-web02_backend if is_web02_routing
    use_backend ssunghwan-web03_backend if is_web03_routing

    default_backend webservers

backend ssunghwan-web01_backend
    server s1 ssunghwan-web01:8080 check

backend ssunghwan-web02_backend
    server s2 ssunghwan-web02:8080 check

backend ssunghwan-web03_backend
    server s3 ssunghwan-web03:8080 check

backend webservers
    balance roundrobin
    server s1 ssunghwan-web01:8080 check
    server s2 ssunghwan-web02:8080 check
    server s3 ssunghwan-web03:8080 check

 

📌HA Proxy Container 재생성

  • 기존 HA Proxy 컨테이너는 삭제 후, 재생성 하였습니다.

 

📌Server에서 부하 분산 테스팅

 

1) 기존과 같은 라운드로빈 형식 부하분산

 

2) 경로를 지정하여 트래픽 요청 시 해당 경로에 대해서만 전달.

 


2-1. URI - MSA 버전

이번에는 특정 경로에 두개의 컨테이너를 붙혀서 테스팅 해보도록 하겠습니다.

예를들어 /event 경로에 접근 시 web01, web02 컨테이너로 라운드로빈 부하분산 방식으로 MSA를 구성해봅시다.

 

📌HA Proxy Config 파일 수정

global
   stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
   log stdout format raw local0 info

defaults
    mode http
    timeout client 10s
    timeout connect 5s
    timeout server 10s
    timeout http-request 10s
    log global

frontend myfrontend
    bind :80
    acl is_login path_beg /login
    acl is_event path_beg /event

    use_backend web-login if is_login
    use_backend web-event if is_event

    default_backend webservers

backend web-login
    server s1 ssunghwan-web01:8080 check
    server s2 ssunghwan-web02:8080 check

backend web-event
    server s3 ssunghwan-web03:8080 check
    server s4 ssunghwan-web04:8080 check

backend webservers
    balance roundrobin
    server s1 ssunghwan-web01:8080 check
    server s2 ssunghwan-web02:8080 check
    server s3 ssunghwan-web03:8080 check
    server s4 ssunghwan-web04:8080 check

 

수정 후, 마찬가지로 기존 haproxy container는 삭제 후 재빌드 하였습니다.

 

📌Server에서 부하 분산 테스팅

  • /login 경로로 요청시 web01, web02 컨테이너로 부하 분산 확인
  • /event 경로로 요청시 web03, web04 컨테이너로 부하 분산 확인