Chapter 5. Docker HA Proxy

안녕하세요 :)
컨테이너 환경이든, 온프레미스 환경이든
인프라 운영에 가장 중요한 부하분산 테스팅을 해볼 예정입니다.

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
생성 후, 하기와 같이 확인하는 작업은 꼭 필수!!

📌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 컨테이너로 부하 분산 확인