OpenStack 기초
- OpenStack은 Cloud OS이다.
- VM을 관리해준다.
- 지금은 컨테이너를 서비스하는 용도로도, Bare Metal을 서비스하는 용도로도 가능하다. => IaaS
- Bare Metal: 서버를 한꺼번에 쓰고 싶을 때. 하드웨어의 리소스를 공유하는 가상화 방식과는 다르게, 하드웨어의 모든 성능을 사용할 수 있는 방식이 베어 메탈 방식이다.
- 서버를 직접 구축하는 것보다 Bare Metal을 빌려 쓰는 것의 장점
- Capex(Capital): 살 때 들어가는 돈
- Opex(Operation): 운용하는데 들어가는 돈
- Capex 때문에 Bare Metal을 빌려 쓰는 것임. Opex는 사용료가 들어가서 더 비쌀 수도 있음.
- 회사 안에 두는 것: On premise
- 빌려 쓰는 것은 Cloud?
- 둘이 섞어 쓰는 것은 Hybrid
- 서버를 직접 구축하는 것보다 Bare Metal을 빌려 쓰는 것의 장점
- Bare Metal: 서버를 한꺼번에 쓰고 싶을 때. 하드웨어의 리소스를 공유하는 가상화 방식과는 다르게, 하드웨어의 모든 성능을 사용할 수 있는 방식이 베어 메탈 방식이다.
nova의 시작
- Controller Node에서 Compute Node로 요청
- nova-api가 여기저기서 오는 요청을 받는다. (Horizon, heat engine, key stone, ...)
- nova-api는 사용자의 요청을 수신한다.
- key-stone은 인증을 받아서 이용하는데 사용
- heat-engine은 사람이 정의하는 스펙보다 더 정교한 스펙을 요구할 경우
- nova-compute는 hypervisor와 상호작용한다.
- nova는 hypervisor를 관리하는 api를 제공하며, 인스턴스(VM) 생성을 관리한다.
- 제어 기능이 Controller Node에 위치하여 Compute Node를 관리한다.
- 중앙에 Controller Node가 Hypervisor를 컨트롤한다.
- 한번에 여러개의 요청이 들어오면 Queue를 통해 스케줄링을 한다. (Scheduler가 있음)
- Scheduler는 컨트롤러가 어느 Compute Node에 실행될지 결정한다.
- 이것을 저장하기 위한 것이 nova database
- Compute Node 역할
- 인스턴스 실행
- Compute Node는 VM이나 인스턴스를 실행하는 물리적 서버이다. Hypervisor를 사용해 가상 머신을 구동한다.
- 하이퍼바이저와 상호 작용
- Compute Node의 nova compute는 Hypervisor와 직접 상호작용하여 VM을 생성하고 관리한다.
- 인스턴스 실행
- Controller Node 역할
- API 요청 처리
- 스케줄링
- 네트워크 관리(neutron)
- 인증 및 권한 관리(keystone)
- 이미지 관리 (Glance)
Controller Node와 Compute Node의 상호 작용
- 사용자 요청: Controller Node의 nova-api를 통해 사용자 요청이 받아 들여진다.
- 스케줄링: 어떤 Compute Node에 VM이나 컨테이너를 배치할지 결정한다.
- 큐를 통한 통신: Controller Node의 nova-api는 요청을 큐에 넣고, Compute Node의 nova-compute는 이 큐에서 요청을 읽어 작업을 처리한다.
- 하이퍼바이저에서 VM 실행: 선택된 Compute Node의 nova-compute는 Hypervisor를 통해 실제로 VM이나 컨테이너를 생성한다.
- 상태 보고: Compute 노드에 VM이나 컨테이너가 생성이 완료되면, 그 상태를 큐를 통해 Controller Node에 보고하고, Controller Node는 이를 보고 필요한 후속 작업을 진행한다.
Controller Node와 Compute Node는 내부적인 네트워크에 연결이 되어 있어야 한다. => VLAN, VXLAN
VLAN과 VXLAN
- VLAN
- LAN의 헤더에는 MAC 주소가 들어간다. (LAN은 데이터 링크계층 (Layer2)) => 연결이 되면 모두에게 닿을 수 있다.
- VLAN은 LAN에 연결되어 있는 것을 논리적으로 쪼갠다. -> 그룹간, 회사 부서들 간 쪼개기
- 그룹이 다르면 스위치 막는다. (스위치는 데이터 링크 계층, MAC 주소 기반)
- 헤더에 MAC 주소와 VLAN ID가 들어간다.
- 서로 다른 서브넷끼리 연결하려면 라우터 필요하다. 그래서 VLAN을 확장한게 VXLAN이다.
- VXLAN
- VLAN의 제한을 확장하기 위해 24bit의 VNI(VXLAN Network Identifier) (->약 1600만개)를 사용한다.
- VLAN ID는 12bit => 4096개의 VLAN ID 가능
- 대규모 데이터센터나 클라우드 환경에서는 테넌트 4096개는 부족함.
- VLAN ID는 12bit => 4096개의 VLAN ID 가능
- 네트워크 확장
- VLAN은 물리적인 네트워크 장비와 직접 연결되어 설정
- 가상화된 서버나 데이터 센터의 환경에서 서버가 물리적으로 이동할 때 네트워크 구성도 변경되어야 한다.
- VLAN은 같은 브로드캐스트 도메인(같은 물리적 장치에 연결)끼리만 통신 가능하다.
- VLAN은 물리적으로 가까운 곳만
- VXLAN은 Layer3 위에 Layer2를 구현한 것이다.
- 라우터를 통해 물리적으로 떨어진 위치(다른 건물/ 다른 데이터 센터)에 있는 장치들도 동일한 VXLAN 네트워크 안에서 통신할 수 있게 된다.
- 주요 구성 요소
- VTEP(VXLAN Tunnel End Point)
- VXLAN 터널의 종단점.
- Layer2의 프레임을 캡슐화하거나, 캡슐화를 해제하는 역할을 한다.
- Layer2 프레임을 가져와서 Layer3 패킷으로 캡슐화한 후 다른 VTEP으로 전송한다. 패킷을 받은 VTEP은 Layer3패킷의 캡슐화를 해제하고 Layer2로 전달한다.
- 이렇게 VXLAN 터널을 통해 통신 장치들을 연결한다.
- VNI
- 24비트 크기. 약 1600만개의 고유한 VNI 값을 사용 가능하다.
- VLAN ID와 유사하게 테넌트를 식별하며 다른 VNI를 할당받은 VM들은 Layer2 환경에서는 서로 통신이 불가능하다.
- 다수의 VM들이 같은 VNI를 할당 받으면 하나의 테넌트로 인식한다.
- VTEP(VXLAN Tunnel End Point)
- VLAN의 제한을 확장하기 위해 24bit의 VNI(VXLAN Network Identifier) (->약 1600만개)를 사용한다.
- Layer2 네트워크는 같은 브로드캐스트 도메인 또는 같은 스위치에 연결된 장치들로 한정. <- VLAN의 한계
- Layer3 네트워크는 다른 네트워크에 속한 장치들이 IP 주소를 통해 통신 가능 <- VXLAN 확장의 장점
- VXLAN ARP
- ARP Flooding
- 만약 VTEP 장비가 ARP 요청을 받은 후, 해당 MAC 주소나 IP를 알고 있지 않으면 ARP 요청 패킷을 네트워크 전체로 Flooding 해야 한다.
- 과정
- ARP 요청 발생
- Host A가 Host B의 MAC 주소 찾기
- VTEP#1의 Flooding
- VTEP#1이 B의 MAC 주소를 몰라서 Flooding
- Host B의 응답
- B가 ARP 응답으로 MAC 주소를 담아 전송
- VTEP#2의 정보 학습
- VTEP#2는 ARP 응답을 수신하고, 다른 모든 VTEP들(네트워크에 연결된 다른 VTEP)에게도 전파하게됨. 다른 모든 VTEP들도 학습
- 향후 같은 요청이 발생하면 Flooding을 억제
- VTEP#2는 ARP 응답을 수신하고, 다른 모든 VTEP들(네트워크에 연결된 다른 VTEP)에게도 전파하게됨. 다른 모든 VTEP들도 학습
- ARP 요청 발생
- ARP Suppression(억제)
- VTEP 장비가 ARP Request에 응답 => 불필요한 브로드 캐스트를 억제
- 과정
- ARP 요청 발생
- VTEP#1에서 응답
- VTEP#1이 Host B의 MAC을 알고 있다면 직접 ARP 응답을 생성하여 응답해줌.
- ARP Flooding
728x90
'클라우드' 카테고리의 다른 글
Restful API (1) | 2024.10.06 |
---|---|
Kubernetes Basic - 1 (0) | 2024.10.06 |
Container 기초 개념, VM과 Container (1) | 2024.10.01 |
Jenkins로 커밋 후 자동 빌드 ~ yaml 수정 후 push까지 pipeline script (윈도우 환경) (0) | 2024.08.17 |
이미지로 만든 Spring 프로젝트 쿠버네티스에 배포하기 (우분투 환경) (0) | 2024.08.12 |