HAProxy를 활용한 컨테이너 proxy

wookja·2024년 6월 29일
0

Docker

목록 보기
3/3
post-thumbnail

HAProxy란?

  • 하드웨어 기반의 L4 / L7 스위치를 대체하기 위한 오픈소스 소프트웨어 솔루션
  • TCP 및 HTTP 기반 애플리케이션을 위한 고가용성(Active-Passive), Loadbalancing 및 proxy 기능을 제공하는 매우 빠르고 안정적인 무료 Reverse Proxy
  • 주요기능
  • SSL 지원
  • Loadbalancing
  • Active Health check
  • KeepAlived (proxy 이중화)

HAProxy는 특히 대규모 트래픽을 처리하는 애플리케이션에 적합하며, 간단한 설정만으로도 안정성과 성능을 확보할 수 있는 장점이 있습니다. 또한, 무료 오픈소스임에도 상용 제품 못지않은 성능을 제공합니다. SSL/TLS 암호화 지원을 통해 보안을 강화할 수 있으며, 다양한 환경에서 유연하게 동작합니다.

HAProxy L4 (Layer 4)

  • OSI 7 Layer 중 Layer 4는 IP를 이용한 트래픽 전달이 특징이다
  • HAProxy L4 구성 시 IP와 Port 기반으로 사용자 요청 트래픽을 전달하도록 구성
  • 요청에 대한 처리는 웹서버로 구성된 web 1~3에 round-robin 방식으로 부하 분산 된다.

L4 로드밸런싱은 IP와 포트를 기준으로 트래픽을 분산시킵니다. 이 방식은 빠르고, 간단한 네트워크 기반 트래픽 분산이 가능해 많은 웹 애플리케이션에서 사용됩니다. 예를 들어, 웹 애플리케이션 서버들이 여러 대 있을 경우, 각 서버로 트래픽을 고르게 분배해 서버 과부하를 방지할 수 있습니다.

HAProxy L7 (Layer 7)

  • OSI 7 Layer 중 Layer 7은 HTTP 기반의 URI를 이용한 트래픽 전달이 특징이다
  • 동일한 도메인(example.com)의 하위에 존재하는 여러 웹 애플리케이션 서버를 사용할 수 있다.
  • example.com/item 또는 example.com/basket으로 연결 된다.
  • 사용자의 요청과 설정에 따른 부하 분산

L7 로드밸런싱은 URI 경로에 따라 트래픽을 분산시킵니다. HTTP 프로토콜을 이해하여 도메인 하위의 특정 경로에 따라 다른 서버로 트래픽을 보낼 수 있어 더욱 세밀한 로드밸런싱이 가능합니다. 예를 들어, /item 페이지는 특정 서버로, /basket 페이지는 다른 서버로 분산시켜 성능 최적화와 보안성 강화에 유리합니다.

L7 HAProxy 실습 순서

1. 기본 HTTP 방식
VM IP:80 -> node1,2,3 에 대한 로드밸런싱 구현

2. L7 URI 방식
VM IP:80/item -> node1,2 로드밸런싱 구현
VM IP:80/basket -> node3,4 로드밸런싱 구현

실습 환경에서 기본 HTTP와 L7 URI 방식의 로드밸런싱을 구현하면서, 각각의 차이점을 직접 체험할 수 있습니다. 기본 HTTP 방식은 단순한 트래픽 분산을 지원하지만, URI 기반의 L7 방식은 애플리케이션별로 세분화된 로드밸런싱이 가능합니다. 이를 통해 보다 유연하고 효율적인 트래픽 관리가 가능해집니다.

실습 환경

NCP VM 사용 (Ubuntu 22.04 / vCPU2, RAM 4GB)
사전에 Docker engine 설치

1. 기본 HTTP 방식

  • VM IP:80 -> node1,2,3 에 대한 로드밸런싱 구현

WEB container 구성

root@wookjin:~# docker network create proxy-net
​
root@wookjin:~# docker run -d --name=echo-web1 --net=proxy-net -h echo-web1 dbgurum/haproxy:echo
root@wookjin:~# docker run -d --name=echo-web2 --net=proxy-net -h echo-web2 dbgurum/haproxy:echo
root@wookjin:~# docker run -d --name=echo-web3 --net=proxy-net -h echo-web3 dbgurum/haproxy:echo

haproxy.cfg 파일 생성

root@wookjin:~# mkdir conf && cd $_
root@wookjin:~/conf# 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 echo-web1:8080 check
  server s2 echo-web2:8080 check
  server s3 echo-web3:8080 check

HAProxy container 구성

root@wookjin:~/conf# docker run -d --name=haproxy-container --net=proxy-net -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5

접속 테스트

root@wookjin:~/conf# curl localhost:80
Request served by echo-web3
​
GET / HTTP/1.1
​
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
root@wookjin:~/conf# curl localhost:80
Request served by echo-web1
​
GET / HTTP/1.1
​
Host: localhost
Accept: */*
User-Agent: curl/7.81.0

2. L7 URI 방식

VM IP:80/item -> node1,2 로드밸런싱 구현
VM IP:80/basket -> node3,4 로드밸런싱 구현

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 myfrontend
  bind :80
  default_backend webservers
​
  acl echo-web1-item path_beg /item
  acl echo-web2-item path_beg /item
  acl echo-web3-basket path_beg /basket
  acl echo-web4-basket path_beg /basket
​
  use_backend echo-web1_backend if echo-web1-item
  use_backend echo-web1_backend if echo-web2-item
  use_backend echo-web2_backend if echo-web3-basket
  use_backend echo-web2_backend if echo-web4-basket
​
backend webservers
  balance roundrobin
  server s1 echo-web1-item:8080 check
  server s2 echo-web2-item:8080 check
  server s3 echo-web3-basket:8080 check
  server s4 echo-web4-basket:8080 check
​
backend echo-web1_backend
  server s1 echo-web1-item:8080 check
  server s2 echo-web2-item:8080 check
​
backend echo-web2_backend
  server s3 echo-web3-basket:8080 check
  server s4 echo-web4-basket:8080 check

WEB container 구성

root@wookjin:~/conf# docker run -d --name=echo-web1-item --net=proxy-net -h echo-web1-item dbgurum/haproxy:echo
root@wookjin:~/conf# docker run -d --name=echo-web2-item --net=proxy-net -h echo-web2-item dbgurum/haproxy:echo
root@wookjin:~/conf# docker run -d --name=echo-web3-basket --net=proxy-net -h echo-web3-basket dbgurum/haproxy:echo
root@wookjin:~/conf# docker run -d --name=echo-web4-basket --net=proxy-net -h echo-web4-basket dbgurum/haproxy:echo

HAProxy container 구성

root@wookjin:~/conf# docker run -d --name=haproxy-container --net=proxy-net -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5

접속 테스트

root@wookjin:~/conf# curl localhost/item
Request served by echo-web1-item
​
GET /item HTTP/1.1
​
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
root@wookjin:~/conf# curl localhost/item
Request served by echo-web2-item
​
GET /item HTTP/1.1
​
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
root@wookjin:~/conf# curl localhost/basket
Request served by echo-web3-basket
​
GET /basket HTTP/1.1
​
Host: localhost
Accept: */*
User-Agent: curl/7.81.0
root@wookjin:~/conf# curl localhost/basket
Request served by echo-web4-basket
​
GET /basket HTTP/1.1
​
Host: localhost
Accept: */*
User-Agent: curl/7.81.0

업로드중..

profile
차곡차곡 쌓아가는 Cloud 블로그

0개의 댓글