SlideShare a Scribd company logo
1 of 68
Download to read offline
1
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
OpenStack: Inside Out
오픈스택: 구석구석 파헤쳐보기
Etsuji Nakai
Senior Solution Architect
Red Hat
Ver1.0 2014/02/22
Translated in Korean by Jaehwa Park
jaehwa@gmail.com
2
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
$ who am i
- The author of “Professional Linux Systems” series.
●
Available in Japanese/Korean. Translation offering from publishers are welcomed ;-)
Self-study Linux
Deploy and Manage by yourself
Professional Linux Systems
Deployment and Management
Professional Linux Systems
Network Management
■
Etsuji Nakai
- Senior solution architect
and Cloud evangelist at Red Hat.
Professional Linux Systems
Technology for Next Decade
3
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
목차
■ 오픈스택 개요
■ 오픈스택 주요 컴포넌트
■ Nova와 Cinder 내부 아키텍처
■ Neutron 아키텍처 개요
■ LinuxBridge 플러그인 내부 아키텍처
■ Open vSwitch 플러그인 내부 아키텍처
■ 가상 네트워크 구성 단계
참고: 본 문서에서는 RDO(Grizzly) 사용을 가정한다.
4
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
오픈스택 개요
5
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
오픈스택 클라우드의 컴퓨팅 자원
■
오픈스택의 최종 사용자는 웹 콘솔이나 API 등을 통해서 사용자의
프라이빗 테넌트(private tenants)에서 다음의 컴퓨팅 자원들을
생성하고 설정할 수 있다.
- 가상 네트워크
- VM 인스턴트
- 블록 볼륨
사용자 데이터 블록 볼륨
가상 라우터
가상 스위치
외부 네트워크
프로젝트 환경
오픈스택 사용자
OS
■
각 사용자들은 어떤 프로젝트들에 속한다.
- 동일 프로젝트 내의 사용자들은 프로젝트
환경의 공통 컴퓨팅 자원들을 공유한다.
- 각 프로젝트는 다른 프로젝트와 독립된
(가상의) 컴퓨팅 자원들을 소유한다.
VM 인스턴스
6
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
VM 인스턴스 생성
■ 새로운 VM 인스턴스를 시작할 때, 다음의 옵션들을 지정해야 한다.
- 인스턴스 유형 (flavor)
- 템플릿 이미지
- 가상 네트워크
- 보안 그룹
- 키 쌍
외부 네트워크
OS템플릿 이미지
다운로드
다수의 네트워크에
접속하는 것이 가능함
보안 그룹
포맷 설명
raw Flat 이미지 파일
AMI/AKI/ARI Amazon EC2에서 사용
qcow2 Linux KVM에서 사용
VDI VirtualBox에서 사용
VMDK VMware에서 사용
VHD Hyper-V에서 사용
지원하는 템플릿 이미지 포맷
7
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
오픈스택 가상 네트워크의 논리적 관점
■ 각 테넌트(tenant)는 마치 "홈 네트워크의 브로드밴드 라우터"와 같이 동작하는 가상 라우터를 소유
한다.
- 테넌트 사용자들은 라우터 아랫단에 가상 스위치들을 추가하고 사설 서브넷 주소(private subnet
address)를 할당한다. 서브넷은 다른 테넌트와 중복 사용이 가능하다.
■ 인스턴스를 시작할 때 최종 사용자는 연결할 가상 스위치를 선택한다.
- 인스턴스의 가상 NIC들의 수는 연결할 스위치의 수에 해당한다. DHCP를 통해 사설 IP(Private IP)들
을 할당한다.
가상 스위치
192.168.101.0/24
테넌트 A의
가상 라우터
외부 네트워크
테넌트 B의
가상 라우터
가상 스위치
192.168.102.0/24
8
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
SSH 접속을 위한 키 쌍 인증
■ 사용자는 사전에 공개 키를 등록한다. 새로운 인스턴스가 시작될 때 게스트 OS에 입력된다.
- 각 사용자에 대해 키 쌍이 등록된다. 이 키 쌍들은 여러 사용자들과 공유하지 않는다.
사용자 정보 데이터베이스
VM 인스턴스
(2) 게스트 OS에 공개 키 입력됨
비밀 키
공개 키
(1) 사전에 공개 키 등록
(3) 비밀 키로 인증
9
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
사설 IP와 유동 IP
■ 외부 네트워크에서 접근할 때, "유동 IP(Floating IP)"를 VM 인스턴스에 할당한다.
- 유동 IP로 사용할 수 있는 외부 네트워크의 IP 주소 구간은 사전에 풀링하고 각 테넌트에 배포한다.
- 유동 IP는 가상 라우터에서 해당하는 사설 IP로 NAT 변환된다.
- VM 인스턴스에서 외부 네트워크로 접근하는 것은 유동 IP 할당 없이 가능하다. 이 경우 가상 라우터의
IP 마스커레이드 기능이 사용된다.
Web 서버 DB 서버
사설 IP 사설 IP
유동 IP
유동 IP로 외부
네트워크로부터 접속
VM 인스턴스 간은 사설 IP로 접속
10
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
인스턴스 유형과 해당 디스크 영역
■ 다음은 기본으로 생성되는 인스턴스 유형이다.
- root 디스크는 템플릿 이미지에서 복사된 후 지정된 크기로 확장된다.(m1.tiny 제외)
■ 관리자는 새 인스턴스 유형을 정의할 수 있다.
- 다음은 temp 디스크와 swap 디스크를 사용한 예이다.
- 인스턴스가 소멸될 때 이들 디스크가 삭제되기 때문에 영구 데이터는 다른 장소(일반적으로 블록 볼륨들)
에 저장된다.
인스턴스 유형 (flavor) vCPU Memory
root
disk
temp
disk
swap
disk
m1.tiny 1 512MB 0GB 0 0
m1.small 1 2GB 20GB 0 0
m1.medium 2 4GB 40GB 0 0
m1.large 4 4GB 80GB 0 0
m1.xlarge 8 8GB 160GB 0 0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 20G 0 disk
└─vda1 252:1 0 20G 0 part /
vdb 252:16 0 5G 0 disk /mnt
vdc 252:32 0 1G 0 disk [SWAP] swap disk
root disk
temp disk
11
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
VM 인스턴스의 스냅샷
■ 실행 중인 인스턴스의 스냅샷을 만들어서 root 디스크를 복사할 수 있고, 템플릿 이미지로 다시
사용할 수 있다.
OS
템플릿 이미지
템플릿 이미지로부터
인스턴스 시작
인스턴스 스냅샷
OS
root 디스크의
복사본인 스냅샷 생성
스냅샷으로부터
인스턴스 시작
12
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
블록 볼륨에서 부팅하기
블록 볼륨으로부터
직접 인스턴스 부팅
OS
스냅샷 생성
OS
복제
■ 부팅 블록 볼륨을 생성하기 위해 템플릿 이미지를 새로운 블록 볼륨에 복사할 수 있다.
- 블록 볼륨에서 부팅할 때, 인스턴스가 제거된 경우에도 게스트 OS의 내용이 삭제되지 않고 남아 있다.
- 부팅 볼륨의 스냅샷을 생성하고, 새 인스턴스를 시작할 때 새로운 부팅 볼륨을 생성할 수 있다.
OS
템플릿 이미지로부터
블록 볼륨 생성
OS템플릿 이미지
13
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
영구 데이터 저장소, 블록 볼륨
사용자 데이터
(3) 스냅샷 생성
(4) 스냅샷으로부터
새로운 블록 볼륨을 생성
(2) 실행 중인 인스턴스에 사용자
데이터를 저장하기 위해 연결
사용자 데이터
다른 인스턴스에
다시 연결할 수 있음
(1) 새로운 블록 볼륨 생성
OS OS
■ 블록 볼륨은 VM 인스턴스를 제거해도 삭제되지 않고 남아 있다. 영구 데이터 저장소로 사용할 수
있다.
14
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
오픈스택의 주요 컴포넌트
15
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
오픈스택의 주요 컴포넌트
■ 오픈스택은 다양한 서비스와 기능들을 위한 컴포넌트 모듈의 세트이다.
- Swift: 오브젝트 저장소(Object store)
●
Amazon S3와 같은 오브젝트 저장소
- Nova: 가상 머신 라이프사이클 관리자
- Glance: 가상 머신 이미지 카탈로그
●
실제 이미지들은 백엔드 저장소(주로 Swift)에 저장됨
- Cinder: 가상 디스크 볼륨
●
Amazon EBS와 같은 볼륨 관리자
- Keystone: 중앙 집중식 인증과 서비스 카탈로그 시스템
- Neutron: 가상 네트워크 관리 API(이전 버전의 Quantum)
●
실제 네트워크 프로비저닝은 외부 플러그인 모듈에 위임
- Horizon: 웹 기반의 셀프 서비스 포털
16
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
모듈은 REST API를 통해 함께 동작
VM 템플릿
이미지
Nova
Compute
Nova
Compute
Glance Horizon
Nova
Scheduler
Neutron
관리용
네트워크
디스크
이미지
가상 네트워크 생성
가상 머신 시작
가상 디스크 볼륨 연결
(iSCSI)
인증 서비스
템플릿 이미지 검색
QPID /
MySQL
Network
Node
Nova
Compute
CinderKeystone
Swift
메시지 큐와
벡엔드 RDB
공용 네트워크
클라이언트 PC
가상 머신 생성
■ 모듈들은 REST API 호출과 메시지 큐를 통해 같이 동작한다.
- 조작(운영)은 REST API를 통한 외부 프로그램으로 자동화할 수 있다.
17
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
API 요청 호출
■ API 요청이 호출되는 경우는 두 가지가 있다.
- 최종 사용자가 Horizon 대시보드를 통하거나 직접 요청 호출을 보낼 때
- 일부 컴포넌트가 다른 컴포넌트에게 요청 호출을 보낼 때
Database
MySQL
Messaging
QPID
인프라스트럭처
데이터
에이전트로
메시지 전달
Horizon
(대시보드)
Keystone
(사용자 인증)
Neutron
(가상 네트워크)
Cinder
(블록 볼륨)
Nova
(VM 인스턴스)
Glance
(VM 템플릿)
템플릿 이미지 다운로드블록 볼륨 연결
가상 스위치에 연결
API 호출 Web 액세스
18
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
API 요청에 대한 사용자 인증
■ API에 요청을 보내기 전에 인증이 필요하다.
- 최종 사용자/컴포넌트는 API에 요청을 보내기 전에 Keystone으로부터 API 동작에 대한 "토큰
(token)"을 구한다. (각 컴포넌트의 사용자 ID는 Keystone에 있다.)
- 토큰을 획득하면, 대상 API에 대한 URL이 Keystone에서 검색된다. 최종 사용자는 사전에 Keystone
API에 대한 URL만 알고 있어야 한다.
Horizon
(대시보드)
Keystone
(사용자 인증)
Neutron
(가상 네트워크)
Cinder
(블록 볼륨)
Nova
(VM 인스턴스)
Glance
(VM 템플릿)
19
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Keystone 인증 토큰 메커니즘
■ 오픈스택 클라이언트는 다양한 컴포넌트들에 많은 API 호출을 하기 때문에, 모든 호출에 대해서
ID/비밀번호를 이용한 인증은 보안 및 성능 측면에서 바람직하지 않다.
■ 대신, 클라이언트는 사전에 API 호출에 대해 "라이선스(license)"로 "토큰(token)"을 획득하고,
사용할 컴포넌트에 토큰 ID를 보낸다.
- 요청을 수신하는 컴포넌트는 요청을 승인하기 전에 Keystone에 토큰 ID를 검증한다.
- 생성된 토큰은 일정 기간(기본값: 24시간) 동안 Keystone에 저장된다. 클라이언트는 기간이 만료될 때
까지 토큰을 다시 사용할 수 있다. 클라이언트는 각각의 요청 호출에 대해 토큰을 획득할 필요가 없다.
클라이언트
Keystone 서버
ID=yyyy토큰 획득
(ID/비밀번호로 인증)
토큰 ID 반송
생성된 토큰은 Keystone에 저장
토큰 ID를 가지고 요청을 보냄
토큰 ID를 확인하고
클라이언트의 역할을 점검
20
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Keystone의 명령 작업 (1)
■ 오픈스택의 표준 명령 행 도구를 사용할 경우, 사용자명, 비밀번호, 테넌트, 환경변수와 API의 URL을
지정한다.
- Keystone API는 관리자와 일반 사용자에 대해 다른 URL(포트 번호)을 가진다.
- 명령 행 옵션들을 함께 지정할 수 있다.
- 다음은 관리자 "admin"을 이용한 Keystone 동작의 예이다.
# cat keystonerc_admin
export OS_USERNAME=admin
export OS_TENANT_NAME=admin
export OS_PASSWORD=714f1ab569a64a3b
export OS_AUTH_URL=http://172.16.1.11:35357/v2.0/
export PS1='[u@h W(keystone_admin)]$ '
# . keystonerc_admin
# keystone user-list
+----------------------------------+------------+---------+-------------------+
| id | name | enabled | email |
+----------------------------------+------------+---------+-------------------+
| 589a800d70534655bfade5504958afd6 | admin | True | test@test.com |
| 3c45a1f5a88d4c1d8fb07b51ed72cd55 | cinder | True | cinder@localhost |
| f23d88041e5245ee8cc8b0a5c3ec3f6c | demo_admin | True | |
| 44be5165fdf64bd5907d07aa1aaa5dab | demo_user | True | |
| cd75770810634ed3a09d92b61aacf0a7 | glance | True | glance@localhost |
| a38561ed906e48468cf1759918735c53 | nova | True | nova@localhost |
| 157c8846521846e0abdd16895dc8f024 | quantum | True | quantum@localhost |
+----------------------------------+------------+---------+-------------------+
/root에서 packstack이
생성함
admin 사용자들을 위해
포트 35357을 사용함
21
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Keystone의 명령 작업 (2)
■ 다음은 등록된 API 서비스와 해당 URL을 보여주는 예이다.
- 다른 컴포넌트에 대한 명령 행 도구는 대상 컴포넌트의 API를 검색하는 데 내부적으로 이 메커니즘을
사용한다.
■ 각 명령 행 도구는 하위 명령어의 목록과 상세 정보를 표시하는 "help" 명령어를 제공한다.
# keystone service-list
+----------------------------------+----------+----------+----------------------------+
| id | name | type | description |
+----------------------------------+----------+----------+----------------------------+
| 5ea55cbee90546d1abace7f71808ad73 | cinder | volume | Cinder Service |
| e92e73a765be4beca9f12f5f5d9943e0 | glance | image | Openstack Image Service |
| 3631d835081344eb873f1d0d5057314d | keystone | identity | OpenStack Identity Service |
| 8db624ad713e440492aeccac6ab70a90 | nova | compute | Openstack Compute Service |
| e9f02d3803ab44f1a369602010864a34 | nova_ec2 | ec2 | EC2 Service |
| 5889a1e691584e539aa121ab31194cca | quantum | network | Quantum Networking Service |
+----------------------------------+----------+----------+----------------------------+
# keystone endpoint-list
+----------------------------------+-----------+------------------------------------------||-+----------------------------------+
| id | region | publicurl || | service_id |
+----------------------------------+-----------+------------------------------------------||-+----------------------------------+
| 0e96a30d9ce742ecb0bf123eebf84ac0 | RegionOne | http://172.16.1.11:8774/v2/%(tenant_id)s || | 8db624ad713e440492aeccac6ab70a90 |
| 928a38f18cc54040a0aa53bd3da99390 | RegionOne | http://172.16.1.11:9696/ || | 5889a1e691584e539aa121ab31194cca |
| d46cebe4806b43c4b48499285713ac7a | RegionOne | http://172.16.1.11:9292 || | e92e73a765be4beca9f12f5f5d9943e0 |
| ebdd4e61571945b7801554908caf5bae | RegionOne | http://172.16.1.11:8776/v1/%(tenant_id)s || | 5ea55cbee90546d1abace7f71808ad73 |
| ebec661dd65b4d4bb12fe67c25b2c77a | RegionOne | http://172.16.1.11:5000/v2.0 || | 3631d835081344eb873f1d0d5057314d |
| f569475b6d364a04837af6d6a577befe | RegionOne | http://172.16.1.11:8773/services/Cloud || | e9f02d3803ab44f1a369602010864a34 |
+----------------------------------+-----------+------------------------------------------||-+----------------------------------+
# keystone help <- 모든 하위 명령들의 목록을 표시
# keystone help user-list <- 하위 명령 “user-list”의 상세 내용 표시
22
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Horizon
(대시보드)
Keystone
(사용자 인증)
Neutron
(가상 네트워크)
Cinder
(블록 볼륨)
Nova
(VM 인스턴스)
Glance
(VM 템플릿)
Glance를 이용한 템플릿 이미지 등록 (1)
■ Glance를 이용해 새로운 템플릿 이미지를 등록할 수 있다. 등록된 이미지는 Nova에서 사용할 수
있다.
23
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Glance를 이용한 템플릿 이미지 등록 (2)
■ 다음은 일반 사용자 "demo_user"로 새로운 템플릿 이미지를 등록하는 예이다. 이미지는 지정된
URL에서 다운로드 한 것이다.
# cat keystonerc_demo_user
export OS_USERNAME=demo_user
export OS_TENANT_NAME=demo
export OS_PASSWORD=passw0rd
export OS_AUTH_URL=http://172.16.1.11:5000/v2.0/
export PS1='[u@h W(keystone_demouser)]$ '
# . keystonerc_demo_user
# glance image-create --name "Fedora19" 
--disk-format qcow2 --container-format bare --is-public true 
--copy-from http://cloud.fedoraproject.org/fedora-19.x86_64.qcow2
# glance image-list
+--------------------------------------+----------+-------------+------------------+-----------+--------+
| ID | Name | Disk Format | Container Format | Size | Status |
+--------------------------------------+----------+-------------+------------------+-----------+--------+
| 702d0c4e-b06c-4c15-85e5-9bb612eb6414 | Fedora19 | qcow2 | bare | 237371392 | active |
+--------------------------------------+----------+-------------+------------------+-----------+--------+
일반 사용자들을 위해
포트 5000을 사용함
이 파일은 직접
만들어야 함
24
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Keystone
(사용자 인증)
Neutron을 이용한 가상 네트워크 운영
■ Neutron API를 통해 최종 사용자는 자신의 테넌트 전용 가상 네트워크를 생성할 수 있다.
- "가상 네트워크의 구성 단계"에서 상세하게 설명한다.
# . keystonerc_demo_user
# quantum net-list
+--------------------------------------+-------------+-------------------------------------------------------+
| id | name | subnets |
+--------------------------------------+-------------+-------------------------------------------------------+
| 843a1586-6082-4e9f-950f-d44daa83358c | private01 | 9888df89-a17d-4f4c-b427-f28cffe8fed2 192.168.101.0/24 |
| d3c763f0-ebf0-4717-b3fc-cda69bcd1957 | private02 | 23b26d98-2277-4fb5-8895-3f42cde7e1fd 192.168.102.0/24 |
| d8040897-44b0-46eb-9c51-149dfe351bbe | ext-network | 1b8604a4-f39d-49de-a97c-3e40117a7516 192.168.199.0/24 |
+--------------------------------------+-------------+-------------------------------------------------------+
"quantum"명령어는 Havana 릴리즈에서
"neutron"으로 바뀌었음
Horizon
(대시보드)
Neutron
(가상 네트워크)
Cinder
(블록 볼륨)
Nova
(VM 인스턴스)
Glance
(VM 템플릿)
25
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Nova를 이용한 VM 인스턴스 생성
■ Nova가 인스턴스 생성 요청을 수신하면, API를 통해 Glance 및 Neutron과 통신한다.
- Glance API를 통해 컴퓨트 노드에 템플릿 이미지를 다운로드한다.
- Neutron API를 통해 가상 네트워크에 시작된 인스턴스를 연결한다.
Horizon
(대시보드)
Keystone
(사용자 인증)
Neutron
(가상 네트워크)
Cinder
(블록 볼륨)
Nova
(VM 인스턴스)
Glance
(VM 템플릿)
템플릿 이미지 다운로드
가상 스위치에 연결
26
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
인스턴스를 시작하는 명령 작업 (1)
■ 다음은 최종 사용자가 인스턴스를 기동하기 전에 필요한 정보를 확인하는 방법을 보여준다.
# . keystonerc_demo_user
# nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+
| ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | extra_specs |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+
| 1 | m1.tiny | 512 | 0 | 0 | | 1 | 1.0 | True | {} |
| 2 | m1.small | 2048 | 20 | 0 | | 1 | 1.0 | True | {} |
| 3 | m1.medium | 4096 | 40 | 0 | | 2 | 1.0 | True | {} |
| 4 | m1.large | 8192 | 80 | 0 | | 4 | 1.0 | True | {} |
| 5 | m1.xlarge | 16384 | 160 | 0 | | 8 | 1.0 | True | {} |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+
# nova keypair-list
+-------+-------------------------------------------------+
| Name | Fingerprint |
+-------+-------------------------------------------------+
| mykey | 31:8c:0e:43:67:40:f6:17:a3:f8:3f:d5:73:8e:d0:30 |
+-------+-------------------------------------------------+
# nova image-list
+--------------------------------------+----------+--------+--------+
| ID | Name | Status | Server |
+--------------------------------------+----------+--------+--------+
| 702d0c4e-b06c-4c15-85e5-9bb612eb6414 | Fedora19 | ACTIVE | |
+--------------------------------------+----------+--------+--------+
# nova secgroup-list
+---------+-------------+
| Name | Description |
+---------+-------------+
| default | default |
+---------+-------------+
# nova net-list
+--------------------------------------+-------------+------+
| ID | Label | CIDR |
+--------------------------------------+-------------+------+
| 843a1586-6082-4e9f-950f-d44daa83358c | private01 | None |
| d3c763f0-ebf0-4717-b3fc-cda69bcd1957 | private02 | None |
| d8040897-44b0-46eb-9c51-149dfe351bbe | ext-network | None |
+--------------------------------------+-------------+------+
Nova는 Glance API를 통해서
이미지 목록을 얻음
Nova는 Neutron API를 통해서
네트워크 목록을 얻음
27
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
인스턴스를 시작하는 명령 작업 (2)
■ 다음은 이전 페이지의 정보를 이용하여 인스턴스를 시작하는 예이다.
# nova boot --flavor m1.small --image Fedora19 --key-name mykey 
--security-groups default --nic net-id=843a1586-6082-4e9f-950f-d44daa83358c vm01
+-----------------------------+--------------------------------------+
| Property | Value |
+-----------------------------+--------------------------------------+
| status | BUILD |
| updated | 2013-11-22T06:22:52Z |
| OS-EXT-STS:task_state | scheduling |
| key_name | mykey |
| image | Fedora19 |
| hostId | |
| OS-EXT-STS:vm_state | building |
| flavor | m1.small |
| id | f40c9b76-3891-4a5f-a62c-87021ba277ce |
| security_groups | [{u'name': u'default'}] |
| user_id | 2e57cd295e3f4659b151dd80f3a73468 |
| name | vm01 |
| adminPass | 5sUFyKhgovV6 |
| tenant_id | 555b49dc8b6e4d92aa74103bfb656e70 |
| created | 2013-11-22T06:22:51Z |
| OS-DCF:diskConfig | MANUAL |
| metadata | {} |
...snip...
+-----------------------------+--------------------------------------+
# nova list
+--------------------------------------+------+--------+-------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+------+--------+-------------------------+
| f40c9b76-3891-4a5f-a62c-87021ba277ce | vm01 | ACTIVE | private01=192.168.101.3 |
+--------------------------------------+------+--------+-------------------------+
28
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Neutron API를 이용한 유동 IP 연결
■ 여러 개의 NIC를 가진 인스턴스에 유동 IP를 추가할 때, 연결하는 NIC 포트를 지정하는 Neutron
API를 사용해야 한다.
- 사설 IP에 대응하는 포트 ID를 식별한 후, 그 포트 ID에 유동 IP를 연결한다.
# nova boot --flavor m1.small --image Fedora19 --key-name mykey --security-groups default 
--nic net-id=843a1586-6082-4e9f-950f-d44daa83358c 
--nic net-id=d3c763f0-ebf0-4717-b3fc-cda69bcd1957 
Vm01
# nova list
+--------------------------------------+------+--------+--------------------------------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+------+--------+--------------------------------------------------+
| e8d0fa19-130f-4502-acfe-132962134846 | vm01 | ACTIVE | private01=192.168.101.3; private02=192.168.102.3 |
+--------------------------------------+------+--------+--------------------------------------------------+
# quantum port-list
+--------------------------------------+------+-------------------+------------------------------------+
| id | name | mac_address | fixed_ips |
+--------------------------------------+------+-------------------+------------------------------------+
| 10c3cd17-78f5-443f-952e-1e3e427e477f | | fa:16:3e:37:7b:a6 | ... "ip_address": "192.168.102.3"} |
| d0057651-e1e4-434c-a81d-c950b9c06333 | | fa:16:3e:e6:d9:4c | ... "ip_address": "192.168.101.3"} |
+--------------------------------------+------+-------------------+------------------------------------+
# quantum floatingip-list
+--------------------------------------+------------------+---------------------+---------+
| id | fixed_ip_address | floating_ip_address | port_id |
+--------------------------------------+------------------+---------------------+---------+
| 06d24f23-c2cc-471f-a4e6-59cf00578141 | | 171.16.1.101 | |
| 89b49a78-8fd7-461b-8fe2-fba4a341c8a2 | | 172.16.1.102 | |
+--------------------------------------+------------------+---------------------+---------+
# quantum floatingip-associate 06d24f23-c2cc-471f-a4e6-59cf00578141 d0057651-e1e4-434c-a81d-c950b9c06333
29
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
키 쌍 및 보안 그룹에 대한 작업
■ 키 쌍을 생성/등록하고, 보안 그룹을 정의하는 등의 보안 관련 작업은 Nova API를 통해 수행할 수
있다.
- 다음은 새로운 키 쌍 "key01"을 생성하고, "~/.ssh/key01.pem"에 개인(비밀) 키를 저장한다.
- 다음은 "key02"로 존재하는 키 쌍의 공개 키(public key)를 등록한다.
- 다음은 새로운 보안 그룹 "group01"을 생성하고, TCP 포트 22에 대한 액세스를 허용한다.
■ 보안 그룹은 현재 Neutron 통제 하에 있기 때문에, quantum(neutron) API를 통해서도 구성
명령을 수행할 수 있다.
# nova keypair-add key01 > ~/.ssh/key01.pem
# chmod 600 ~/.ssh/key01.pem
# nova secgroup-create group01 "My security group."
# nova secgroup-add-rule group01 tcp 22 22 0.0.0.0/0
# nova keypair-add --pub-key ~/.ssh/id_rsa.pub key02
# quantum security-group-create group01 --description "My security group."
# quantum security-group-rule-create --protocol tcp 
--port-range-min 22 --port-range-max 22 
--remote-ip-prefix "0.0.0.0/0" group01
30
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
인스턴스를 시작하는 명령 작업 (3)
■ 사용자 정의 스크립트(사용자 데이터)를 사용하기 위해서 "--user-data" 옵션으로 파일을 지정할
수 있다.
- 다음은 사용자 정의 스크립트를 사용하여 인스턴스를 시작하고 유동 IP를 추가하는 예이다.
# cat hello.txt
#!/bin/sh
echo 'Hello, World!' > /etc/motd
# nova boot --flavor m1.small --image Fedora19 --key-name mykey 
--security-groups default --nic net-id=843a1586-6082-4e9f-950f-d44daa83358c 
--user-data hello.txt vm01
# nova floating-ip-list
+--------------+-------------+----------+-------------+
| Ip | Instance Id | Fixed Ip | Pool |
+--------------+-------------+----------+-------------+
| 172.16.1.101 | None | None | ext-network |
| 172.16.1.102 | None | None | ext-network |
| 172.16.1.103 | None | None | ext-network |
| 172.16.1.104 | None | None | ext-network |
| 172.16.1.105 | None | None | ext-network |
+--------------+-------------+----------+-------------+
# nova add-floating-ip vm01 172.16.1.101
# ssh -i ~/mykey.pem fedora@172.16.1.101
The authenticity of host '172.16.1.101 (172.16.1.101)' can't be established.
RSA key fingerprint is b7:24:54:63:1f:02:33:4f:81:a7:47:90:c1:1b:78:5a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.101' (RSA) to the list of known hosts.
Hello, World!
[fedora@vm01 ~]$
31
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Horizon
(대시보드)
Keystone
(사용자 인증)
Neutron
(가상 네트워크)
Cinder
(블록 볼륨)
Nova
(VM 인스턴스)
Glance
(VM 템플릿)
Cinder를 이용한 블록 볼륨 생성
■ Cinder API를 사용해서 블록 볼륨을 생성/삭제하거나 스냅샷을 만들 수 있다.
- 실행 중인 인스턴스에 블록 볼륨을 연결/분리할 때, Nova API에 요청을 보내야 한다. 그런 다음 Nova는
API 호출을 통해 Cinder와 함께 작동한다.
블록 볼륨 연결
32
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
블록 볼륨에 대한 명령 작업
■ 다음은 5GB 블록 볼륨 하나를 생성하고, 실행 중인 인스턴스에 연결/분리하는 예이다.
# cinder create --display-name volume01 5
# cinder list
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+
| ID | Status | Display Name | Size | Volume Type | Bootable | Attached to |
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+
| 78b4d23b-3b57-4a38-9f6e-10e5048170ef | available | volume01 | 5 | None | false | |
+--------------------------------------+-----------+--------------+------+-------------+----------+-------------+
# nova volume-attach vm01 78b4d23b-3b57-4a38-9f6e-10e5048170ef auto
+----------+--------------------------------------+
| Property | Value |
+----------+--------------------------------------+
| device | /dev/vdb |
| serverId | f40c9b76-3891-4a5f-a62c-87021ba277ce |
| id | 78b4d23b-3b57-4a38-9f6e-10e5048170ef |
| volumeId | 78b4d23b-3b57-4a38-9f6e-10e5048170ef |
+----------+--------------------------------------+
# nova volume-detach vm01 78b4d23b-3b57-4a38-9f6e-10e5048170ef
게스트 OS에서 본 장치 이름임
33
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
부팅 볼륨 생성
■ 템플릿 이미지에서 새로운 볼륨을 생성하여 부팅 블록 볼륨을 만들 수 있다.
- 부팅 볼륨을 사용해 블록 볼륨에서 직접 인스턴스를 부팅할 수 있다.
- 다음은 기존의 템플릿 이미지에서 부팅 볼륨을 생성하고, 그 볼륨으로 인스턴스를 시작하는 예이다.
("--image" 옵션은 부트 하위 명령어에서 무시되지만, 더미 항목으로 지정해야 한다)
# cinder create --image-id 702d0c4e-b06c-4c15-85e5-9bb612eb6414 --display-name Fedora19-bootvol 5
# cinder list
+--------------------------------------+-----------+------------------+------+-------------+----------+-------------+
| ID | Status | Display Name | Size | Volume Type | Bootable | Attached to |
+--------------------------------------+-----------+------------------+------+-------------+----------+-------------+
| 78b4d23b-3b57-4a38-9f6e-10e5048170ef | available | volume01 | 5 | None | false | |
| bdde9405-8be7-48d5-a879-35e37c97512f | available | Fedora19-bootvol | 5 | None | true | |
+--------------------------------------+-----------+------------------+------+-------------+----------+-------------+
# nova boot --flavor m1.small --image Fedora19 --key-name mykey 
--security-groups default --nic net-id=843a1586-6082-4e9f-950f-d44daa83358c 
--block_device_mapping vda=bdde9405-8be7-48d5-a879-35e37c97512f:::0 vm02
# nova volume-list
+----------||-----------+-----------+------------------+------+-------------+--------------------------------------+
| ID || | Status | Display Name | Size | Volume Type | Attached to |
+----------||-----------+-----------+------------------+------+-------------+--------------------------------------+
| 78b4d23b-||e5048170ef | available | volume01 | 5 | None | |
| bdde9405-||e37c97512f | in-use | Fedora19-bootvol | 5 | None | b4cb7edd-317f-44e9-97db-5a04c41a4510 |
+----------||-----------+-----------+------------------+------+-------------+--------------------------------------+
템플릿 이미지 ID
블록 볼륨 ID 인스턴스를 삭제한 후 볼륨을
제거하기 위한 플래그 (1=yes)
34
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Nova와 Cinder 내부 서비스
35
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Nova 내부 서비스
/var/lib/nova/instances/_base
qcow2
기본 이미지
qcow2
오버레이 이미지
qcow2
오버레이 이미지
VM
인스턴스
/var/lib/nova/instances/<ID>
오버레이
VM
인스턴스
템플릿 이미지 다운로드
Glance
VM 시작
Compute 노드
Nova API
VM 시작을 명령
Compute DriverVM을 시작하기 위한
compute 노드 선택
Nova Conductor
자원 정보 검색
Nova Compute
사용할 특정 하이퍼바이저에
대한 드라이버
Database
DB 액세스에 대한
프록시 서비스
자원 정보 업데이트
Controller 노드 REST API 제공
정의한 기간 동안
다운로드한 이미지가 캐시됨
Nova Scheduler
메시징 서버를 통한 통신
Libvirt
36
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
메시징 서버의 작동 방법
■ 하나의 컴포넌트(예: Nova)에 대한 에이전트와 내부 서비스는 메시징 서버를 통해 통신한다.
- 메시징 서버는 통신 채널로 "topics"를 제공한다. 송신자는 지정한 topic에 메시지를 넣는다. 그런 다음
수신자가 가입한 topic에서 메시지를 선택한다.
- topic의 메시지는 "모든 가입자가 수신해야 함" 또는 "하나의 가입자만 수신해야 함"과 같은 제공 모델을
지정하는 플래그를 가지고 있다.
- 다수의 송신자는 동일한 topic에 메시지를 넣을 수 있기 때문에, M:N 비 동기 통신을 수행한다.
메시징 서버
Topic A
메시지 송신
메시지 수신
service service
service
service
topic A에 가입된 서비스들
Topic B
・・
37
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
qcow2 디스크 이미지의 기능
■ qcow2는 다음과 같은 기능을 가진 가상 머신을 위해 설계된 디스크 이미지 형식이다.
■ 동적 블록 할당
- 실제(물리적) 파일 크기는 논리 이미지 크기보다 작다. 데이터가 추가될 때 파일이 커진다. 논리적 크기를
확장하는 것도 가능하다.
■ 오버레이 메커니즘
- 백업 이미지의 상단에 오버레이 파일을 추가할 수 있다. 오버레이 파일은 백업 이미지에서 추가 변경
사항만 담고 있다.
- 백업 이미지는 여러 오버레이 파일들과 함께 공유될 수 있다. 동일한 템플릿 이미지의 가상 머신이 많이
실행되는 환경에서 물리적 디스크 사용량을 줄이는 데 유용하다.
■ 여러 스냅샷
- 이미지의 스냅샷을 생성함으로써, 이미지의 이전 내용을 재현하거나 스냅샷으로부터 새로운 이미지를
생성할 수 있다.
38
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
# qemu-img create -f qcow2 baseimage.qcow2 5G
Formatting 'baseimage.qcow2', fmt=qcow2 size=5368709120 encryption=off
cluster_size=65536 lazy_refcounts=off
# qemu-img create -f qcow2 -b baseimage.qcow2 layerimage.qcow2
Formatting 'layerimage.qcow2', fmt=qcow2 size=5368709120
backing_file='baseimage.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
# qemu-img info layerimage.qcow2
image: layerimage.qcow2
file format: qcow2
virtual size: 5.0G (5368709120 bytes)
disk size: 196K
cluster_size: 65536
backing file: baseimage.qcow2
# qemu-img snapshot -c snap01 layerimage.qcow2
# qemu-img snapshot -l layerimage.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 snap01 0 2013-11-22 17:08:02 00:00:00.000
# qemu-img convert -f qcow2 -O qcow2 -s snap01 layerimage.qcow2 copiedimage.qcow2
qcow2 디스크 이미지에 대한 작업
■ qemu-img는 qcow2 이미지를 조작할 수 있는 명령 도구이다.
참조:
 https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html-single/  
 Virtualization_Administration_Guide/index.html#sect-Virtualization-Tips_and_tricks-Using_qemu_img
