echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
cat /proc/sys/net/ipv4/ip_nonlocal_bind
setsebool -P haproxy_connect_any=1
yum -y install haproxy
- /etc/haproxy/haproxy.cfg 파일을 수정한다.
haproxy를 이용해 HA 구성을 하려는 모든 서버에 동일한 설정 값을 넣는다.
vi /etc/haproxy/haproxy.cfg
global
# 로깅을 위한 설정
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 30m
timeout server 30m
timeout http-keep-alive 60s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# status web 설정
#---------------------------------------------------------------------
listen hastats
mode http
bind *:8080
stats enable
stats show-legends
stats uri /haproxy-status
stats auth username:password
#---------------------------------------------------------------------
# 프론트 엔드 설정
# 프론트 엔드에서 설정한 포트로 연결이 들어올 경우 백엔드로 보낸다
#---------------------------------------------------------------------
frontend kubeproxy
bind *:16443
default_backend kubeproxy
mode tcp
#16443으로 연결이 들어올 때 kubeproxy라는 백엔드로 연결
#---------------------------------------------------------------------
# 백엔드 설정
#---------------------------------------------------------------------
backend kubeproxy
balance roundrobin
mode tcp
option tcp-check
option tcplog
server k8s01 192.168.103.101:6443 check
server k8s02 192.168.103.102:6443 check
#프록시 멤버 숫자만큼 추가
# main frontend의 16443으로 연결이 들어오면 백엔드의 주소로 순차적으로 프록시(roundrobin일경우)
global
# 로깅을 위한 설정
# https://redmine.haedongg.net/projects/knowledge/wiki/Rsyslog_%EC%84%A4%EC%A0%95_
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
# 성능 관련 nbthread = CPU core
nbthread 16
tune.bufsize 32768
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# status web 설정
#---------------------------------------------------------------------
listen hastats
mode http
bind *:8080
stats enable
stats show-legends
stats uri /haproxy-status
stats auth username:password
#---------------------------------------------------------------------
# 프론트 엔드 설정
# 프론트 엔드에서 설정한 포트로 연결이 들어올 경우 백엔드로 보낸다
#---------------------------------------------------------------------
frontend main
bind *:16443
default_backend kubeproxy
mode tcp
#16443으로 연결이 들어올 때 kubeproxy라는 백엔드로 연결
#---------------------------------------------------------------------
# 백엔드 설정
#---------------------------------------------------------------------
backend kubeproxy
balance roundrobin
mode tcp
option tcp-check
option tcplog
server k8s01 192.168.103.101:6443 check
server k8s02 192.168.103.102:6443 check
#프록시 멤버 숫자만큼 추가
# main frontend의 16443으로 연결이 들어오면 백엔드의 주소로 순차적으로 프록시(roundrobin일경우)
global
nbthread 4
log /dev/log local0
log /dev/log local1 notice
daemon
maxconn 5120
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option dontlognull
option redispatch
retries 3
timeout connect 5s
timeout client 60s
timeout queue 1m
timeout server 60s
frontend kubernetes
bind *:6443
default_backend kubernetes
backend kubernetes
mode tcp
balance leastconn
option tcp-check
server cp1 192.168.11.11:6443 check
server cp2 192.168.11.12:6443 check
server cp3 192.168.11.13:6443 check
haproxy.cfg-
| 값 |
설명 |
| global |
전체 영역에 걸쳐 적용되는 기본 설정 |
| defaults |
이후 오는 영역(frontend, backend, listen)에 적용되는 설정 |
| frontend |
클라이언트 연결을 받아들이는 소켓에 대한 설정 |
| backend |
앞에서 들어온 연결에 할당될 프록시 서버들에 대한 설정 |
| listen |
frontend와 backend로 사용되는 포트를 한번에 설정하는 영역으로 TCP 프록시에서만 이용 |
| 값 |
설명 |
| Roundrobin |
순차적으로 분배 |
| static-rr |
서버에 부여된 가중치에 따라서 분배 |
| leastconn |
접속수가 가장 적은 서버로 분배 |
| source |
운영중인 서버의 가중치를 나눠서 접속자 IP 해싱(hashing)해서 분배 |
| uri |
접속하는 URI를 해싱해서 운영중인 서버의 가중치를 나눠서 분배 (URI의 길이 또는 depth로 해싱) |
| url_param |
HTTP GET 요청에 대해서 특정 패턴이 있는지 여부 확인 후 조건에 맞는 서버로 분배 (조건 없는 경우 round_robin으로 처리) |
| hdr |
HTTP 헤더에서 hdr()으로 지정된 조건이 있는 경우에 대해서만 분배 (조건없는 경우 round robin 으로 처리) |
| rdp-cookie |
TCP 요청에 대한 RDP 쿠키에 따른 분배 |
check 만 적어 두면 기본값으로 동작한다. 전환 시간은 세 값의 곱으로 정해진다.
- 쿠버네티스에서 로드밸런서가 필요한 지점은 두 곳이며 서로 다른 문제다.
- HAProxy 는 로그 파일을 직접 쓰지 않는다. syslog 로 보내고 rsyslog 가 파일에 떨어뜨린다. 그래서 설정이 두 군데에 있다.
client 와 server 는 전체 소요 시간이 아니라 무통신 상태(idle) 를 잰다. 데이터가 계속 흐르는 대용량 전송은 `tim…
- HAProxy 의 watchdog 이 특정 스레드가 정해진 시간 안에 이벤트 루프로 돌아오지 않는 것을 감지하고 프로세스를 종료시키는 상황이다…
- HAProxy 를 앞에 두면 백엔드 서버는 접속 출발지를 전부 HAProxy 의 IP 로 본다. 웹 서버 액세스 로그에 프록시 IP 만 남고,…