Search
Duplicate
📒

[Docker Container] 05-3. Docker DNS, 컨테이너 프록시

상태
미진행
수업
Docker Container
주제
Docker
연관 노트
3 more properties
참고

Docker DNS

NOTE
Docker 컨테이너는 IP를 사용자 정의 네트워크의 컨테이너 이름으로 자동 확인하는 DNS 서버가 Docker 호스트에 생성된다! (127.0.0.1)
libnetwork를 사용해 모든 컨테이너가 이름으로 서로 찾을 수 있게한다!
동일 네트워크 alias 할당을 통해 하나의 타겟 그룹을 만들어 요청에 RR형식으로 응답
컨테이너 생성 시 호스트 시스템에서 다음 3파일을 보관하여 컨테이너 내부에 적용해 컨테이너간 이름으로 찾기가 가능해진다.
/etc/hostname
/etc/hosts
/etc/resolv.conf

사용자 정의 네트워크의 docker-DNS 확인

NOTE
도커 네트워크를 생성하고, nslookup으로 doamin ip주소를 확인한다!
docker network create fc-net docker network ls route docker run -d --name=es1 --net=fc-net --net-alias=esnet-tg -p 9201:9200 -p 9301:9300 -e "discovery.type=single-node" elasticsearch:7.17.10 docker run -d --name=es2 --net=fc-net --net-alias=esnet-tg -p 9202:9200 -p 9302:9300 -e "discovery.type=single-node" elasticsearch:7.17.10 docker ps | grep es
Bash
복사
네트워크 생성후 2개의 컨테이너에 연결
docker run -it --rm --name=request-container --net=fc-net busybox nslookup esnet-tg docker run -it --rm --name=request-container --net=fc-net busybox nslookup 172.18.0.2 docker run -it --rm --name=request-container --net=fc-net busybox nslookup 172.18.0.3
Bash
복사
esnet-tg(도커 네트워크)의 도메인을 확인하고, ip로 검색해본다.
busybox에 동일한 네트워크를 설정하고 nslookup(도메인 확인) 명령어로 구성확인 ⇒ esnet-tg가 확인됨
앞서 올렸던 컨테이너들의 주소역시 확인이 가능
docker run -it --rm --name=request-container --net=fc-net centos:8 bash curl -s esnet-tg:9200
Bash
복사
컨테이너에 도커 네트워크 연결하고 실행
연속적으로 요청하면 해당 네트워크에서 각 컨테이너가 라운드 로빈형식으로 응답이됨 (자동 부하분산이됨)

docker DNS를 활용한 docker proxy(Load balancing)

NOTE
Linux bridge ⇒ 커널 내부의 물리적 스위치를 가상으로 구현한 OSI Layer 2 Device!
docker dnx를 활용한 docker proxy (Load Balancing)
1.
사용자 정의 Bridge network 생성
2.
--net-alias를 이용한 target group 생성
3.
등록된 DNS 등록 확인 (dig tool)

동일 도커 네트워크의 로드 밸런싱

# 도커 네트워크 생성 docker network create \ --driver bridge \ --subnet 172.200.1.0/24 \ --ip-range 172.200.1.0/24 \ --gateway 172.200.1.1 \ netlb # 도커 네트워크 확인 && ip table 확인 docker network ls route # 동일 네트워크로 컨테이너 3개 실행 docker run -itd --name=nettest1 --net=netlb --net-alias tg-net ubuntu:14.04 docker run -itd --name=nettest2 --net=netlb --net-alias tg-net ubuntu:14.04 docker run -itd --name=nettest3 --net=netlb --net-alias tg-net ubuntu:14.04 # 각 컨테이너의 IP주소 확인 docker inspect nettest1 | grep IPAddress docker inspect nettest2 | grep IPAddress docker inspect nettest3 | grep IPAddress
Bash
복사
net-alias ⇒ tg-net
각 컨테이너의 네트워크 IPAddress ( 2~4 범위로 할당됨 )
docker run -it --name=frontend --net=netlb ubuntu:14.04 bash ping -c 2 tg-net
Bash
복사
netlb(도커 네트워크) 에 연결된컨테이너로 들어가서 ping 테스트
라운드 로빈 형식으로 자동 로드밸런싱이 진행되고 있는걸 알 수 있음!

dig 명령어를 활용한 DNS 확인

apt update apt-get -y install dnsutils dig tg-net
Bash
복사
dig 설치 (DNS 확인용도)
DNS 정보 확인가능!
docker run -itd --name=nettest4 --net=netlb --net-alias=tg-net ubuntu:14.04 dig tg-net
Bash
복사
netlb에 새로운 컨테이너 추가
네트워크에 컨테이너 추가하면 바로 정보추가됨.

컨테이너 Proxy

NOTE
Proxy server ⇒ 요청자 - 응답자 간의 중계 역할을 수행한다! (통신 대리를 수행함)
Proxy 구성이 없다면, 요청이 직접 웹서버에 전달되어 부담을 가증시킨다.
단일 웹서버 구성
장애 발생 시 서비스 가용성에 치명적이다.
다중 웹서버 구성
여러 사용자의 요청을 처리할 경우에도 부하를 적절히 분산시켜야 한다.
적절한 분산이 실패하는 문제 (HotSpot)
프록시 서버의 위치에 따라 foward / reverse로 구분한다.

Foward Proxy

NOTE
client - Internet 사이에 위치한 프록시 서버!
서버에 노출되지 않는다.
자주 요청되는 정적 파일 캐싱, 서버부하 트래픽을 줄여 빠른응답을 하는 서버로 사용할 수 있다.
학교 및 사내망에서 보안을 위한 특정 사이트 접근을 차단한다.

Reverse Proxy

NOTE
Internet - Server 사이에 위치한 프록시 서버!
클라이언트에 노출되지 않는다.
다중 호스트(Cluster)를 활용하여 트래픽 분산을 할 수 있는 로드밸런싱 구현에 사용된다.
무중단 배포의 구현에 사용된다.
SSL 암호화 적용으로 보안 강화에 사용된다.

Nginx

NOTE
웹 서버를 구성하는 가장 대표적인 방법!
쿠버네티스의 ingress controller로 nginx ingress controller 선택이 가능하다.
추가 구성으로 Reverse Proxy및 API Gateway 구성이 가능하다.
설정은 /etc/nginx/nginx.conf 변경을 통해 구성할 수 있다.

Nginx-reverse proxy

기존 분배 방식 LB는 RR로 처리한다.
요청이 적은 서버로 보내는 방식은 least_conn
IP당 서버를 분배하는 ip_hash 등 여러가지 알고리즘을 사용할 수 있다.

HAproxy

NOTE
하드웨어 기반의 L4/L7 스위치를 대체하기 위한 오픈소스 솔루션
TCP 및 HTTP 기반 애플리케이션을 위한 고가용성 로드밸런싱 및 프록시 기능을 제공하는 무료 리버스 프록시다.
주요기능
ssl 지원
LB
헬스체크
KeepAlived(proxy 이중화)

HAproxy L4

OSI 7계층 중 L4는 IP를 이용한 트래픽 전달이 특징
IP, Port기반으로 사용자 요청 트래픽을 전달 받는다.

HAproxy L7

OSI 7계층 중 L7는 URI를 이용한 트래픽 전달이 특징
HTTP 기반의 URI를 이용한 트래픽을 전달 받는다.
동일한 도메인의 하위에 존재하는 여러 웹 애플리케이션 서버를 사용할 수 있다.
example.com/item or example.com/basket 으로 연결된다.