5GB 논리 크기를 가진 이미지 생성
백업 이미지로 선택한
baseimg.qcow2에 오버레이 파일 생성
스냅샷 생성
스냅샷으로부터
새로운 이미지 생성
39
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
공개 키 입력 메커니즘
■ Nova Compute는 인스턴스를 시작하기 전에 로컬 디스크 이미지의
"/root/.ssh/authorized_keys"에 공개 키를 입력한다.
■ 메타 데이터(*)를 통해 공개 키를 검색할 수 있는 Cloud-Init도 부팅 시 공개 키 인증을 설정하는 데
사용할 수 있다.
- root 사용자 로그인을 허용하는 것이 대부분의 경우 바람직하지 않기 때문에, 일반 사용자를 생성하고
그 사용자에 대한 공개 키 인증을 설정하는 데 Cloud-Init을 구성하는 것이 낫다.
(*) 특히 블록 볼륨에서 부팅할 때, Nova Compute는 공개 키를 입력할 수 없다. 이럴 경우 Cloud-Init 사용이
필수이다.
$ curl http://169.254.169.254/2009-04-04/meta-data/public-keys/0/openssh-key
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5W2IynhVezp+DpN11xdsY/8NOqeF8r7eYqVteeWZSBfnYhKn
8D85JmByBQnJ7HrJIrdMvfTYwWxi+swfFlryG3A+oSll0tT71FLAWnAYz26ML3HccyJ7E2bD66BSditbDITK
H3V66oN9c3rIEXZYQ3A+GEiA1cFD++R0FNKxyBOkjduycvksB5Nl9xb3k6z4uoZ7JQD5J14qnooM55Blmn2C
C2/2KlapxMi0tgSdkdfnSSxbYvlBztGiF3M4ey7kyuWwhE2iPBwkV/OhANl3nwHidcNdBrAGC3u78aTtUEwZ
tNUqrevVKM/yUfRRyPRNivuGOkvjTDUL/9BGquBX9Q== enakai@kakinoha
메타 데이터로부터 공개 키를 가져오는 중.
40
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
블록 볼륨 사용 사례 및 해당 API
사용자 데이터
(3) 스냅샷 생성
(4) 스냅샷으로부터 새로운
블록 볼륨 생성
(2) 사용자 데이터 저장을 위해
실행 중인 인스턴스에 연결
사용자 데이터
다른 인스턴스에 다시
연결할 수도 있음
(1) 새로운 블록 볼륨 생성
OS OS
OS
템플릿 이미지로부터
블록 볼륨 생성
OS템플릿 이미지
■
Cinder API
- volume create/delete/list/show
(스냅샷, 이미지로부터 생성)
- snapshot create/delete/list/show
■
Nova API
- volume attach/detach
41
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Nova와 Cinder가 함께 작동하는 방법
Nova Compute
Cinder
VM 인스턴스
/dev/vdb
가상 디스크
Linux KVM
/dev/sdX
iSCSI LUN
외장 스토리지
LUN 생성
iSCSI SW
Initiator
iSCSI Target
■ 일반적인 구성에서 블록 볼륨은 iSCSI 스토리지의 LUN으로 생성된다. Cinder는 해당 드라이버를
통해 스토리지의 관리 인터페이스에서 작동한다.
■ Nova Compute는 소프트웨어 초기화 프로그램을 사용해 호스트 리눅스에 연결한다. 그런 다음
KVM 하이퍼바이저를 통해 VM 인스턴스에 연결한다.
42
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Cinder 내부 서비스
■ 볼륨 드라이버는 해당 스토리지의 관리 인터페이스를 처리한다.
- 여러 종류의 스토리지를 사용할 때, Cinder Scheduler는 요청된 스토리지 형식에 따라 사용되는
드라이버를 선택한다.
Cinder API
Controller 노드 REST API 제공
Cinder-Volume
Cinder Scheduler
Volume Driver
특정 유형의
스토리지에 대한 드라이버
적당한 볼륨 드라이버 선택
LUN
iSCSI 연결
Nova Compute
LUN 생성
Nova API
REST API 제공
Database
볼륨 정보
외장 스토리지
메시징 서버를 통한 통신
43
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Nova ComputeVM instance
/dev/vdb
Linux KVM
/dev/sdX
iSCSI LUN
LVM 드라이버 사용
■ Cinder는 외장 스토리지 대신 리눅스의 LVM을 사용하는 레퍼런스 구현으로 LVM 드라이버를
제공한다.
- 스냅샷 기능은 기본 볼륨과 동일한 크기를 갖는 델타 볼륨에 LVM 스냅샷으로 구현된다.
Cinder
iSCSI SW
Target (tgtd)
VG: cinder-volumes
LV
논리 볼륨 생성 및
iSCSI LUN으로 내보내기
iSCSI SW
Initiator
가상 디스크
44
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
NFS 드라이버 사용
■ Cinder는 스토리지 백엔드로 NFS 서버를 사용하는 NFS 드라이버를 제공한다.
- 드라이버는 단순히 export된 NFS 디스크를 직접 마운트하고, 그 위에 디스크 이미지 파일을 생성한다.
Compute 노드는 이미지 파일들을 액세스하기 위해 NFS 마운트를 사용한다.
가상 디스크
NFS server
NFS 마운트
・・・
NFS 마운트
・・・
Nova ComputeVM instance
/dev/vdb
Linux KVM
Cinder
45
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
GlusterFS 드라이버 사용
■ GlusterFS 분산 파일시스템을 위한 드라이버도 있다.
- 현재는 FUSE 마운트 메커니즘을 사용한다. FUSE 레이어를 우회하는 좀 더 최적화된 메커니즘
(libgfapi)으로 대체될 예정이다.
Cinder
GlusterFS 클러스터
FUSE 마운트
FUSE 마운트
・・・
가상 디스크
・・・
Nova ComputeVM instance
/dev/vdb
Linux KVM
46
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Neutron 아키텍처 개요
47
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Neutron 가상 네트워크의 논리적 관점
■ 각 테넌트(tenant)는 마치 "홈 네트워크의 브로드밴드 라우터"와 같이 동작하는 가상 라우터를
소유한다.
- 테넌트 사용자들은 라우터 아랫단에 가상 스위치들을 추가하고 사설 서브넷 주소(private subnet
address)를 할당한다. 서브넷은 다른 테넌트와 중복 사용이 가능하다.
■ 인스턴스를 시작할 때 최종 사용자는 연결할 가상 스위치를 선택한다.
- 인스턴스의 가상 NIC들의 수는 연결할 스위치의 수에 해당한다. DHCP를 통해 Private IP들을
할당한다.
가상 스위치
192.168.101.0/24
테넌트 A의
가상 라우터
외부 네트워크
테넌트 B의
가상 라우터
가상 스위치
192.168.102.0/24
48
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Neutron 플러그인 아키텍처
■ 가상 네트워크 생성의 실제 작업은 플러그인 Agent가 수행한다.
- 벤더들의 상용 제품을 포함해서 Neutron을 위한 다양한 플러그인이 있다.
- 오픈스택은 표준/참조 구현으로 "LinuxBridge 플러그인"과 "Open vSwitch 플러그인"을 제공한다.
Compute 노드
Neutron 서비스
L2 Agent
Controller 노드 REST API 제공
네트워크 컨트롤러
L3 Agent
DHCP Agent
L2 Agent
가상 라우터 생성
가상 L2 스위치 생성
사설 IP 주소 할당
가상 L2 스위치 생성
메시징 서버를 통한 통신
49
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
표준 플러그인과 네트워크 구성
■ 다음은 LinuxBridge 플러그인 또는 Open vSwitch 플러그인을 이용한 일반적인 구성의 예이다.
- 네트워크 노드의 L3 Agent는 사설 및 공용 네트워크를 연결하는 가상 라우터 기능을 제공한다. (각
노드의 "eth0"는 호스트 리눅스를 액세스하는 데 사용하고, VM 인스턴스 통신에 사용하지 않음)
- 여러 네트워크 노드를 가질 수는 없다. 확장 가능한 네트워크 기능은 개발 중이다.
・・・
사설 네트워크
eth0 eth1 eth2
Network 노드
eth0 eth1
Compute 노드
공용 네트워크
L3 Agent
L2 Agent
DHCP Agent
VM
L2 Agent
VM
eth0 eth1
VM
L2 Agent
VM
가상 라우터 기능 제공
仮想スイッチ作成가상 L2 스위치 생성사설 네트워크를 위한
DHCP 기능 제공
50
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
LinuxBridge 플러그인 내부 아키텍처
51
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
LinuxBridge 플러그인 내부 아키텍처
■ 여기서는 LinuxBridge 플러그인이 가상 네트워크를 구현하는 방법에 대해 구체적인 예를 들어
설명한다.
가상 라우터
가상 L2 스위치
private01
vm01 vm02 vm03
외부 네트워크
가상 L2 스위치
private02
52
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Compute 노드 내부 구성
■ 리눅스 브리지는 각 가상 스위치에 대해 생성된다. Compute 노드 이외의 각 스위치의 네트워크
트래픽은 VLAN으로 분리된다.
brqxxxx
eth1.101 eth1.102
brqyyy
eth1
private01 private02
vm01
eth0
IP
VLAN101
VLAN102
사설 네트워크에 대한
물리 L2 스위치
vm02
eth0
IP
eth1
IP
vm03
eth0
IP
L2 Agent에 의해 구성
Nova Compute에 의해 구성
네트워크 노드에서
dnsmasq로부터 IP가 할당됨
각 가상 L2 스위치에 대한
VLAN이 생성됨
53
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
네트워크 노드 내부 구성
qr-YYY
IP
qr-WWW
IP
To/From 사설 네트워크
To/From 공용 네트워크
eth1
brqxxxx
brqxxxx
eth1.101 eth1.102
brqyyy
eth2
private01 private02
L2 Agent에 의해 구성
ns-XXX
dnsmasq
ns-ZZZ
dnsmasq
qg-VVV
IP외부 GW IP
내부 GW IP
NAT와 필터링은
iptables로 처리
L3 Agent에 의해 구성
개념적으로 이곳에
가상 라우터가 존재함
■ 가상 라우터는 리눅스의 패킷 포워딩
기능을 사용하여 구현한다.
■ dnsmasq는 각 서브넷에 대한 사설
IP 주소를 제공하는 DHCP 서버로
사용된다.
- 할당된 IP 주소는 가상 NIC의
MAC 주소에 대응한다.
IP IP
DHCP Agent에 의해 구성
각 서브넷에 대해
dnsmasq가 시작됨
54
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Open vSwitch 플러그인 내부 아키텍처
55
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Open vSwitch는 무엇인가?
■ Open vSwitch는 리눅스의 상단에 가상 L2 스위치를 생성하는 소프트웨어이다. 물리적 L2 스위치
제품에 비해 다양한 기능을 지원한다.
- 특히 정교한 패킷 제어 기능을 제공하는 OpenFlow 프로토콜을 지원하기 때문에, Open vSwitch는
가상 네트워크 어플리케이션에 널리 사용되고 있다.
● Visibility into inter-VM communication via NetFlow, sFlow(R), IPFIX, SPAN, RSPAN, and
GRE-tunneled mirrors
● LACP (IEEE 802.1AX-2008)
● Standard 802.1Q VLAN model with trunking
● BFD and 802.1ag link monitoring
● STP (IEEE 802.1D-1998)
● Fine-grained QoS control
● Support for HFSC qdisc
● Per VM interface traffic policing
● NIC bonding with source-MAC load balancing, active backup, and L4 hashing
● OpenFlow protocol support (including many extensions for virtualization)
● IPv6 support
● Multiple tunneling protocols (GRE, VXLAN, IPsec, GRE and VXLAN over IPsec)
● Remote configuration protocol with C and Python bindings
● Kernel and user-space forwarding engine options
● Multi-table forwarding pipeline with flow-caching engine
● Forwarding layer abstraction to ease porting to new software and hardware platforms
Open vSwitch 지원 기능(http://openvswitch.org/features/)
56
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
OpenFlow는 무엇인가?
■ OpenFlow는 외부 컨트롤러에서 패킷 포워딩의 제밀한 제어를 제공하는 프로토콜이다.
- OpenFlow 스위치는 수신된 패킷을 처리하는 방법에 대해 외부 컨트롤러를 쿼리한다.
- 컨트롤러 소프트웨어의 프로그래밍이 패킷 조작의 유연성을 제공하기 때문에 멀티 테넌트 가상 네트워크
생성에 적합하다. 예를 들어, 헤더에 VLAN 태그를 수정하여 소스/목적지 MAC 주소에 따라 포트
포워딩을 결정할 수 있다.
OpenFlow 컨트롤러
OpenFlow 스위치
컨트롤러는 패킷이 OpenFlow 프로토콜을
통해 처리되는 방법을 지시함
57
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Open vSwitch 플러그인 내부 아키텍처
■ 여기서는 Open vSwitch 플러그인이 가상 네트워크를 구현하는 방법에 대해 구체적인 예를 들어
설명한다.
vm01 vm02 vm03 vm04
테넌트 B의
가상 라우터
테넌트 A의
가상 라우터
외부 네트워크
가상 L2 스위치
projectA
가상 L2 스위치
project B
58
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Compute 노드 내부 구성 (1)
■ 설명은 다음 페이지를 참조한다.
br-priv
vm01
eth0
br-int
eth1
IP
phy-br-priv
int-br-priv
qvoXXX
vm02
eth0
IP
qvoYYY
포트 VLAN tag:1
qvoZZZ qvoWWW
포트 VLAN tag:2
vm04
eth0
IP
VLAN101
VLAN102
Open vSwitch
vm03
eth0
IP
Nova Compute에 의해 구성
L2 Agent에 의해 구성
"내부"와 "외부" VLAN 간의 변환
- 내부 VLAN1<->외부l VLAN101
- 내부VLAN2<->외부 VLAN102
각 가상 L2 스위치에
"내부 VLAN"이 할당됨
59
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Compute 노드 내부 구성 (2)
■ VM 인스턴스의 가상 NIC는 공통 "통합 스위치(brint)"에 연결된다.
- 연결되는 (논리) 가상 L2 스위치에 따라 연결된 포트에 내부 VLAN이 할당된다.
■ 사설 네트워크에 대한 물리적 L2 스위치의 연결은 "사설 스위치(br-priv)"를 통해 이루어진다.
- 외부 VLAN은 (논리) 가상 L2 스위치에 따라 물리적 스위치에 할당된다. 내부 및 외부 VLAN 간의
변환은 OpenFlow로 이루어진다.
■ VLAN 이외에, 물리적 네트워크 연결을 통해 사용할 수 있는 GRE 터널링 같은 다른 분리 메커니즘이
있다.
- GRE 터널링의 경우, "내부 VLAN" 및 "GRE 터널 ID"간의 변환은 OpenFlow로 이루어진다.
60
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
dnsmasq
eth2
br-int
br-priv
phy-br-priv
int-br-priv
tapXXX qr-YYY
포트 VLAN tag:1
IP IP
qg-CCC
br-ex
eth1
qr-BBB
IP
dnsmasq
tapAAA
IP
IP
포트 VLAN tag:2
네트워크 노드 내부 구성
To/From 사설 네트워크
To/From 공용 네트워크
L2 Agent에 의해 구성
"내부"와 "외부" VLAN 간의 변환
- 내부 VLAN1<->외부 VLAN101
- 내부 VLAN2<->외부 VLAN102
qg-VVV
IP
L3 Agent에 의해 구성
■ 두 개의 가상 라우터가 구성되어
있기 때문에 패킷 전달의 두 가지
경로가 있다.
DHCP Agent에 의해 구성
NAT와 필터링은
iptables로 처리
61
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
네트워크 namespace와 중복 서브넷
■ 다수의 가상 라우터를 사용하는 경우, 네트워크 노드는 여러 테넌트 사이에서 서브넷을 중복해서
사용할 수 있도록 각각의 가상 라우터에 대해 독립된 NAT/필터링 구성을 가질 필요가 있다. 여러
개의 독립된 네트워크 구성을 가질 수 있는 리눅스의 네트워크 namespace 기능으로 구현이
가능하다.
■ 다음은 네트워크 namespace를 사용하는 단계이다.
- 새로운 namespace를 생성한다.
- Namespace 내부 네트워크 포트를 할당한다.(물리적 및 논리적 포트를 모두 사용할 수 있음)
- Namespace 내부에서 네트워크를 구성(포트 구성, iptables 구성 등)한다.
- 그런 다음 이 구성은 namespace 내부의 네트워크 포트를 통해 이동하는 네트워크 패킷에 적용된다.
■ LinuxBridge / Open vSwitch 플러그인의 L3 Agent는 네트워크 namespace를 사용한다.
- Namespace를 사용하지 않도록 구성할 수 있지만, 이 경우 중복 서브넷 사용은 비활성화 되어야 한다.
62
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Open vSwitch 플러그인 개념도 (1)
■ 설명은 다음 페이지를 참조한다.
외부 네트워크 단
가상 라우터의 GW IP
eth2
br-ex
eth1
iptables로
NAT 연결
사설 네트워크 단
가상 라우터의
GW IP
Open vSwitch
eth1
VM1 VM2
br-int br-int
가상 L2 스위치에 대한
VLAN ID 매핑은
OpenFlow로 처리됨
VLAN Trunk
Compute 노드
네트워크 노드
dnsmasq dnsmasq
br-priv
외부 네트워크
br-priv
네트워크
namespace
가상 L2 스위치에 대한
VLAN ID 매핑은
OpenFlow로 처리됨
63
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Open vSwitch 플러그인 개념도 (2)
■ 최종 사용자가 가상 L2 스위치 및 가상 라우터와 같은 가상 네트워크 컴포넌트를 정의할 때, Agent는
다음과 같이 작동한다.
- 가상 L2 스위치가 정의되면, compute 노드가 VLAN을 통해 서로 연결되어 있으므로 L2 Agent는
"br-int"와 "br-priv"에 VLAN ID 매핑을 구성한다. 동시에, DHCP Agent는 해당하는 VLAN에
DHCP 기능을 제공하는 dnsmsq를 새로 시작한다.
- 가상 라우터가 정의되고 외부 네트워크에 연결될 때, L3 Agent나 가상 라우터의 외부 게이트웨이로
동작하는 "br-ex"에 포트를 생성한다.
- 가상 L2 스위치가 가상 라우터에 연결될 때, L3 Agent는 가상 라우터의 내부 게이트웨이로 동작하는
"brex"에 포트를 생성한다. 또한 사설 및 공용 네트워크 간의 NAT 연결을 시작하기 위해 iptables를
구성한다.
■ 이미 설명한 Agent 뿐 아니라, 메타데이터 메커니즘을 돕는 "Metadata Proxy Agent"도
존재한다.
- 네트워크 노드의 iptables는 "169.254.169.254:80"으로 전송되는 패킷들을 Metadata Proxy
Agent로 리디렉션하도록 구성된다. 이 Agent는 소스 IP주소로부터 패킷 전송하는 인스턴스를
결정하고, 요청된 메타데이터를 포함한 해당 메시지를 반송한다.
64
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
Metadata Proxy Agent로 패킷 리디렉션
■ 다음 명령은 가상 라우터를 포함하는 네임스페이스 내에서의 iptables 구성을 보여준다. 동일한
노드에서 "169.254.169.254:80"으로 전송되는 패킷이 Metadata Proxy Agent로 리디렉션
되는 항목이 있다.
■ 주의: 메타데이터 메커니즘을 사용하는 경우 게스트 OS의 "/etc/sysconfig/network"에
"NOZEROCONF=yes"로 설정해야 한다.
- 설정하지 않으면, "169.254.0.0/16"으로 전송되는 패킷은 APIPA specification 때문에
게스트 OS 외부로 전달되지 않는다.
# ip netns list
qrouter-b35f6433-c3e7-489a-b505-c3be5606a643
qdhcp-1a4f4b41-3fbb-48a6-bb12-9621077a4f92
qrouter-86654720-d4ff-41eb-89db-aaabd4b13a35
qdhcp-f8422fc9-dbf8-4606-b798-af10bb389708
# ip netns exec qrouter-b35f6433-c3e7-489a-b505-c3be5606a643 iptables -t nat -L
...
Chain quantum-l3-agent-PREROUTING (1 references)
target prot opt source destination
REDIRECT tcp -- anywhere 169.254.169.254 tcp dpt:http redir ports 9697
...
# ps -ef | grep 9697
root 63055 1 0 7月09 ? 00:00:00 python /bin/quantum-ns-metadata-proxy
--pid_file=/var/lib/quantum/external/pids/b35f6433-c3e7-489a-b505-c3be5606a643.pid
--router_id=b35f6433-c3e7-489a-b505-c3be5606a643 --state_path=/var/lib/quantum
--metadata_port=9697 --verbose --log-file=quantum-ns-metadata-proxyb35f6433-c3e7-489a-b505-
c3be5606a643.log --log-dir=/var/log/quantum
가상 라우터를 포함한
nemespace
65
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
가상 네트워크 구성 단계
66
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
가상 네트워크 구성 단계 (1)
■ 다음은 quantum 명령으로 가상 네트워크를 구성하는 단계이다.
- 각 설정에 대한 환경 변수를 아래와 같이 지정한다.
- 외부 네트워크 "ext-network"를 정의한다.
●
외부 네트워크는 다수의 테넌트가 공유하기 때문에, 테넌트 소유자(--tenant-id)는 "services"(공유
서비스에 대한 일반 테넌트)이며, "--shared" 옵션이 추가된다.
●
외부 네트워크에 VLAN이 없다고 가정하므로, network_type은 “flat"이다.
●
플러그인 설정 파일(plugin.ini)에서 외부 네트워크 연결에 대한 Open vSwitch(br-ex)는 여기서
physical_network로 지정된 alias "physnet1"를 가진다.
●
"--router:external=True"는 가상 라우터의 기본 게이트웨이가 되도록 지정한다.
tenant=$(keystone tenant-list | awk '/ services / {print $2}')
quantum net-create 
--tenant-id $tenant ext-network --shared 
--provider:network_type flat --provider:physical_network physnet1 
--router:external=True
public="192.168.199.0/24"
gateway="192.168.199.1"
nameserver="192.168.199.1"
pool=("192.168.199.100" "192.168.199.199")
67
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
가상 네트워크 구성 단계 (2)
- 외부 네트워크의 서브넷을 정의한다.
●
"--allocation-pool"은 IP 주소 풀을 지정한다. (라우터 포트와 유동 IP 등으로 오픈스택이 사용하는
IP 주소의 범위)
- 테넌트 "demo"에 대한 가상 라우터 "demo_router"를 정의하고, 외부 네트워크에 연결한다.
●
테넌트 소유자(--tenant-id)는 “demo"이다.
tenant=$(keystone tenant-list|awk '/ demo / {print $2}')
quantum router-create --tenant-id $tenant demo_router
quantum router-gateway-set demo_router ext-network
quantum subnet-create 
--tenant-id $tenant --gateway ${gateway} --disable-dhcp 
--allocation-pool start=${pool[0]},end=${pool[1]} 
ext-network ${public}
bridge_mappings=physnet1:br-ex,physnet2:br-priv
tenant_network_type=vlan
network_vlan_ranges=physnet1,physnet2:100:199
플러그인 구성 파일(/etc/quantum/plugin.ini)에 Open vSwitch에 대한 alias 설정
Alias와 실제 Open vSwitch
이름 사이의 매핑
각 Open vSwitch에 대한 VLAN ID 범위
(VLAN은 physnet1에 사용되지 않음)
68
Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.
가상 네트워크 구성 단계 (3)
- 가상 L2 스위치 "private01"을 정의한다.
●
VLAN이 사설 네트워크의 분리 메커니즘으로 사용되기 때문에, network_type은 "vlan"을 지정한다.
VLAN ID는 segmentation_id로 지정한다.
●
플러그인 구성 파일(plugin.ini)에서 사설 네트워크 연결에 대한 Open vSwitch(br-priv)는 여기서
physical_network로 지정된 alias "physnet2"를 가진다.
- "private01"의 서브넷을 정의하고, 가상 라우터에 연결한다.
●
여기서는 예로 서브넷에 대해 "192.168.1.101/24"를 지정한다.
quantum net-create 
--tenant-id $tenant private01 
--provider:network_type vlan 
--provider:physical_network physnet2 
--provider:segmentation_id 101
quantum subnet-create 
--tenant-id $tenant --name private01-subnet 
--dns-nameserver ${nameserver} private01 192.168.1.101/24
quantum router-interface-add demo_router private01-subnet

More Related Content

What's hot

오픈스택 멀티노드 설치 후기
오픈스택 멀티노드 설치 후기오픈스택 멀티노드 설치 후기
오픈스택 멀티노드 설치 후기영우 김
 
클라우드 컴퓨팅 기반 기술과 오픈스택(Kvm) 기반 Provisioning
클라우드 컴퓨팅 기반 기술과 오픈스택(Kvm) 기반 Provisioning 클라우드 컴퓨팅 기반 기술과 오픈스택(Kvm) 기반 Provisioning
클라우드 컴퓨팅 기반 기술과 오픈스택(Kvm) 기반 Provisioning Ji-Woong Choi
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門VirtualTech Japan Inc.
 
OpenStack 개요 및 활용 사례 @ Community Open Camp with Microsoft
OpenStack 개요 및 활용 사례 @ Community Open Camp with MicrosoftOpenStack 개요 및 활용 사례 @ Community Open Camp with Microsoft
OpenStack 개요 및 활용 사례 @ Community Open Camp with MicrosoftIan Choi
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門VirtualTech Japan Inc.
 
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:講義No2OpenStackクラウド基盤構築ハンズオンセミナー 第2日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:講義No2Etsuji Nakai
 
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링OpenStack Korea Community
 
A Universe From Nothing
A Universe From NothingA Universe From Nothing
A Universe From NothingStigTelfer
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShellSalaudeen Rajack
 
2014 OpenStack Day in Korea - oVirt and OpenStack Integration and more
2014 OpenStack Day in Korea - oVirt and OpenStack Integration and more2014 OpenStack Day in Korea - oVirt and OpenStack Integration and more
2014 OpenStack Day in Korea - oVirt and OpenStack Integration and moreRogan Kyuseok Lee
 
Ansible 2.8 アップデート情報 -機能追加と注意点-
Ansible 2.8 アップデート情報 -機能追加と注意点-Ansible 2.8 アップデート情報 -機能追加と注意点-
Ansible 2.8 アップデート情報 -機能追加と注意点-akira6592
 
OpenStack概要 ~仮想ネットワーク~
OpenStack概要 ~仮想ネットワーク~OpenStack概要 ~仮想ネットワーク~
OpenStack概要 ~仮想ネットワーク~Masaya Aoyama
 
20150511 jun lee_openstack neutron 분석 (최종)
20150511 jun lee_openstack neutron 분석 (최종)20150511 jun lee_openstack neutron 분석 (최종)
20150511 jun lee_openstack neutron 분석 (최종)rootfs32
 
[2018] 오픈스택 5년 운영의 경험
[2018] 오픈스택 5년 운영의 경험[2018] 오픈스택 5년 운영의 경험
[2018] 오픈스택 5년 운영의 경험NHN FORWARD
 
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin	Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin Vietnam Open Infrastructure User Group
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術Etsuji Nakai
 
Virtualization Architecture & KVM
Virtualization Architecture & KVMVirtualization Architecture & KVM
Virtualization Architecture & KVMPradeep Kumar
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 

What's hot (20)

Helm intro
Helm introHelm intro
Helm intro
 
오픈스택 멀티노드 설치 후기
오픈스택 멀티노드 설치 후기오픈스택 멀티노드 설치 후기
오픈스택 멀티노드 설치 후기
 
클라우드 컴퓨팅 기반 기술과 오픈스택(Kvm) 기반 Provisioning
클라우드 컴퓨팅 기반 기술과 오픈스택(Kvm) 기반 Provisioning 클라우드 컴퓨팅 기반 기술과 오픈스택(Kvm) 기반 Provisioning
클라우드 컴퓨팅 기반 기술과 오픈스택(Kvm) 기반 Provisioning
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
 
OpenStack 개요 및 활용 사례 @ Community Open Camp with Microsoft
OpenStack 개요 및 활용 사례 @ Community Open Camp with MicrosoftOpenStack 개요 및 활용 사례 @ Community Open Camp with Microsoft
OpenStack 개요 및 활용 사례 @ Community Open Camp with Microsoft
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
 
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:講義No2OpenStackクラウド基盤構築ハンズオンセミナー 第2日:講義No2
OpenStackクラウド基盤構築ハンズオンセミナー 第2日:講義No2
 
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
[OpenInfra Days Korea 2018] (Track 4) - Grafana를 이용한 OpenStack 클라우드 성능 모니터링
 
A Universe From Nothing
A Universe From NothingA Universe From Nothing
A Universe From Nothing
 
Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 
2014 OpenStack Day in Korea - oVirt and OpenStack Integration and more
2014 OpenStack Day in Korea - oVirt and OpenStack Integration and more2014 OpenStack Day in Korea - oVirt and OpenStack Integration and more
2014 OpenStack Day in Korea - oVirt and OpenStack Integration and more
 
Ansible 2.8 アップデート情報 -機能追加と注意点-
Ansible 2.8 アップデート情報 -機能追加と注意点-Ansible 2.8 アップデート情報 -機能追加と注意点-
Ansible 2.8 アップデート情報 -機能追加と注意点-
 
OpenStack概要 ~仮想ネットワーク~
OpenStack概要 ~仮想ネットワーク~OpenStack概要 ~仮想ネットワーク~
OpenStack概要 ~仮想ネットワーク~
 
20150511 jun lee_openstack neutron 분석 (최종)
20150511 jun lee_openstack neutron 분석 (최종)20150511 jun lee_openstack neutron 분석 (최종)
20150511 jun lee_openstack neutron 분석 (최종)
 
[2018] 오픈스택 5년 운영의 경험
[2018] 오픈스택 5년 운영의 경험[2018] 오픈스택 5년 운영의 경험
[2018] 오픈스택 5년 운영의 경험
 
Ingress overview
Ingress overviewIngress overview
Ingress overview
 
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin	Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
 
Dockerを支える技術
Dockerを支える技術Dockerを支える技術
Dockerを支える技術
 
Virtualization Architecture & KVM
Virtualization Architecture & KVMVirtualization Architecture & KVM
Virtualization Architecture & KVM
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 

Similar to 오픈스택: 구석구석 파헤쳐보기

Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoMario Cho
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)Seungmo Koo
 
