[Docker] HAproxy

Na young·2024년 2월 14일
0

Docker

목록 보기
5/8

HAproxy

하드웨어 기반인 LA/L7 스위치를 대체하기 위한 프록시 솔루션

  • TCP 및 http 기반으로 제공을 하며 SSL 지원, 로드밸런싱, 액티브 헬스체크, keep alived 등의 기능을 한다

  • L4 (전송계층) 스위치를 대체하는 경우 IP를 통한 트래픽 전달을 수행한다.

  • 요청에 대한 처리는 라운드로빈 (round-robin) 방식을 기본으로 한다

  • L7 (응용계층) 스위치를 대체하는 경우 URI를 통한 트래픽 전달이 가능하다


Http 방식

실습

  1. 네트워크 생성 : 네트워크 기반으로 돌아가야하기 때문에
    $ docker network create haproxy-network

  1. chadchae1009/haproxy:echo 설치

    $ docker run -d --name=web1 --net=haproxy-network -h web1 chadchae1009/haproxy:echo

    $ docker run -d --name=web2 --net=haproxy-network -h web2 chadchae1009/haproxy:echo

    $ docker run -d --name=web3 --net=haproxy-network -h web3 chadchae1009/haproxy:echo

  2. config 파일 생성
    $ 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 서버명:포트 check
	server s2 서버명:포트 check
	server s3 서버명:포트 check

-> 우리는 서버명 web1, 포트번호 8080으로 진행하였다.

  • defaults의 mode
    • http: L7
    • TCP: L4
  • frontend stats
    • haproxy의 통계를 잡기 위해 8404번 포트를 오픈한다
  • frontedn myfrontend
    • upstream처럼 디폴트 설정에 대한 그룹 설정
    • 80번 포트로 들어오는 것을 webservers로 보낸다는 뜻
  • backend webservers
    • 해당 리버스 프록시가 연결해줄 서버 목록
  1. haproxy 설치
    $ docker run -d --name=haproxy-con --net=haproxy-network -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5
  • $(pwd)
    • pwd 수행의 결과(현재경로)와 컨테이너 내부를 연결해주기 위한 볼륨 설정. 내용 구성물이 같아짐

CURL로 접속하기


8404번 포트로 접속하기


URI 방식

L4 스위치 실습

  1. haproxy 컨테이너 삭제
    $ docker stop haproxy-con
    $ docker rm haproxy-con

  2. 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

	acl 서버명1 path_beg /서버명1
	acl 서버명2 path_beg /서버명2
	acl 서버명3 path_beg /서버명3

	use_backend 서버명1_backend if 서버명1
	use_backend 서버명2_backend if 서버명2
	use_backend 서버명3_backend if 서버명3

backend webservers
	balance roundrobin
	server s1 서버명1:포트 check
	server s2 서버명2:포트 check
	server s3 서버명3:포트 check

backend 서버명1_backend
	server s1 서버명1:포트 check
backend 서버명2_backend
	server s2 서버명2:포트 check
backend 서버명3_backend
	server s3 서버명3:포트 check
    
  • acl과 path_beg은 우측의 /서버명 으로 접근시 좌측의 서버명으로 이동시킨다
  1. haproxy 설치
    $ docker run -d --name=haproxy-con --net=haproxy-network -p 80:80 -p 8404:8404 -v $(pwd):/usr/local/etc/haproxy:ro haproxytech/haproxy-alpine:2.5

curl로 접속하기


8404번 포트로 접속하기


특정 uri에 여러개의 서버 붙이기

  1. 기존의 컨테이너와 웹서버 삭제 후 생성

  2. haproxy.cfg 파일 작성

global
	stats socker /var/run/api.sock user \
 haproxy group haproxy mode 660 level admin expose-fd listeners

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

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

frontend myfrontend
	bind :80
	default_backend webservers

	acl 서버명1 path_beg /uri1
	acl 서버명2 path_beg /uri1
	acl 서버명3 path_beg /uri2
	acl 서버명4 path_beg /uri2

	use_backend 그룹명1_backend if 서버명1
	use_backend 그룹명1_backend if 서버명2
	use_backend 그룹명2_backend if 서버명3
	use_backend 그룹명2_backend if 서버명4

backend webservers
	balance roundrobin
	server s1 서버명1:포트 check
	server s2 서버명2:포트 check
	server s3 서버명3:포트 check
	server s4 서버명4:포트 check

backend 그룹명1_backend
	server s1 서버명1:포트 check
	server s2 서버명2:포트 check
backend 그룹명2_backend
	server s3 서버명3:포트 check
	server s4 서버명4:포트 check

  • grp1 , grp2를 확인할 수 있음
profile
개발어린이

0개의 댓글