Infra/cloud

[AFOS] 7주차 네트워크 서비스(ELB) - 실습 : NLB

미니문92 2021. 7. 27. 03:30

4. NLB (Network Load Balancer)

 


NLB 생성

기본 구성

  • 이름(NLB-TEST), 인터넷 경계
  • 리스너 : 프로토콜(UDP), 포트(161)
  • 가용 영역 : ELB-VPC, 2a 와 2c 선택 - IP는 AWS에서 할당 or 사용자의 EIP 사용 가능

보안 설정 구성 : skip

보안 그룹 구성 없음

라우팅 구성

  • 대상 그룹(새 대상 그룹), 이름(NLB-TG), 대상 유형(인스턴스), 프로토콜(UDP), 포트(161)
  • 상태 검사(HTTP) → 고급 상태 검사 설정 : 간격(10), 나머지는 기본값 ⇒ UDP는 기본 단방향 통신으로 상태검사에 비적합

대상 등록 : 하단 인스턴스 선택 → 등록된 항목에 추가

검토 → 생성

 

 


NLB 검증

  • 설정 확인 : 로드밸런서(앞단, 리스너) , 대상그룹(뒷단, 대상)

  • My-EC2 에서 확인
# NLB DNS 이름을 변수로 지정 << 아래 NLB 정보는 각자 멤버들 실습 결과 정보 입력
[ec2-user@MyEC2 ~]$ NLB=NLB-TEST-e0cec16378b4c669.elb.ap-northeast-2.amazonaws.com
[ec2-user@MyEC2 ~]$ echo $NLB
NLB-TEST-e0cec16378b4c669.elb.ap-northeast-2.amazonaws.com

# NLB는 아래 도메인 쿼리 응답 IP가 고정
[ec2-user@MyEC2 ~]$ dig $NLB +short
3.38.18.62
3.37.170.64
[ec2-user@MyEC2 ~]$ while true; do dig $NLB +short && echo "------------------------------" && date; sleep 5; done
3.38.18.62
3.37.170.64
------------------------------
Mon Jul 26 20:19:28 UTC 2021
^C

# NLB IP를 변수에 지정
[ec2-user@MyEC2 ~]$ NLB1=3.38.18.62
[ec2-user@MyEC2 ~]$ NLB2=3.37.170.64

# curl 접속 테스트
# NLB 는 5 Tuple Hash 결과로 분산하며 default 설정이 Cross Zone Load Balancing(교차 영역 로드 밸런싱)이 비활성화 상태
[ec2-user@MyEC2 ~]$ for i in {1..20}; do snmpget -v2c -c public $NLB 1.3.6.1.2.1.1.5.0 ; done | sort | uniq -c | sort -nr
     10 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-2
     10 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-1
[ec2-user@MyEC2 ~]$ for i in {1..20}; do snmpget -v2c -c public $NLB1 1.3.6.1.2.1.1.5.0 ; done | sort | uniq -c | sort -nr
     20 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-1
[ec2-user@MyEC2 ~]$ for i in {1..20}; do snmpget -v2c -c public $NLB2 1.3.6.1.2.1.1.5.0 ; done | sort | uniq -c | sort -nr
     20 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-2
  • ELB-EC2-1, 2에서 확인
# 패킷덤프 시 클라이언트IP가 NLB를 경유해서 인입하였지만 변경 안됨 - 클라이언트IP보존
# EC2 보안그룹에 NLB로 서비스하는 포트의 대상을 대부분 0.0.0.0/0 지정하게됨 - 클라이언트IP로 인입되기 때문

# EC2-1
[root@ELB-EC2-1 ~]# tcpdump udp port 161 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:35:13.089601 IP 13.124.88.91.44479 > 10.0.0.202.161:  GetRequest(28)  .1.3.6.1.2.1.1.5.0
20:35:13.089956 IP 10.0.0.202.161 > 13.124.88.91.44479:  GetResponse(37)  .1.3.6.1.2.1.1.5.0="ELB-EC2-1"




# EC2-2
[root@ELB-EC2-2 ~]# tcpdump udp port 161 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:35:13.072072 IP 13.124.88.91.48247 > 10.0.1.39.161:  GetRequest(28)  .1.3.6.1.2.1.1.5.0
20:35:13.072454 IP 10.0.1.39.161 > 13.124.88.91.48247:  GetResponse(37)  .1.3.6.1.2.1.1.5.0="ELB-EC2-2"

 


NLB Cross Zone Load Balancing 활성화

  • NLB-TEST 속성 편집 : 교차 영역 로드 밸런싱(활성화)
  • My-EC2 에서 확인
# curl 접속 테스트

[ec2-user@MyEC2 ~]$ for i in {1..20}; do snmpget -v2c -c public $NLB1 1.3.6.1.2.1.1.5.0 ; done | sort | uniq -c | sort -nr
     13 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-2
      7 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-1
[ec2-user@MyEC2 ~]$ for i in {1..20}; do snmpget -v2c -c public $NLB2 1.3.6.1.2.1.1.5.0 ; done | sort | uniq -c | sort -nr
     11 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-1
      9 SNMPv2-MIB::sysName.0 = STRING: ELB-EC2-2


# 어느정도 load balancing 되는것을 확인할 수 있음