Toast cloud for beginners
Toast cloud for beginnersToast cloud for beginners
Toast cloud for beginnersTOAST_NHNent
 
Build the OpenStack Cloud with Neutron Networing, IceHouse
Build the OpenStack Cloud with Neutron Networing, IceHouseBuild the OpenStack Cloud with Neutron Networing, IceHouse
Build the OpenStack Cloud with Neutron Networing, IceHousejieun kim
 
[slideshare]k8s.pptx
[slideshare]k8s.pptx[slideshare]k8s.pptx
[slideshare]k8s.pptxssuserb8551e
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
 
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기Jinuk Kim
 
오픈 소스 클라우드 플랫폼 분석
오픈 소스 클라우드 플랫폼 분석오픈 소스 클라우드 플랫폼 분석
오픈 소스 클라우드 플랫폼 분석Jennifer Noh
 
Cloud based NGS framework
Cloud based NGS frameworkCloud based NGS framework
Cloud based NGS frameworkHyungyong Kim
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
 
20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제Tae Young Lee
 
OpenStack DevStack Install - 2부 (Multi-nodes)
OpenStack DevStack Install - 2부 (Multi-nodes)OpenStack DevStack Install - 2부 (Multi-nodes)
OpenStack DevStack Install - 2부 (Multi-nodes)Ian Choi
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇Seungyong Lee
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
Kubernetes on Premise Practical Guide
Kubernetes on Premise Practical GuideKubernetes on Premise Practical Guide
Kubernetes on Premise Practical GuideChan Shik Lim
 
