CentOS에서 LVS 사용하기
LVS(Linux Virtual Server)는 리눅스에서 구현된 로드밸런스 솔루션으로, L4 스위치의 역할을 한다.
1. 설치
LVS는 ipsvadm 패키지를 설치하면 된다.
# yum install ipvsadm
설치후 ipsvadm 커맨드를 실행하면 아래와 같은 결과를 볼 수 있다.
# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
2. 구성 및 설정
LVS/NAT 구성
로드밸런서(LVS) : 192.168.100.51(외부망), 172.16.1.51(내부망), CentOS 6
웹서버1 : 172.16.1.31(게이트웨이는 로드밸런서의 내부망 ip 주소), CentOS 6
웹서버2 : 172.16.1.32(게이트웨이는 로드밸런서의 내부망 ip 주소), CentOS 6
커널 파라에타에서 패킷 포워딩을 허용하도록 해준다. /etc/sysctl.conf에서 아래 부분을 수정하고 적용한다.
[root@fox1 ~]# cat /etc/sysctl.conf | grep -i forward # Controls IP packet forwarding #net.ipv4.ip_forward = 0 net.ipv4.ip_forward = 1 [root@fox1 ~]# sysctl -p
재부팅시 서비스를 자동으로 실행하도록 아래 커맨드를 실행한다.
[root@fox1 ~]# chkconfig --level 345 ipvsadm on
2.1. 룰 초기화
기존의 룰을 삭제한다. 물론, 지금은 처음 설치했기 때문에 수행하지 않아도 된다.
[root@fox1 ~]# ipvsadm -C
2.2. 가상 서비스 등록
여기서는 웹서비스를 등록하도록 할 것이다. 등록은 아래와 같은 형식으로 한다.
ipvsadm -A -t (서비스 IP 주소:Port 번호) -s (할당 방법) 아래에서 할당방법은 라운드로빈 방식이다.
[root@fox1 ~]# ipvsadm -A -t 192.168.100.51:80 -s rr
할당방식은 라운드로빈외 여러가지가 존재하며, 아래와 같다.
- rr(Robin Robin): 실 서버에 한번씩 번갈아가며 접속하는 방법
- wrr(Weighted Round Robin): 라운드로빈 방식에서 실제 서버에 가중치를 주어 가중치가 높은 서버에 더 자주 접속하는 방법
- lc(Least-Connection): 가장 접속이 적은 실제 서버로 더 많은 요청을 배분하는 방식.
- wlc(Weighted Least-Connection): lc 방식에 가중치(Ci/Wi)를주어 특정 서버에 더 많은 작업을 할당하는 방식. 옵션 없을경우 기본값.
- lblc(Locality-Based Least-Connection): 목적지 IP와 관련하여 가장 접속이 적은 서버로 더 많은 요청을 배분하는 방식.
- lblcr(Locality-Based Least-Connection with Replication): 목적지 IP와 관련하여 가장 접속이 적은 서버로 더 많은 요청을 배분하는 방식. LBLC 스케줄과의 차이는 대상 IP 주소를 실제 서버 노드의 서브셋으로 묶는것.
- dh(Destination Hashing): 정적 해쉬 테이블에 있는 목저지 IP를 찾아 실제 서버의 풀로 요청을 배분하는 방식.
- sh(Source Hashing): .정적 해쉬 테이블에 있는 소스 IP를 찾아 실제 서버의 풀로 요청을 배분하는 방식.
- sed(Shortest Expected Delay): 예상 지연이 가장 짧은 서버에 들어오는 작업을 할당하는 방식.
- nq(Never Queue): 빠른 작업을 기다리는 대신 들어오는 작업을 유휴 서버에 할당하는 방식. 모든 서버가 사용중인 경우 가장 짧은 예상 지연 정책을 적용하여 작업을 할당함.
2.3. 물리 서버 등록
ipvsadm -a -t (서비스 IP 주소:Port 번호) -r (실제 서버의 IP 주소:Port 번호) -m (“m” 은 masquerading (NAT)을 의미함) 형식으로 등록해준다.
[root@fox1 ~]# ipvsadm -a -t 192.168.100.51:80 -r 172.16.1.31:80 -m [root@fox1 ~]# ipvsadm -a -t 192.168.100.51:80 -r 172.16.1.32:80 -m
2.4. 등록된 서비스 확인.
아래 커맨드로 등록된 서비스 테이블을 확인 할 수 있다.
[root@fox1 ~]# ipvsadm -l IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP fox1:http rr -> 172.16.1.31:http Masq 1 0 0 -> 172.16.1.32:http Masq 1 0 0
2.5. 설정 저장.
아래 커맨드로 저장한다. 설정은 /etc/sysconfig/ipvsadm에 저장된다.
[root@fox1 ~]# /etc/init.d/ipvsadm save ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
3. 테스트
웹서버1, 웹서버2에 각각 apache 웹서버를 설치하고, index.html을 서로 다른 내용으로 만들고, 접속해 본다.
[root@fox1 ~]# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP fox1:http wlc -> 172.16.1.31:http Masq 1 0 4 -> 172.16.1.32:http Masq 1 0 4
접속할 때 마다, 서로 다른 서버에 접속됨을 확인 할 수 있다.
6 comments
Skip to comment form
안녕하세요. 좋은 정보 감사합니다. LVS 서버 만들어서 테스트 중인데 웹 서버를 만들어서 번갈아가면서 나오는지 확인하고 싶습니다. 그런데 VIP라서 저는 작성자님처럼 PC에서는 확인이 어려우니 LVS서버에서 curl을 이용해 VIP를 이용했는데
[root@e_cent html]# curl 192.168.0.125
curl: (7) Failed connect to 192.168.0.125:80; 호스트로 갈 루트가 없음 이렇게 나오더라구요.
혹시 어떻게 해야하는 지 도움을 주실 수 있나요?
참고로 LVS VIP가 192.168.0.125입니다.
ipvsadm 실행 결과가 3번과 비슷하게 나오면 설정 문제는 아닐것 같고요.
혹시 방화벽이 올라가서 차단될 수도 있으니,
iptables -L -v 로 방화벽 룰도 확인해 보셔요.
쿠버네티스의 kube-proxy의 모드를 ipvs로 바꾼 뒤 pod3개와 서비스를 생성했습니다.
ipvsadm -E -a {클러스터ip:80} -s lc
ipvsadm-save
위 명령을 통해 쿠버네티스의 해당 서비스 클러스터로 들어가는 스케쥴링을 rr에서 lc로 바꿨습니다. 하지만 다른 노드에서 curl 명령으로 해당 클러스터로 접근하거나 일정 시간이 지마녀 다시 rr로 바뀝니다. 이유를 알 수 있을까요?
http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.ipvsadm.html
이 문서에 의하면
lc는 매우 긴 세션에 적합하지만로드가 짧은 시간 단위로 변하는 웹 서버에는 적합하지 않으며, LVS에는 실제 서버에 대한로드 모니터링이 없다고 하네요.
그럼에도 불구하고 설정 자체가 바뀐다는것은…
lvs 설치한 곳 서버에서 80 이 LISTENING 상태인가요 ?!
Author
LVS 서버 말이죠?
LVS는 스위치 역할을 하기 때문에, 80 포트가 열려있지 않을 것으로 생각됩니다(추측입니다). 현재, 구현해 놓은 LVS가 없어서 확인은 못해봤어요..