우아한 테크 코스 Pro, 4주차 과제 - 그럴듯한 서비스 만들기
왜 Public Cloud인가?!
- 관심사를 분리하여 우리가 집중해야할 대상에 더욱 더 집중하기 위해서
- 즉 비즈니스(사업) 로직을 구현하는데 온 힘을 쏟아야한다!! 그러기 위한 환경을 구축해야한다.
기본 개념 정리
- 온프로미스 환경
- 자체적으로 보유한 전산실 서버에 직접 설치해 운영하는 방식
- Public Cloud 환경
- 서드파티 공급업체(클라우드 제공 업체)가 사용자에게 일련의 서비스를 제공하는 클라우드 환경
- Object Storage
- 논리적인 스토리지
- 어플리케이션단에서 동작
- 오직 키값과 데이터만을 저장하여 폴더와 블록에 종속되지 않고 단지 사용자에게 그렇게 보이게 해주기만 한다.
확장성과 속도, 저렴한 가격이 이점
RESTFul Protocol을 이용하여 Get, Post로 요청을 하면 파일을 내려주기 떄문에 그이상 알필요가 없다. ( 효율적으로 관리 가능 )
- But 파일의 수정이 불가능, 트랜잭션을 통해 일관성을 유지하기가 힘들기 때문에 덮어쓰는 방법을 이용, 이미지나 동영상 같이 수정이 잘 일어나지 않는 정적인 데이터를 호스팅할때 좋다.
- 파일 스토리지
- 폴더와 파일로 이루어지는 계층구조를 갖는 스토리지(저장소)
- 각 파일은 폴더에 종속, 폴더는 다른 폴더에 종속될 수 있다.
- OS단에서 동작
- 블록 스토리지
- 정해진 블록안에 데이터를 저장한다.
- 파티션을 나누고 그 공간안에서 사용한다.
- OS단에서 동작
AWS 네트워크 망 개념 정리
- 통신망
- 노드들과 이들 노드들을 연결하는 링크들로 구성된 하나의 시스템
- 하나의 서브넷을 하나의 망이라고 할 수 있다.
- 노드
- IP로 식별할 수 있는 대상
- 링크
- 물리적인 회선
- 서브넷
- 하나의 네트워크가 분할되어 나눠진 작은 네트워크 단
- AWS의 망구성
- Region: 네트워크 망이 구성될 국가 / 지역
- AZ(Availability Zone) : 데이터센터
- VPC: 하나의 서비스를 위한 네트워크를 다루는 단위
- 서브넷: VPC에 설정한 네트워크 대역을 더 세부적으로 나눈 네트워크
- 라우팅 테이블: 연결된 서브넷이 다른 서브넷 혹은 외부망과 통신하기 위한 정보를 보유
- 인터넷 게이트 웨이: 외부망과의 연결을 담당
OSI 7계층 간략 정리
1계층 Physical Layer(Bit)
- 결국 모든 컴퓨터는 0과1로 통신한다.
- 0과1의 나열을 아날로그 신호로 바꾸어 전선으로 흘려보내고(encoding)
아날로그 신호가 들어오면 0과1의 나열로 해석(decoding)하여 물리적으로 연결된 두 컴퓨터가 0과 1의 나열을 주고받을 수 있게 해주는 모듈 - 물리적인 하드웨어인 회로에 구현
단순히 전기적인 신호로 변환하여 주고받는 기능만 할뿐
- 케이블, 허브, 리피터
2계층 Data-Link Layer(Frame)
- 물리적 주소를 이용해 노드간 연결
- 브릿지, L2 스위치
브릿지나 스위치를 통해 맥주소를 가지고 물리계층에서 받은 정보를 전달
MAC address
네트워크 카드가 만들어 질때 물리적으로 할당 받는 주소 값
3계층 Network Layer(Packet)
- 논리적 주소로 최초 출발지부터 최종 목적지까지의 최적경로 결정
- 라우터, L3 스위치
- 로컬 또는 원격 장비간의 메시지
- IPv4, IPv6, ICMP
4계층 Transport Layer(Segment)
- 포트번호를 이용해 서비스를 구분하고 데이터의 전송을 담당
- L4 스위치, 소프트웨어 프로세스 간의 통신
양 끝단(End to end)의 사용자들이 신뢰성있는 데이터를 주고 받을 수 있도록 해주어,
상위 계층들이 데이터 전달의 유효성이나 효율성을 생각하지 않도록 해준다.
- TCP, UDP
5계층 Session Layer
- 데이터가 통신하기 위한 논리적인 연결
- 4계층에서도 연결을 맺고 종료할 수 있기 때문에 어느 계층에서 통신이 끊어 졋나 판단하기는 한계가 있다.
- 응용 프로그램간 세션 수립.유지.종료
- SAP, SDP
6계층 Presentation Layer
- 데이터의 표현(확장자, 연결, 압축, 암호화, 변환)
코드 간의 번역을 담당하여 사용자 시스템에서 데이터의 형식상 차이를 다루는 부담을 응용 계층으로부터 덜어준다.
- 해당 데이터가 TEXT인지, 그림인지, GIF인지, JPG인지의 구분 등이 표현 계층의 몫이다.
- SSL, MIME, redirector
7계층 Application Layer (응용계층)
- 사용자에게 인터페이스 제공, 원본데이터 생성
- HTTP(80), HTTPS(443), SMTP(25), FTP(20,21), Telnet(23), SSH(22)
L4 vs L7 로드 밸런싱
- 갑자기 궁금..
L4(Transport Layer)
- Round Robin 방식을 사용하며, 네트워크 계층(IP)이나 트랜스포트 계층(TCP, UDP)의 정보를 바탕으로 로드를 분산시킨다.
- IP, PORT, Session 기반으로 로드밸런싱
- 데이터 안을 들여다보지 않고 패킷레벨에서만 로드를 분산하기 때문에, 속도가 빠르고 효율이 높음
- Round Robin: 순차방식, 각 서버에 균등하게 분배하는 방식, 서버 커넥션 수나, 응답시간에 상관없이 모든 서버를 동일하게 처리
L7(Application Layer)
- 어플리케이션 계층(HTTP, FTP…)에서 로드를 분산하기 때문에
- HTTP 헤더, 쿠키 등과 같은 사용자의 요구를 청을 기준으로 특정 서버에 트래픽을 분산하는 것이 가능
- 패킷의 내용을 확인하고 그 내용에 따라 로드를 특정 서버에 분배하는 것이 가능 => 섬세한 라우팅이 가능
서브네팅
IPv4 서브넷 마스크
- 서브넷: 부분 네트워크
- 마스크: AND 연산 ( 특정부분만 그대로 두고싶으면 1로 0으로 변환하고 싶은 비트를 0으로 )
- 하나의 IP 패킷이 들어올때 255개(0~254)의 구역이 들어올 수 있구나를 안다.
- 구역을 나누고 싶다. «« 이때 쓰는 것이 서브넷 마스크
- A 클래스는 XXXX. 0000. 0000. 0000
- B 클래스는 XXXX. XXXX. 0000. 0000
- C 클래스는 XXXX. XXXX. XXXX. 0000
- 서브넷 255.255.255.0 » 아 대표망이 255개 구나 ( 기본 서브넷 마스크 )
- 255.255.255.128 » 대표망이 2개 브로드캐스팅 주소가 된다.
- 마지막 4번째 블록을 어떻게 쓰느냐에 따라서 브로드캐스팅이 분할이된다.
- 계산해보기
- (11000000)192로 쓰면 4구역
- (11100000)224 -> 2^3 = 8구역
- (11110000)240 -> 2^4 = 16구역
- 대표주소가 뭐냐 나눠지는 첫 주소
- 브로드캐스팅 주소가 뭐냐 마지막 주소
- 10개로 분할하고 싶다 -> 16개로 분할후 6개를 안쓰는거다
왜 컨테이너를 써야할까?
- 기존에 OS 가상화 방식을 사용하더라도 부팅 + 각종 OS 설정 + 어플리케이션 코드 옮겨서 빌드한 후 실행등 반복적인 작업..
- 또한 서비스가 점차 확장되면서 기존에 사용하던 서버와 새로 구축한 서버간에 설정의 차이가 발생하고, 관리자의 인적요소에도 영향을 받게된다.
컨테이너 단위로 사고하여, 적재하니 다른 컨테이너에 영향을 주지않는다 이를 통해 프로세스를 관리한다.
애플리케이션의 개발과 배포가 편해지며, 여러 애플리케이션의 독립성과 확장성이 높아진다
Docker 네트워크 구조
- Docker에 대해서는 따로 기술하겠습니다.
- 컨테이너를 생성하면 네트워크 인터페이스도 하나 생성된다. ( 독자적인 파일시스템이 생성되기 때문에, mac 주소와 prviate IP도 부여 받게 된다. )
- 이렇게 생성된 가상 네트워크 인터페이스는 실제로 외부와 통신할 수 있으며, veth로 시작하는 이름을 가진다.
- 컨테이너별로 생성된 veth 인터페이스는 컨테이너 내부 eth0 인터페이스와 연결 ( 가상 이더넷 )
- 외부와의 통신을 위해 도커에서는 docker0 브릿지를 생성하여 관리하게 된다.
- Docker host 내에 배포된 container 들 사이에는 각자 할당받은 Private IP를 이용해 자유롭게 통신이 가능하다.
- veth -> eth0(가상 이더넷) -> docker0 bridge -> host 내부 eth0
포트포워딩
- Docker container는 Private IP를 부여 받고, Docker host 내 bridge 형태로 연결되어 있기 때문에 직접적으로 외부와의 통신은 불가능한 상태
- 각 컨테이너의 IP를 확인하기가 어렵다.
- 이를 해결하고자
포트포워딩
을 사용한다. - 외부와 통신을 위해 각 컨테이너에 외부로 노출할 Port를 지정
1
docker run -p 8080:80
- docker host의 8080 port로 요청이 들어오면 container의 80포트로 포워딩 ( -p 옵션 )
미션 진행 회고
- 네트워크는 하나 공부하면 10개의 의문으로 증식하는 느낌..
- Docker, Network 공부 필요