모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호용호 최
 

Similar to 오픈스택: 구석구석 파헤쳐보기 (20)

Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
Kafka slideshare
Kafka   slideshareKafka   slideshare
Kafka slideshare
 
Toast cloud for beginners
Toast cloud for beginnersToast cloud for beginners
Toast cloud for beginners
 
Build the OpenStack Cloud with Neutron Networing, IceHouse
Build the OpenStack Cloud with Neutron Networing, IceHouseBuild the OpenStack Cloud with Neutron Networing, IceHouse
Build the OpenStack Cloud with Neutron Networing, IceHouse
 
[slideshare]k8s.pptx
[slideshare]k8s.pptx[slideshare]k8s.pptx
[slideshare]k8s.pptx
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
 
오픈 소스 클라우드 플랫폼 분석
오픈 소스 클라우드 플랫폼 분석오픈 소스 클라우드 플랫폼 분석
오픈 소스 클라우드 플랫폼 분석
 
Cloud based NGS framework
Cloud based NGS frameworkCloud based NGS framework
Cloud based NGS framework
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제
 
OpenStack DevStack Install - 2부 (Multi-nodes)
OpenStack DevStack Install - 2부 (Multi-nodes)OpenStack DevStack Install - 2부 (Multi-nodes)
OpenStack DevStack Install - 2부 (Multi-nodes)
 
OpenStack Swift Debugging
OpenStack Swift DebuggingOpenStack Swift Debugging
OpenStack Swift Debugging
 
윈도우 커널 익스플로잇
윈도우 커널 익스플로잇윈도우 커널 익스플로잇
윈도우 커널 익스플로잇
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
Kubernetes on Premise Practical Guide
Kubernetes on Premise Practical GuideKubernetes on Premise Practical Guide
Kubernetes on Premise Practical Guide
 
Maker 오해와 진실
Maker 오해와 진실Maker 오해와 진실
Maker 오해와 진실
 
모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호
 

오픈스택: 구석구석 파헤쳐보기

  • 1. 1 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. OpenStack: Inside Out 오픈스택: 구석구석 파헤쳐보기 Etsuji Nakai Senior Solution Architect Red Hat Ver1.0 2014/02/22 Translated in Korean by Jaehwa Park jaehwa@gmail.com
  • 2. 2 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. $ who am i - The author of “Professional Linux Systems” series. ● Available in Japanese/Korean. Translation offering from publishers are welcomed ;-) Self-study Linux Deploy and Manage by yourself Professional Linux Systems Deployment and Management Professional Linux Systems Network Management ■ Etsuji Nakai - Senior solution architect and Cloud evangelist at Red Hat. Professional Linux Systems Technology for Next Decade
  • 3. 3 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 목차 ■ 오픈스택 개요 ■ 오픈스택 주요 컴포넌트 ■ Nova와 Cinder 내부 아키텍처 ■ Neutron 아키텍처 개요 ■ LinuxBridge 플러그인 내부 아키텍처 ■ Open vSwitch 플러그인 내부 아키텍처 ■ 가상 네트워크 구성 단계 참고: 본 문서에서는 RDO(Grizzly) 사용을 가정한다.
  • 4. 4 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 오픈스택 개요
  • 5. 5 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 오픈스택 클라우드의 컴퓨팅 자원 ■ 오픈스택의 최종 사용자는 웹 콘솔이나 API 등을 통해서 사용자의 프라이빗 테넌트(private tenants)에서 다음의 컴퓨팅 자원들을 생성하고 설정할 수 있다. - 가상 네트워크 - VM 인스턴트 - 블록 볼륨 사용자 데이터 블록 볼륨 가상 라우터 가상 스위치 외부 네트워크 프로젝트 환경 오픈스택 사용자 OS ■ 각 사용자들은 어떤 프로젝트들에 속한다. - 동일 프로젝트 내의 사용자들은 프로젝트 환경의 공통 컴퓨팅 자원들을 공유한다. - 각 프로젝트는 다른 프로젝트와 독립된 (가상의) 컴퓨팅 자원들을 소유한다. VM 인스턴스
  • 6. 6 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. VM 인스턴스 생성 ■ 새로운 VM 인스턴스를 시작할 때, 다음의 옵션들을 지정해야 한다. - 인스턴스 유형 (flavor) - 템플릿 이미지 - 가상 네트워크 - 보안 그룹 - 키 쌍 외부 네트워크 OS템플릿 이미지 다운로드 다수의 네트워크에 접속하는 것이 가능함 보안 그룹 포맷 설명 raw Flat 이미지 파일 AMI/AKI/ARI Amazon EC2에서 사용 qcow2 Linux KVM에서 사용 VDI VirtualBox에서 사용 VMDK VMware에서 사용 VHD Hyper-V에서 사용 지원하는 템플릿 이미지 포맷
  • 7. 7 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 오픈스택 가상 네트워크의 논리적 관점 ■ 각 테넌트(tenant)는 마치 "홈 네트워크의 브로드밴드 라우터"와 같이 동작하는 가상 라우터를 소유 한다. - 테넌트 사용자들은 라우터 아랫단에 가상 스위치들을 추가하고 사설 서브넷 주소(private subnet address)를 할당한다. 서브넷은 다른 테넌트와 중복 사용이 가능하다. ■ 인스턴스를 시작할 때 최종 사용자는 연결할 가상 스위치를 선택한다. - 인스턴스의 가상 NIC들의 수는 연결할 스위치의 수에 해당한다. DHCP를 통해 사설 IP(Private IP)들 을 할당한다. 가상 스위치 192.168.101.0/24 테넌트 A의 가상 라우터 외부 네트워크 테넌트 B의 가상 라우터 가상 스위치 192.168.102.0/24
  • 8. 8 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. SSH 접속을 위한 키 쌍 인증 ■ 사용자는 사전에 공개 키를 등록한다. 새로운 인스턴스가 시작될 때 게스트 OS에 입력된다. - 각 사용자에 대해 키 쌍이 등록된다. 이 키 쌍들은 여러 사용자들과 공유하지 않는다. 사용자 정보 데이터베이스 VM 인스턴스 (2) 게스트 OS에 공개 키 입력됨 비밀 키 공개 키 (1) 사전에 공개 키 등록 (3) 비밀 키로 인증
  • 9. 9 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 사설 IP와 유동 IP ■ 외부 네트워크에서 접근할 때, "유동 IP(Floating IP)"를 VM 인스턴스에 할당한다. - 유동 IP로 사용할 수 있는 외부 네트워크의 IP 주소 구간은 사전에 풀링하고 각 테넌트에 배포한다. - 유동 IP는 가상 라우터에서 해당하는 사설 IP로 NAT 변환된다. - VM 인스턴스에서 외부 네트워크로 접근하는 것은 유동 IP 할당 없이 가능하다. 이 경우 가상 라우터의 IP 마스커레이드 기능이 사용된다. Web 서버 DB 서버 사설 IP 사설 IP 유동 IP 유동 IP로 외부 네트워크로부터 접속 VM 인스턴스 간은 사설 IP로 접속
  • 10. 10 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 인스턴스 유형과 해당 디스크 영역 ■ 다음은 기본으로 생성되는 인스턴스 유형이다. - root 디스크는 템플릿 이미지에서 복사된 후 지정된 크기로 확장된다.(m1.tiny 제외) ■ 관리자는 새 인스턴스 유형을 정의할 수 있다. - 다음은 temp 디스크와 swap 디스크를 사용한 예이다. - 인스턴스가 소멸될 때 이들 디스크가 삭제되기 때문에 영구 데이터는 다른 장소(일반적으로 블록 볼륨들) 에 저장된다. 인스턴스 유형 (flavor) vCPU Memory root disk temp disk swap disk m1.tiny 1 512MB 0GB 0 0 m1.small 1 2GB 20GB 0 0 m1.medium 2 4GB 40GB 0 0 m1.large 4 4GB 80GB 0 0 m1.xlarge 8 8GB 160GB 0 0 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 252:0 0 20G 0 disk └─vda1 252:1 0 20G 0 part / vdb 252:16 0 5G 0 disk /mnt vdc 252:32 0 1G 0 disk [SWAP] swap disk root disk temp disk
  • 11. 11 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. VM 인스턴스의 스냅샷 ■ 실행 중인 인스턴스의 스냅샷을 만들어서 root 디스크를 복사할 수 있고, 템플릿 이미지로 다시 사용할 수 있다. OS 템플릿 이미지 템플릿 이미지로부터 인스턴스 시작 인스턴스 스냅샷 OS root 디스크의 복사본인 스냅샷 생성 스냅샷으로부터 인스턴스 시작
  • 12. 12 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 블록 볼륨에서 부팅하기 블록 볼륨으로부터 직접 인스턴스 부팅 OS 스냅샷 생성 OS 복제 ■ 부팅 블록 볼륨을 생성하기 위해 템플릿 이미지를 새로운 블록 볼륨에 복사할 수 있다. - 블록 볼륨에서 부팅할 때, 인스턴스가 제거된 경우에도 게스트 OS의 내용이 삭제되지 않고 남아 있다. - 부팅 볼륨의 스냅샷을 생성하고, 새 인스턴스를 시작할 때 새로운 부팅 볼륨을 생성할 수 있다. OS 템플릿 이미지로부터 블록 볼륨 생성 OS템플릿 이미지
  • 13. 13 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 영구 데이터 저장소, 블록 볼륨 사용자 데이터 (3) 스냅샷 생성 (4) 스냅샷으로부터 새로운 블록 볼륨을 생성 (2) 실행 중인 인스턴스에 사용자 데이터를 저장하기 위해 연결 사용자 데이터 다른 인스턴스에 다시 연결할 수 있음 (1) 새로운 블록 볼륨 생성 OS OS ■ 블록 볼륨은 VM 인스턴스를 제거해도 삭제되지 않고 남아 있다. 영구 데이터 저장소로 사용할 수 있다.
  • 14. 14 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 오픈스택의 주요 컴포넌트
  • 15. 15 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 오픈스택의 주요 컴포넌트 ■ 오픈스택은 다양한 서비스와 기능들을 위한 컴포넌트 모듈의 세트이다. - Swift: 오브젝트 저장소(Object store) ● Amazon S3와 같은 오브젝트 저장소 - Nova: 가상 머신 라이프사이클 관리자 - Glance: 가상 머신 이미지 카탈로그 ● 실제 이미지들은 백엔드 저장소(주로 Swift)에 저장됨 - Cinder: 가상 디스크 볼륨 ● Amazon EBS와 같은 볼륨 관리자 - Keystone: 중앙 집중식 인증과 서비스 카탈로그 시스템 - Neutron: 가상 네트워크 관리 API(이전 버전의 Quantum) ● 실제 네트워크 프로비저닝은 외부 플러그인 모듈에 위임 - Horizon: 웹 기반의 셀프 서비스 포털
  • 16. 16 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 모듈은 REST API를 통해 함께 동작 VM 템플릿 이미지 Nova Compute Nova Compute Glance Horizon Nova Scheduler Neutron 관리용 네트워크 디스크 이미지 가상 네트워크 생성 가상 머신 시작 가상 디스크 볼륨 연결 (iSCSI) 인증 서비스 템플릿 이미지 검색 QPID / MySQL Network Node Nova Compute CinderKeystone Swift 메시지 큐와 벡엔드 RDB 공용 네트워크 클라이언트 PC 가상 머신 생성 ■ 모듈들은 REST API 호출과 메시지 큐를 통해 같이 동작한다. - 조작(운영)은 REST API를 통한 외부 프로그램으로 자동화할 수 있다.
  • 17. 17 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. API 요청 호출 ■ API 요청이 호출되는 경우는 두 가지가 있다. - 최종 사용자가 Horizon 대시보드를 통하거나 직접 요청 호출을 보낼 때 - 일부 컴포넌트가 다른 컴포넌트에게 요청 호출을 보낼 때 Database MySQL Messaging QPID 인프라스트럭처 데이터 에이전트로 메시지 전달 Horizon (대시보드) Keystone (사용자 인증) Neutron (가상 네트워크) Cinder (블록 볼륨) Nova (VM 인스턴스) Glance (VM 템플릿) 템플릿 이미지 다운로드블록 볼륨 연결 가상 스위치에 연결 API 호출 Web 액세스
  • 18. 18 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. API 요청에 대한 사용자 인증 ■ API에 요청을 보내기 전에 인증이 필요하다. - 최종 사용자/컴포넌트는 API에 요청을 보내기 전에 Keystone으로부터 API 동작에 대한 "토큰 (token)"을 구한다. (각 컴포넌트의 사용자 ID는 Keystone에 있다.) - 토큰을 획득하면, 대상 API에 대한 URL이 Keystone에서 검색된다. 최종 사용자는 사전에 Keystone API에 대한 URL만 알고 있어야 한다. Horizon (대시보드) Keystone (사용자 인증) Neutron (가상 네트워크) Cinder (블록 볼륨) Nova (VM 인스턴스) Glance (VM 템플릿)
  • 19. 19 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Keystone 인증 토큰 메커니즘 ■ 오픈스택 클라이언트는 다양한 컴포넌트들에 많은 API 호출을 하기 때문에, 모든 호출에 대해서 ID/비밀번호를 이용한 인증은 보안 및 성능 측면에서 바람직하지 않다. ■ 대신, 클라이언트는 사전에 API 호출에 대해 "라이선스(license)"로 "토큰(token)"을 획득하고, 사용할 컴포넌트에 토큰 ID를 보낸다. - 요청을 수신하는 컴포넌트는 요청을 승인하기 전에 Keystone에 토큰 ID를 검증한다. - 생성된 토큰은 일정 기간(기본값: 24시간) 동안 Keystone에 저장된다. 클라이언트는 기간이 만료될 때 까지 토큰을 다시 사용할 수 있다. 클라이언트는 각각의 요청 호출에 대해 토큰을 획득할 필요가 없다. 클라이언트 Keystone 서버 ID=yyyy토큰 획득 (ID/비밀번호로 인증) 토큰 ID 반송 생성된 토큰은 Keystone에 저장 토큰 ID를 가지고 요청을 보냄 토큰 ID를 확인하고 클라이언트의 역할을 점검
  • 20. 20 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Keystone의 명령 작업 (1) ■ 오픈스택의 표준 명령 행 도구를 사용할 경우, 사용자명, 비밀번호, 테넌트, 환경변수와 API의 URL을 지정한다. - Keystone API는 관리자와 일반 사용자에 대해 다른 URL(포트 번호)을 가진다. - 명령 행 옵션들을 함께 지정할 수 있다. - 다음은 관리자 "admin"을 이용한 Keystone 동작의 예이다. # cat keystonerc_admin export OS_USERNAME=admin export OS_TENANT_NAME=admin export OS_PASSWORD=714f1ab569a64a3b export OS_AUTH_URL=http://172.16.1.11:35357/v2.0/ export PS1='[u@h W(keystone_admin)]$ ' # . keystonerc_admin # keystone user-list +----------------------------------+------------+---------+-------------------+ | id | name | enabled | email | +----------------------------------+------------+---------+-------------------+ | 589a800d70534655bfade5504958afd6 | admin | True | test@test.com | | 3c45a1f5a88d4c1d8fb07b51ed72cd55 | cinder | True | cinder@localhost | | f23d88041e5245ee8cc8b0a5c3ec3f6c | demo_admin | True | | | 44be5165fdf64bd5907d07aa1aaa5dab | demo_user | True | | | cd75770810634ed3a09d92b61aacf0a7 | glance | True | glance@localhost | | a38561ed906e48468cf1759918735c53 | nova | True | nova@localhost | | 157c8846521846e0abdd16895dc8f024 | quantum | True | quantum@localhost | +----------------------------------+------------+---------+-------------------+ /root에서 packstack이 생성함 admin 사용자들을 위해 포트 35357을 사용함
  • 21. 21 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Keystone의 명령 작업 (2) ■ 다음은 등록된 API 서비스와 해당 URL을 보여주는 예이다. - 다른 컴포넌트에 대한 명령 행 도구는 대상 컴포넌트의 API를 검색하는 데 내부적으로 이 메커니즘을 사용한다. ■ 각 명령 행 도구는 하위 명령어의 목록과 상세 정보를 표시하는 "help" 명령어를 제공한다. # keystone service-list +----------------------------------+----------+----------+----------------------------+ | id | name | type | description | +----------------------------------+----------+----------+----------------------------+ | 5ea55cbee90546d1abace7f71808ad73 | cinder | volume | Cinder Service | | e92e73a765be4beca9f12f5f5d9943e0 | glance | image | Openstack Image Service | | 3631d835081344eb873f1d0d5057314d | keystone | identity | OpenStack Identity Service | | 8db624ad713e440492aeccac6ab70a90 | nova | compute | Openstack Compute Service | | e9f02d3803ab44f1a369602010864a34 | nova_ec2 | ec2 | EC2 Service | | 5889a1e691584e539aa121ab31194cca | quantum | network | Quantum Networking Service | +----------------------------------+----------+----------+----------------------------+ # keystone endpoint-list +----------------------------------+-----------+------------------------------------------||-+----------------------------------+ | id | region | publicurl || | service_id | +----------------------------------+-----------+------------------------------------------||-+----------------------------------+ | 0e96a30d9ce742ecb0bf123eebf84ac0 | RegionOne | http://172.16.1.11:8774/v2/%(tenant_id)s || | 8db624ad713e440492aeccac6ab70a90 | | 928a38f18cc54040a0aa53bd3da99390 | RegionOne | http://172.16.1.11:9696/ || | 5889a1e691584e539aa121ab31194cca | | d46cebe4806b43c4b48499285713ac7a | RegionOne | http://172.16.1.11:9292 || | e92e73a765be4beca9f12f5f5d9943e0 | | ebdd4e61571945b7801554908caf5bae | RegionOne | http://172.16.1.11:8776/v1/%(tenant_id)s || | 5ea55cbee90546d1abace7f71808ad73 | | ebec661dd65b4d4bb12fe67c25b2c77a | RegionOne | http://172.16.1.11:5000/v2.0 || | 3631d835081344eb873f1d0d5057314d | | f569475b6d364a04837af6d6a577befe | RegionOne | http://172.16.1.11:8773/services/Cloud || | e9f02d3803ab44f1a369602010864a34 | +----------------------------------+-----------+------------------------------------------||-+----------------------------------+ # keystone help <- 모든 하위 명령들의 목록을 표시 # keystone help user-list <- 하위 명령 “user-list”의 상세 내용 표시
  • 22. 22 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Horizon (대시보드) Keystone (사용자 인증) Neutron (가상 네트워크) Cinder (블록 볼륨) Nova (VM 인스턴스) Glance (VM 템플릿) Glance를 이용한 템플릿 이미지 등록 (1) ■ Glance를 이용해 새로운 템플릿 이미지를 등록할 수 있다. 등록된 이미지는 Nova에서 사용할 수 있다.
  • 23. 23 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Glance를 이용한 템플릿 이미지 등록 (2) ■ 다음은 일반 사용자 "demo_user"로 새로운 템플릿 이미지를 등록하는 예이다. 이미지는 지정된 URL에서 다운로드 한 것이다. # cat keystonerc_demo_user export OS_USERNAME=demo_user export OS_TENANT_NAME=demo export OS_PASSWORD=passw0rd export OS_AUTH_URL=http://172.16.1.11:5000/v2.0/ export PS1='[u@h W(keystone_demouser)]$ ' # . keystonerc_demo_user # glance image-create --name "Fedora19" --disk-format qcow2 --container-format bare --is-public true --copy-from http://cloud.fedoraproject.org/fedora-19.x86_64.qcow2 # glance image-list +--------------------------------------+----------+-------------+------------------+-----------+--------+ | ID | Name | Disk Format | Container Format | Size | Status | +--------------------------------------+----------+-------------+------------------+-----------+--------+ | 702d0c4e-b06c-4c15-85e5-9bb612eb6414 | Fedora19 | qcow2 | bare | 237371392 | active | +--------------------------------------+----------+-------------+------------------+-----------+--------+ 일반 사용자들을 위해 포트 5000을 사용함 이 파일은 직접 만들어야 함
  • 24. 24 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Keystone (사용자 인증) Neutron을 이용한 가상 네트워크 운영 ■ Neutron API를 통해 최종 사용자는 자신의 테넌트 전용 가상 네트워크를 생성할 수 있다. - "가상 네트워크의 구성 단계"에서 상세하게 설명한다. # . keystonerc_demo_user # quantum net-list +--------------------------------------+-------------+-------------------------------------------------------+ | id | name | subnets | +--------------------------------------+-------------+-------------------------------------------------------+ | 843a1586-6082-4e9f-950f-d44daa83358c | private01 | 9888df89-a17d-4f4c-b427-f28cffe8fed2 192.168.101.0/24 | | d3c763f0-ebf0-4717-b3fc-cda69bcd1957 | private02 | 23b26d98-2277-4fb5-8895-3f42cde7e1fd 192.168.102.0/24 | | d8040897-44b0-46eb-9c51-149dfe351bbe | ext-network | 1b8604a4-f39d-49de-a97c-3e40117a7516 192.168.199.0/24 | +--------------------------------------+-------------+-------------------------------------------------------+ "quantum"명령어는 Havana 릴리즈에서 "neutron"으로 바뀌었음 Horizon (대시보드) Neutron (가상 네트워크) Cinder (블록 볼륨) Nova (VM 인스턴스) Glance (VM 템플릿)
  • 25. 25 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Nova를 이용한 VM 인스턴스 생성 ■ Nova가 인스턴스 생성 요청을 수신하면, API를 통해 Glance 및 Neutron과 통신한다. - Glance API를 통해 컴퓨트 노드에 템플릿 이미지를 다운로드한다. - Neutron API를 통해 가상 네트워크에 시작된 인스턴스를 연결한다. Horizon (대시보드) Keystone (사용자 인증) Neutron (가상 네트워크) Cinder (블록 볼륨) Nova (VM 인스턴스) Glance (VM 템플릿) 템플릿 이미지 다운로드 가상 스위치에 연결
  • 26. 26 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 인스턴스를 시작하는 명령 작업 (1) ■ 다음은 최종 사용자가 인스턴스를 기동하기 전에 필요한 정보를 확인하는 방법을 보여준다. # . keystonerc_demo_user # nova flavor-list +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+ | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | extra_specs | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+ | 1 | m1.tiny | 512 | 0 | 0 | | 1 | 1.0 | True | {} | | 2 | m1.small | 2048 | 20 | 0 | | 1 | 1.0 | True | {} | | 3 | m1.medium | 4096 | 40 | 0 | | 2 | 1.0 | True | {} | | 4 | m1.large | 8192 | 80 | 0 | | 4 | 1.0 | True | {} | | 5 | m1.xlarge | 16384 | 160 | 0 | | 8 | 1.0 | True | {} | +----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+ # nova keypair-list +-------+-------------------------------------------------+ | Name | Fingerprint | +-------+-------------------------------------------------+ | mykey | 31:8c:0e:43:67:40:f6:17:a3:f8:3f:d5:73:8e:d0:30 | +-------+-------------------------------------------------+ # nova image-list +--------------------------------------+----------+--------+--------+ | ID | Name | Status | Server | +--------------------------------------+----------+--------+--------+ | 702d0c4e-b06c-4c15-85e5-9bb612eb6414 | Fedora19 | ACTIVE | | +--------------------------------------+----------+--------+--------+ # nova secgroup-list +---------+-------------+ | Name | Description | +---------+-------------+ | default | default | +---------+-------------+ # nova net-list +--------------------------------------+-------------+------+ | ID | Label | CIDR | +--------------------------------------+-------------+------+ | 843a1586-6082-4e9f-950f-d44daa83358c | private01 | None | | d3c763f0-ebf0-4717-b3fc-cda69bcd1957 | private02 | None | | d8040897-44b0-46eb-9c51-149dfe351bbe | ext-network | None | +--------------------------------------+-------------+------+ Nova는 Glance API를 통해서 이미지 목록을 얻음 Nova는 Neutron API를 통해서 네트워크 목록을 얻음
  • 27. 27 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 인스턴스를 시작하는 명령 작업 (2) ■ 다음은 이전 페이지의 정보를 이용하여 인스턴스를 시작하는 예이다. # nova boot --flavor m1.small --image Fedora19 --key-name mykey --security-groups default --nic net-id=843a1586-6082-4e9f-950f-d44daa83358c vm01 +-----------------------------+--------------------------------------+ | Property | Value | +-----------------------------+--------------------------------------+ | status | BUILD | | updated | 2013-11-22T06:22:52Z | | OS-EXT-STS:task_state | scheduling | | key_name | mykey | | image | Fedora19 | | hostId | | | OS-EXT-STS:vm_state | building | | flavor | m1.small | | id | f40c9b76-3891-4a5f-a62c-87021ba277ce | | security_groups | [{u'name': u'default'}] | | user_id | 2e57cd295e3f4659b151dd80f3a73468 | | name | vm01 | | adminPass | 5sUFyKhgovV6 | | tenant_id | 555b49dc8b6e4d92aa74103bfb656e70 | | created | 2013-11-22T06:22:51Z | | OS-DCF:diskConfig | MANUAL | | metadata | {} | ...snip... +-----------------------------+--------------------------------------+ # nova list +--------------------------------------+------+--------+-------------------------+ | ID | Name | Status | Networks | +--------------------------------------+------+--------+-------------------------+ | f40c9b76-3891-4a5f-a62c-87021ba277ce | vm01 | ACTIVE | private01=192.168.101.3 | +--------------------------------------+------+--------+-------------------------+
  • 28. 28 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Neutron API를 이용한 유동 IP 연결 ■ 여러 개의 NIC를 가진 인스턴스에 유동 IP를 추가할 때, 연결하는 NIC 포트를 지정하는 Neutron API를 사용해야 한다. - 사설 IP에 대응하는 포트 ID를 식별한 후, 그 포트 ID에 유동 IP를 연결한다. # nova boot --flavor m1.small --image Fedora19 --key-name mykey --security-groups default --nic net-id=843a1586-6082-4e9f-950f-d44daa83358c --nic net-id=d3c763f0-ebf0-4717-b3fc-cda69bcd1957 Vm01 # nova list +--------------------------------------+------+--------+--------------------------------------------------+ | ID | Name | Status | Networks | +--------------------------------------+------+--------+--------------------------------------------------+ | e8d0fa19-130f-4502-acfe-132962134846 | vm01 | ACTIVE | private01=192.168.101.3; private02=192.168.102.3 | +--------------------------------------+------+--------+--------------------------------------------------+ # quantum port-list +--------------------------------------+------+-------------------+------------------------------------+ | id | name | mac_address | fixed_ips | +--------------------------------------+------+-------------------+------------------------------------+ | 10c3cd17-78f5-443f-952e-1e3e427e477f | | fa:16:3e:37:7b:a6 | ... "ip_address": "192.168.102.3"} | | d0057651-e1e4-434c-a81d-c950b9c06333 | | fa:16:3e:e6:d9:4c | ... "ip_address": "192.168.101.3"} | +--------------------------------------+------+-------------------+------------------------------------+ # quantum floatingip-list +--------------------------------------+------------------+---------------------+---------+ | id | fixed_ip_address | floating_ip_address | port_id | +--------------------------------------+------------------+---------------------+---------+ | 06d24f23-c2cc-471f-a4e6-59cf00578141 | | 171.16.1.101 | | | 89b49a78-8fd7-461b-8fe2-fba4a341c8a2 | | 172.16.1.102 | | +--------------------------------------+------------------+---------------------+---------+ # quantum floatingip-associate 06d24f23-c2cc-471f-a4e6-59cf00578141 d0057651-e1e4-434c-a81d-c950b9c06333
  • 29. 29 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 키 쌍 및 보안 그룹에 대한 작업 ■ 키 쌍을 생성/등록하고, 보안 그룹을 정의하는 등의 보안 관련 작업은 Nova API를 통해 수행할 수 있다. - 다음은 새로운 키 쌍 "key01"을 생성하고, "~/.ssh/key01.pem"에 개인(비밀) 키를 저장한다. - 다음은 "key02"로 존재하는 키 쌍의 공개 키(public key)를 등록한다. - 다음은 새로운 보안 그룹 "group01"을 생성하고, TCP 포트 22에 대한 액세스를 허용한다. ■ 보안 그룹은 현재 Neutron 통제 하에 있기 때문에, quantum(neutron) API를 통해서도 구성 명령을 수행할 수 있다. # nova keypair-add key01 > ~/.ssh/key01.pem # chmod 600 ~/.ssh/key01.pem # nova secgroup-create group01 "My security group." # nova secgroup-add-rule group01 tcp 22 22 0.0.0.0/0 # nova keypair-add --pub-key ~/.ssh/id_rsa.pub key02 # quantum security-group-create group01 --description "My security group." # quantum security-group-rule-create --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix "0.0.0.0/0" group01
  • 30. 30 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 인스턴스를 시작하는 명령 작업 (3) ■ 사용자 정의 스크립트(사용자 데이터)를 사용하기 위해서 "--user-data" 옵션으로 파일을 지정할 수 있다. - 다음은 사용자 정의 스크립트를 사용하여 인스턴스를 시작하고 유동 IP를 추가하는 예이다. # cat hello.txt #!/bin/sh echo 'Hello, World!' > /etc/motd # nova boot --flavor m1.small --image Fedora19 --key-name mykey --security-groups default --nic net-id=843a1586-6082-4e9f-950f-d44daa83358c --user-data hello.txt vm01 # nova floating-ip-list +--------------+-------------+----------+-------------+ | Ip | Instance Id | Fixed Ip | Pool | +--------------+-------------+----------+-------------+ | 172.16.1.101 | None | None | ext-network | | 172.16.1.102 | None | None | ext-network | | 172.16.1.103 | None | None | ext-network | | 172.16.1.104 | None | None | ext-network | | 172.16.1.105 | None | None | ext-network | +--------------+-------------+----------+-------------+ # nova add-floating-ip vm01 172.16.1.101 # ssh -i ~/mykey.pem fedora@172.16.1.101 The authenticity of host '172.16.1.101 (172.16.1.101)' can't be established. RSA key fingerprint is b7:24:54:63:1f:02:33:4f:81:a7:47:90:c1:1b:78:5a. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.16.1.101' (RSA) to the list of known hosts. Hello, World! [fedora@vm01 ~]$
  • 31. 31 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Horizon (대시보드) Keystone (사용자 인증) Neutron (가상 네트워크) Cinder (블록 볼륨) Nova (VM 인스턴스) Glance (VM 템플릿) Cinder를 이용한 블록 볼륨 생성 ■ Cinder API를 사용해서 블록 볼륨을 생성/삭제하거나 스냅샷을 만들 수 있다. - 실행 중인 인스턴스에 블록 볼륨을 연결/분리할 때, Nova API에 요청을 보내야 한다. 그런 다음 Nova는 API 호출을 통해 Cinder와 함께 작동한다. 블록 볼륨 연결
  • 32. 32 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 블록 볼륨에 대한 명령 작업 ■ 다음은 5GB 블록 볼륨 하나를 생성하고, 실행 중인 인스턴스에 연결/분리하는 예이다. # cinder create --display-name volume01 5 # cinder list +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ | 78b4d23b-3b57-4a38-9f6e-10e5048170ef | available | volume01 | 5 | None | false | | +--------------------------------------+-----------+--------------+------+-------------+----------+-------------+ # nova volume-attach vm01 78b4d23b-3b57-4a38-9f6e-10e5048170ef auto +----------+--------------------------------------+ | Property | Value | +----------+--------------------------------------+ | device | /dev/vdb | | serverId | f40c9b76-3891-4a5f-a62c-87021ba277ce | | id | 78b4d23b-3b57-4a38-9f6e-10e5048170ef | | volumeId | 78b4d23b-3b57-4a38-9f6e-10e5048170ef | +----------+--------------------------------------+ # nova volume-detach vm01 78b4d23b-3b57-4a38-9f6e-10e5048170ef 게스트 OS에서 본 장치 이름임
  • 33. 33 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 부팅 볼륨 생성 ■ 템플릿 이미지에서 새로운 볼륨을 생성하여 부팅 블록 볼륨을 만들 수 있다. - 부팅 볼륨을 사용해 블록 볼륨에서 직접 인스턴스를 부팅할 수 있다. - 다음은 기존의 템플릿 이미지에서 부팅 볼륨을 생성하고, 그 볼륨으로 인스턴스를 시작하는 예이다. ("--image" 옵션은 부트 하위 명령어에서 무시되지만, 더미 항목으로 지정해야 한다) # cinder create --image-id 702d0c4e-b06c-4c15-85e5-9bb612eb6414 --display-name Fedora19-bootvol 5 # cinder list +--------------------------------------+-----------+------------------+------+-------------+----------+-------------+ | ID | Status | Display Name | Size | Volume Type | Bootable | Attached to | +--------------------------------------+-----------+------------------+------+-------------+----------+-------------+ | 78b4d23b-3b57-4a38-9f6e-10e5048170ef | available | volume01 | 5 | None | false | | | bdde9405-8be7-48d5-a879-35e37c97512f | available | Fedora19-bootvol | 5 | None | true | | +--------------------------------------+-----------+------------------+------+-------------+----------+-------------+ # nova boot --flavor m1.small --image Fedora19 --key-name mykey --security-groups default --nic net-id=843a1586-6082-4e9f-950f-d44daa83358c --block_device_mapping vda=bdde9405-8be7-48d5-a879-35e37c97512f:::0 vm02 # nova volume-list +----------||-----------+-----------+------------------+------+-------------+--------------------------------------+ | ID || | Status | Display Name | Size | Volume Type | Attached to | +----------||-----------+-----------+------------------+------+-------------+--------------------------------------+ | 78b4d23b-||e5048170ef | available | volume01 | 5 | None | | | bdde9405-||e37c97512f | in-use | Fedora19-bootvol | 5 | None | b4cb7edd-317f-44e9-97db-5a04c41a4510 | +----------||-----------+-----------+------------------+------+-------------+--------------------------------------+ 템플릿 이미지 ID 블록 볼륨 ID 인스턴스를 삭제한 후 볼륨을 제거하기 위한 플래그 (1=yes)
  • 34. 34 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Nova와 Cinder 내부 서비스
  • 35. 35 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Nova 내부 서비스 /var/lib/nova/instances/_base qcow2 기본 이미지 qcow2 오버레이 이미지 qcow2 오버레이 이미지 VM 인스턴스 /var/lib/nova/instances/<ID> 오버레이 VM 인스턴스 템플릿 이미지 다운로드 Glance VM 시작 Compute 노드 Nova API VM 시작을 명령 Compute DriverVM을 시작하기 위한 compute 노드 선택 Nova Conductor 자원 정보 검색 Nova Compute 사용할 특정 하이퍼바이저에 대한 드라이버 Database DB 액세스에 대한 프록시 서비스 자원 정보 업데이트 Controller 노드 REST API 제공 정의한 기간 동안 다운로드한 이미지가 캐시됨 Nova Scheduler 메시징 서버를 통한 통신 Libvirt
  • 36. 36 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 메시징 서버의 작동 방법 ■ 하나의 컴포넌트(예: Nova)에 대한 에이전트와 내부 서비스는 메시징 서버를 통해 통신한다. - 메시징 서버는 통신 채널로 "topics"를 제공한다. 송신자는 지정한 topic에 메시지를 넣는다. 그런 다음 수신자가 가입한 topic에서 메시지를 선택한다. - topic의 메시지는 "모든 가입자가 수신해야 함" 또는 "하나의 가입자만 수신해야 함"과 같은 제공 모델을 지정하는 플래그를 가지고 있다. - 다수의 송신자는 동일한 topic에 메시지를 넣을 수 있기 때문에, M:N 비 동기 통신을 수행한다. 메시징 서버 Topic A 메시지 송신 메시지 수신 service service service service topic A에 가입된 서비스들 Topic B ・・
  • 37. 37 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. qcow2 디스크 이미지의 기능 ■ qcow2는 다음과 같은 기능을 가진 가상 머신을 위해 설계된 디스크 이미지 형식이다. ■ 동적 블록 할당 - 실제(물리적) 파일 크기는 논리 이미지 크기보다 작다. 데이터가 추가될 때 파일이 커진다. 논리적 크기를 확장하는 것도 가능하다. ■ 오버레이 메커니즘 - 백업 이미지의 상단에 오버레이 파일을 추가할 수 있다. 오버레이 파일은 백업 이미지에서 추가 변경 사항만 담고 있다. - 백업 이미지는 여러 오버레이 파일들과 함께 공유될 수 있다. 동일한 템플릿 이미지의 가상 머신이 많이 실행되는 환경에서 물리적 디스크 사용량을 줄이는 데 유용하다. ■ 여러 스냅샷 - 이미지의 스냅샷을 생성함으로써, 이미지의 이전 내용을 재현하거나 스냅샷으로부터 새로운 이미지를 생성할 수 있다.
  • 38. 38 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. # qemu-img create -f qcow2 baseimage.qcow2 5G Formatting 'baseimage.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off # qemu-img create -f qcow2 -b baseimage.qcow2 layerimage.qcow2 Formatting 'layerimage.qcow2', fmt=qcow2 size=5368709120 backing_file='baseimage.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off # qemu-img info layerimage.qcow2 image: layerimage.qcow2 file format: qcow2 virtual size: 5.0G (5368709120 bytes) disk size: 196K cluster_size: 65536 backing file: baseimage.qcow2 # qemu-img snapshot -c snap01 layerimage.qcow2 # qemu-img snapshot -l layerimage.qcow2 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 snap01 0 2013-11-22 17:08:02 00:00:00.000 # qemu-img convert -f qcow2 -O qcow2 -s snap01 layerimage.qcow2 copiedimage.qcow2 qcow2 디스크 이미지에 대한 작업 ■ qemu-img는 qcow2 이미지를 조작할 수 있는 명령 도구이다. 참조:  https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html-single/    Virtualization_Administration_Guide/index.html#sect-Virtualization-Tips_and_tricks-Using_qemu_img 5GB 논리 크기를 가진 이미지 생성 백업 이미지로 선택한 baseimg.qcow2에 오버레이 파일 생성 스냅샷 생성 스냅샷으로부터 새로운 이미지 생성
  • 39. 39 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 공개 키 입력 메커니즘 ■ Nova Compute는 인스턴스를 시작하기 전에 로컬 디스크 이미지의 "/root/.ssh/authorized_keys"에 공개 키를 입력한다. ■ 메타 데이터(*)를 통해 공개 키를 검색할 수 있는 Cloud-Init도 부팅 시 공개 키 인증을 설정하는 데 사용할 수 있다. - root 사용자 로그인을 허용하는 것이 대부분의 경우 바람직하지 않기 때문에, 일반 사용자를 생성하고 그 사용자에 대한 공개 키 인증을 설정하는 데 Cloud-Init을 구성하는 것이 낫다. (*) 특히 블록 볼륨에서 부팅할 때, Nova Compute는 공개 키를 입력할 수 없다. 이럴 경우 Cloud-Init 사용이 필수이다. $ curl http://169.254.169.254/2009-04-04/meta-data/public-keys/0/openssh-key ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5W2IynhVezp+DpN11xdsY/8NOqeF8r7eYqVteeWZSBfnYhKn 8D85JmByBQnJ7HrJIrdMvfTYwWxi+swfFlryG3A+oSll0tT71FLAWnAYz26ML3HccyJ7E2bD66BSditbDITK H3V66oN9c3rIEXZYQ3A+GEiA1cFD++R0FNKxyBOkjduycvksB5Nl9xb3k6z4uoZ7JQD5J14qnooM55Blmn2C C2/2KlapxMi0tgSdkdfnSSxbYvlBztGiF3M4ey7kyuWwhE2iPBwkV/OhANl3nwHidcNdBrAGC3u78aTtUEwZ tNUqrevVKM/yUfRRyPRNivuGOkvjTDUL/9BGquBX9Q== enakai@kakinoha 메타 데이터로부터 공개 키를 가져오는 중.
  • 40. 40 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 블록 볼륨 사용 사례 및 해당 API 사용자 데이터 (3) 스냅샷 생성 (4) 스냅샷으로부터 새로운 블록 볼륨 생성 (2) 사용자 데이터 저장을 위해 실행 중인 인스턴스에 연결 사용자 데이터 다른 인스턴스에 다시 연결할 수도 있음 (1) 새로운 블록 볼륨 생성 OS OS OS 템플릿 이미지로부터 블록 볼륨 생성 OS템플릿 이미지 ■ Cinder API - volume create/delete/list/show (스냅샷, 이미지로부터 생성) - snapshot create/delete/list/show ■ Nova API - volume attach/detach
  • 41. 41 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Nova와 Cinder가 함께 작동하는 방법 Nova Compute Cinder VM 인스턴스 /dev/vdb 가상 디스크 Linux KVM /dev/sdX iSCSI LUN 외장 스토리지 LUN 생성 iSCSI SW Initiator iSCSI Target ■ 일반적인 구성에서 블록 볼륨은 iSCSI 스토리지의 LUN으로 생성된다. Cinder는 해당 드라이버를 통해 스토리지의 관리 인터페이스에서 작동한다. ■ Nova Compute는 소프트웨어 초기화 프로그램을 사용해 호스트 리눅스에 연결한다. 그런 다음 KVM 하이퍼바이저를 통해 VM 인스턴스에 연결한다.
  • 42. 42 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Cinder 내부 서비스 ■ 볼륨 드라이버는 해당 스토리지의 관리 인터페이스를 처리한다. - 여러 종류의 스토리지를 사용할 때, Cinder Scheduler는 요청된 스토리지 형식에 따라 사용되는 드라이버를 선택한다. Cinder API Controller 노드 REST API 제공 Cinder-Volume Cinder Scheduler Volume Driver 특정 유형의 스토리지에 대한 드라이버 적당한 볼륨 드라이버 선택 LUN iSCSI 연결 Nova Compute LUN 생성 Nova API REST API 제공 Database 볼륨 정보 외장 스토리지 메시징 서버를 통한 통신
  • 43. 43 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Nova ComputeVM instance /dev/vdb Linux KVM /dev/sdX iSCSI LUN LVM 드라이버 사용 ■ Cinder는 외장 스토리지 대신 리눅스의 LVM을 사용하는 레퍼런스 구현으로 LVM 드라이버를 제공한다. - 스냅샷 기능은 기본 볼륨과 동일한 크기를 갖는 델타 볼륨에 LVM 스냅샷으로 구현된다. Cinder iSCSI SW Target (tgtd) VG: cinder-volumes LV 논리 볼륨 생성 및 iSCSI LUN으로 내보내기 iSCSI SW Initiator 가상 디스크
  • 44. 44 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. NFS 드라이버 사용 ■ Cinder는 스토리지 백엔드로 NFS 서버를 사용하는 NFS 드라이버를 제공한다. - 드라이버는 단순히 export된 NFS 디스크를 직접 마운트하고, 그 위에 디스크 이미지 파일을 생성한다. Compute 노드는 이미지 파일들을 액세스하기 위해 NFS 마운트를 사용한다. 가상 디스크 NFS server NFS 마운트 ・・・ NFS 마운트 ・・・ Nova ComputeVM instance /dev/vdb Linux KVM Cinder
  • 45. 45 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. GlusterFS 드라이버 사용 ■ GlusterFS 분산 파일시스템을 위한 드라이버도 있다. - 현재는 FUSE 마운트 메커니즘을 사용한다. FUSE 레이어를 우회하는 좀 더 최적화된 메커니즘 (libgfapi)으로 대체될 예정이다. Cinder GlusterFS 클러스터 FUSE 마운트 FUSE 마운트 ・・・ 가상 디스크 ・・・ Nova ComputeVM instance /dev/vdb Linux KVM
  • 46. 46 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Neutron 아키텍처 개요
  • 47. 47 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Neutron 가상 네트워크의 논리적 관점 ■ 각 테넌트(tenant)는 마치 "홈 네트워크의 브로드밴드 라우터"와 같이 동작하는 가상 라우터를 소유한다. - 테넌트 사용자들은 라우터 아랫단에 가상 스위치들을 추가하고 사설 서브넷 주소(private subnet address)를 할당한다. 서브넷은 다른 테넌트와 중복 사용이 가능하다. ■ 인스턴스를 시작할 때 최종 사용자는 연결할 가상 스위치를 선택한다. - 인스턴스의 가상 NIC들의 수는 연결할 스위치의 수에 해당한다. DHCP를 통해 Private IP들을 할당한다. 가상 스위치 192.168.101.0/24 테넌트 A의 가상 라우터 외부 네트워크 테넌트 B의 가상 라우터 가상 스위치 192.168.102.0/24
  • 48. 48 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Neutron 플러그인 아키텍처 ■ 가상 네트워크 생성의 실제 작업은 플러그인 Agent가 수행한다. - 벤더들의 상용 제품을 포함해서 Neutron을 위한 다양한 플러그인이 있다. - 오픈스택은 표준/참조 구현으로 "LinuxBridge 플러그인"과 "Open vSwitch 플러그인"을 제공한다. Compute 노드 Neutron 서비스 L2 Agent Controller 노드 REST API 제공 네트워크 컨트롤러 L3 Agent DHCP Agent L2 Agent 가상 라우터 생성 가상 L2 스위치 생성 사설 IP 주소 할당 가상 L2 스위치 생성 메시징 서버를 통한 통신
  • 49. 49 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 표준 플러그인과 네트워크 구성 ■ 다음은 LinuxBridge 플러그인 또는 Open vSwitch 플러그인을 이용한 일반적인 구성의 예이다. - 네트워크 노드의 L3 Agent는 사설 및 공용 네트워크를 연결하는 가상 라우터 기능을 제공한다. (각 노드의 "eth0"는 호스트 리눅스를 액세스하는 데 사용하고, VM 인스턴스 통신에 사용하지 않음) - 여러 네트워크 노드를 가질 수는 없다. 확장 가능한 네트워크 기능은 개발 중이다. ・・・ 사설 네트워크 eth0 eth1 eth2 Network 노드 eth0 eth1 Compute 노드 공용 네트워크 L3 Agent L2 Agent DHCP Agent VM L2 Agent VM eth0 eth1 VM L2 Agent VM 가상 라우터 기능 제공 仮想スイッチ作成가상 L2 스위치 생성사설 네트워크를 위한 DHCP 기능 제공
  • 50. 50 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. LinuxBridge 플러그인 내부 아키텍처
  • 51. 51 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. LinuxBridge 플러그인 내부 아키텍처 ■ 여기서는 LinuxBridge 플러그인이 가상 네트워크를 구현하는 방법에 대해 구체적인 예를 들어 설명한다. 가상 라우터 가상 L2 스위치 private01 vm01 vm02 vm03 외부 네트워크 가상 L2 스위치 private02
  • 52. 52 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Compute 노드 내부 구성 ■ 리눅스 브리지는 각 가상 스위치에 대해 생성된다. Compute 노드 이외의 각 스위치의 네트워크 트래픽은 VLAN으로 분리된다. brqxxxx eth1.101 eth1.102 brqyyy eth1 private01 private02 vm01 eth0 IP VLAN101 VLAN102 사설 네트워크에 대한 물리 L2 스위치 vm02 eth0 IP eth1 IP vm03 eth0 IP L2 Agent에 의해 구성 Nova Compute에 의해 구성 네트워크 노드에서 dnsmasq로부터 IP가 할당됨 각 가상 L2 스위치에 대한 VLAN이 생성됨
  • 53. 53 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 네트워크 노드 내부 구성 qr-YYY IP qr-WWW IP To/From 사설 네트워크 To/From 공용 네트워크 eth1 brqxxxx brqxxxx eth1.101 eth1.102 brqyyy eth2 private01 private02 L2 Agent에 의해 구성 ns-XXX dnsmasq ns-ZZZ dnsmasq qg-VVV IP외부 GW IP 내부 GW IP NAT와 필터링은 iptables로 처리 L3 Agent에 의해 구성 개념적으로 이곳에 가상 라우터가 존재함 ■ 가상 라우터는 리눅스의 패킷 포워딩 기능을 사용하여 구현한다. ■ dnsmasq는 각 서브넷에 대한 사설 IP 주소를 제공하는 DHCP 서버로 사용된다. - 할당된 IP 주소는 가상 NIC의 MAC 주소에 대응한다. IP IP DHCP Agent에 의해 구성 각 서브넷에 대해 dnsmasq가 시작됨
  • 54. 54 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Open vSwitch 플러그인 내부 아키텍처
  • 55. 55 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Open vSwitch는 무엇인가? ■ Open vSwitch는 리눅스의 상단에 가상 L2 스위치를 생성하는 소프트웨어이다. 물리적 L2 스위치 제품에 비해 다양한 기능을 지원한다. - 특히 정교한 패킷 제어 기능을 제공하는 OpenFlow 프로토콜을 지원하기 때문에, Open vSwitch는 가상 네트워크 어플리케이션에 널리 사용되고 있다. ● Visibility into inter-VM communication via NetFlow, sFlow(R), IPFIX, SPAN, RSPAN, and GRE-tunneled mirrors ● LACP (IEEE 802.1AX-2008) ● Standard 802.1Q VLAN model with trunking ● BFD and 802.1ag link monitoring ● STP (IEEE 802.1D-1998) ● Fine-grained QoS control ● Support for HFSC qdisc ● Per VM interface traffic policing ● NIC bonding with source-MAC load balancing, active backup, and L4 hashing ● OpenFlow protocol support (including many extensions for virtualization) ● IPv6 support ● Multiple tunneling protocols (GRE, VXLAN, IPsec, GRE and VXLAN over IPsec) ● Remote configuration protocol with C and Python bindings ● Kernel and user-space forwarding engine options ● Multi-table forwarding pipeline with flow-caching engine ● Forwarding layer abstraction to ease porting to new software and hardware platforms Open vSwitch 지원 기능(http://openvswitch.org/features/)
  • 56. 56 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. OpenFlow는 무엇인가? ■ OpenFlow는 외부 컨트롤러에서 패킷 포워딩의 제밀한 제어를 제공하는 프로토콜이다. - OpenFlow 스위치는 수신된 패킷을 처리하는 방법에 대해 외부 컨트롤러를 쿼리한다. - 컨트롤러 소프트웨어의 프로그래밍이 패킷 조작의 유연성을 제공하기 때문에 멀티 테넌트 가상 네트워크 생성에 적합하다. 예를 들어, 헤더에 VLAN 태그를 수정하여 소스/목적지 MAC 주소에 따라 포트 포워딩을 결정할 수 있다. OpenFlow 컨트롤러 OpenFlow 스위치 컨트롤러는 패킷이 OpenFlow 프로토콜을 통해 처리되는 방법을 지시함
  • 57. 57 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Open vSwitch 플러그인 내부 아키텍처 ■ 여기서는 Open vSwitch 플러그인이 가상 네트워크를 구현하는 방법에 대해 구체적인 예를 들어 설명한다. vm01 vm02 vm03 vm04 테넌트 B의 가상 라우터 테넌트 A의 가상 라우터 외부 네트워크 가상 L2 스위치 projectA 가상 L2 스위치 project B
  • 58. 58 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Compute 노드 내부 구성 (1) ■ 설명은 다음 페이지를 참조한다. br-priv vm01 eth0 br-int eth1 IP phy-br-priv int-br-priv qvoXXX vm02 eth0 IP qvoYYY 포트 VLAN tag:1 qvoZZZ qvoWWW 포트 VLAN tag:2 vm04 eth0 IP VLAN101 VLAN102 Open vSwitch vm03 eth0 IP Nova Compute에 의해 구성 L2 Agent에 의해 구성 "내부"와 "외부" VLAN 간의 변환 - 내부 VLAN1<->외부l VLAN101 - 내부VLAN2<->외부 VLAN102 각 가상 L2 스위치에 "내부 VLAN"이 할당됨
  • 59. 59 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Compute 노드 내부 구성 (2) ■ VM 인스턴스의 가상 NIC는 공통 "통합 스위치(brint)"에 연결된다. - 연결되는 (논리) 가상 L2 스위치에 따라 연결된 포트에 내부 VLAN이 할당된다. ■ 사설 네트워크에 대한 물리적 L2 스위치의 연결은 "사설 스위치(br-priv)"를 통해 이루어진다. - 외부 VLAN은 (논리) 가상 L2 스위치에 따라 물리적 스위치에 할당된다. 내부 및 외부 VLAN 간의 변환은 OpenFlow로 이루어진다. ■ VLAN 이외에, 물리적 네트워크 연결을 통해 사용할 수 있는 GRE 터널링 같은 다른 분리 메커니즘이 있다. - GRE 터널링의 경우, "내부 VLAN" 및 "GRE 터널 ID"간의 변환은 OpenFlow로 이루어진다.
  • 60. 60 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. dnsmasq eth2 br-int br-priv phy-br-priv int-br-priv tapXXX qr-YYY 포트 VLAN tag:1 IP IP qg-CCC br-ex eth1 qr-BBB IP dnsmasq tapAAA IP IP 포트 VLAN tag:2 네트워크 노드 내부 구성 To/From 사설 네트워크 To/From 공용 네트워크 L2 Agent에 의해 구성 "내부"와 "외부" VLAN 간의 변환 - 내부 VLAN1<->외부 VLAN101 - 내부 VLAN2<->외부 VLAN102 qg-VVV IP L3 Agent에 의해 구성 ■ 두 개의 가상 라우터가 구성되어 있기 때문에 패킷 전달의 두 가지 경로가 있다. DHCP Agent에 의해 구성 NAT와 필터링은 iptables로 처리
  • 61. 61 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 네트워크 namespace와 중복 서브넷 ■ 다수의 가상 라우터를 사용하는 경우, 네트워크 노드는 여러 테넌트 사이에서 서브넷을 중복해서 사용할 수 있도록 각각의 가상 라우터에 대해 독립된 NAT/필터링 구성을 가질 필요가 있다. 여러 개의 독립된 네트워크 구성을 가질 수 있는 리눅스의 네트워크 namespace 기능으로 구현이 가능하다. ■ 다음은 네트워크 namespace를 사용하는 단계이다. - 새로운 namespace를 생성한다. - Namespace 내부 네트워크 포트를 할당한다.(물리적 및 논리적 포트를 모두 사용할 수 있음) - Namespace 내부에서 네트워크를 구성(포트 구성, iptables 구성 등)한다. - 그런 다음 이 구성은 namespace 내부의 네트워크 포트를 통해 이동하는 네트워크 패킷에 적용된다. ■ LinuxBridge / Open vSwitch 플러그인의 L3 Agent는 네트워크 namespace를 사용한다. - Namespace를 사용하지 않도록 구성할 수 있지만, 이 경우 중복 서브넷 사용은 비활성화 되어야 한다.
  • 62. 62 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Open vSwitch 플러그인 개념도 (1) ■ 설명은 다음 페이지를 참조한다. 외부 네트워크 단 가상 라우터의 GW IP eth2 br-ex eth1 iptables로 NAT 연결 사설 네트워크 단 가상 라우터의 GW IP Open vSwitch eth1 VM1 VM2 br-int br-int 가상 L2 스위치에 대한 VLAN ID 매핑은 OpenFlow로 처리됨 VLAN Trunk Compute 노드 네트워크 노드 dnsmasq dnsmasq br-priv 외부 네트워크 br-priv 네트워크 namespace 가상 L2 스위치에 대한 VLAN ID 매핑은 OpenFlow로 처리됨
  • 63. 63 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Open vSwitch 플러그인 개념도 (2) ■ 최종 사용자가 가상 L2 스위치 및 가상 라우터와 같은 가상 네트워크 컴포넌트를 정의할 때, Agent는 다음과 같이 작동한다. - 가상 L2 스위치가 정의되면, compute 노드가 VLAN을 통해 서로 연결되어 있으므로 L2 Agent는 "br-int"와 "br-priv"에 VLAN ID 매핑을 구성한다. 동시에, DHCP Agent는 해당하는 VLAN에 DHCP 기능을 제공하는 dnsmsq를 새로 시작한다. - 가상 라우터가 정의되고 외부 네트워크에 연결될 때, L3 Agent나 가상 라우터의 외부 게이트웨이로 동작하는 "br-ex"에 포트를 생성한다. - 가상 L2 스위치가 가상 라우터에 연결될 때, L3 Agent는 가상 라우터의 내부 게이트웨이로 동작하는 "brex"에 포트를 생성한다. 또한 사설 및 공용 네트워크 간의 NAT 연결을 시작하기 위해 iptables를 구성한다. ■ 이미 설명한 Agent 뿐 아니라, 메타데이터 메커니즘을 돕는 "Metadata Proxy Agent"도 존재한다. - 네트워크 노드의 iptables는 "169.254.169.254:80"으로 전송되는 패킷들을 Metadata Proxy Agent로 리디렉션하도록 구성된다. 이 Agent는 소스 IP주소로부터 패킷 전송하는 인스턴스를 결정하고, 요청된 메타데이터를 포함한 해당 메시지를 반송한다.
  • 64. 64 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. Metadata Proxy Agent로 패킷 리디렉션 ■ 다음 명령은 가상 라우터를 포함하는 네임스페이스 내에서의 iptables 구성을 보여준다. 동일한 노드에서 "169.254.169.254:80"으로 전송되는 패킷이 Metadata Proxy Agent로 리디렉션 되는 항목이 있다. ■ 주의: 메타데이터 메커니즘을 사용하는 경우 게스트 OS의 "/etc/sysconfig/network"에 "NOZEROCONF=yes"로 설정해야 한다. - 설정하지 않으면, "169.254.0.0/16"으로 전송되는 패킷은 APIPA specification 때문에 게스트 OS 외부로 전달되지 않는다. # ip netns list qrouter-b35f6433-c3e7-489a-b505-c3be5606a643 qdhcp-1a4f4b41-3fbb-48a6-bb12-9621077a4f92 qrouter-86654720-d4ff-41eb-89db-aaabd4b13a35 qdhcp-f8422fc9-dbf8-4606-b798-af10bb389708 # ip netns exec qrouter-b35f6433-c3e7-489a-b505-c3be5606a643 iptables -t nat -L ... Chain quantum-l3-agent-PREROUTING (1 references) target prot opt source destination REDIRECT tcp -- anywhere 169.254.169.254 tcp dpt:http redir ports 9697 ... # ps -ef | grep 9697 root 63055 1 0 7月09 ? 00:00:00 python /bin/quantum-ns-metadata-proxy --pid_file=/var/lib/quantum/external/pids/b35f6433-c3e7-489a-b505-c3be5606a643.pid --router_id=b35f6433-c3e7-489a-b505-c3be5606a643 --state_path=/var/lib/quantum --metadata_port=9697 --verbose --log-file=quantum-ns-metadata-proxyb35f6433-c3e7-489a-b505- c3be5606a643.log --log-dir=/var/log/quantum 가상 라우터를 포함한 nemespace
  • 65. 65 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 가상 네트워크 구성 단계
  • 66. 66 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 가상 네트워크 구성 단계 (1) ■ 다음은 quantum 명령으로 가상 네트워크를 구성하는 단계이다. - 각 설정에 대한 환경 변수를 아래와 같이 지정한다. - 외부 네트워크 "ext-network"를 정의한다. ● 외부 네트워크는 다수의 테넌트가 공유하기 때문에, 테넌트 소유자(--tenant-id)는 "services"(공유 서비스에 대한 일반 테넌트)이며, "--shared" 옵션이 추가된다. ● 외부 네트워크에 VLAN이 없다고 가정하므로, network_type은 “flat"이다. ● 플러그인 설정 파일(plugin.ini)에서 외부 네트워크 연결에 대한 Open vSwitch(br-ex)는 여기서 physical_network로 지정된 alias "physnet1"를 가진다. ● "--router:external=True"는 가상 라우터의 기본 게이트웨이가 되도록 지정한다. tenant=$(keystone tenant-list | awk '/ services / {print $2}') quantum net-create --tenant-id $tenant ext-network --shared --provider:network_type flat --provider:physical_network physnet1 --router:external=True public="192.168.199.0/24" gateway="192.168.199.1" nameserver="192.168.199.1" pool=("192.168.199.100" "192.168.199.199")
  • 67. 67 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 가상 네트워크 구성 단계 (2) - 외부 네트워크의 서브넷을 정의한다. ● "--allocation-pool"은 IP 주소 풀을 지정한다. (라우터 포트와 유동 IP 등으로 오픈스택이 사용하는 IP 주소의 범위) - 테넌트 "demo"에 대한 가상 라우터 "demo_router"를 정의하고, 외부 네트워크에 연결한다. ● 테넌트 소유자(--tenant-id)는 “demo"이다. tenant=$(keystone tenant-list|awk '/ demo / {print $2}') quantum router-create --tenant-id $tenant demo_router quantum router-gateway-set demo_router ext-network quantum subnet-create --tenant-id $tenant --gateway ${gateway} --disable-dhcp --allocation-pool start=${pool[0]},end=${pool[1]} ext-network ${public} bridge_mappings=physnet1:br-ex,physnet2:br-priv tenant_network_type=vlan network_vlan_ranges=physnet1,physnet2:100:199 플러그인 구성 파일(/etc/quantum/plugin.ini)에 Open vSwitch에 대한 alias 설정 Alias와 실제 Open vSwitch 이름 사이의 매핑 각 Open vSwitch에 대한 VLAN ID 범위 (VLAN은 physnet1에 사용되지 않음)
  • 68. 68 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. 가상 네트워크 구성 단계 (3) - 가상 L2 스위치 "private01"을 정의한다. ● VLAN이 사설 네트워크의 분리 메커니즘으로 사용되기 때문에, network_type은 "vlan"을 지정한다. VLAN ID는 segmentation_id로 지정한다. ● 플러그인 구성 파일(plugin.ini)에서 사설 네트워크 연결에 대한 Open vSwitch(br-priv)는 여기서 physical_network로 지정된 alias "physnet2"를 가진다. - "private01"의 서브넷을 정의하고, 가상 라우터에 연결한다. ● 여기서는 예로 서브넷에 대해 "192.168.1.101/24"를 지정한다. quantum net-create --tenant-id $tenant private01 --provider:network_type vlan --provider:physical_network physnet2 --provider:segmentation_id 101 quantum subnet-create --tenant-id $tenant --name private01-subnet --dns-nameserver ${nameserver} private01 192.168.1.101/24 quantum router-interface-add demo_router private01-subnet