68
1 Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved. OpenStack: Inside Out 오픈스택: 구석구석 파헤쳐보기 Etsuji Nakai Senior Soluon Architect Red Hat Ver1.0 2014/02/22 Translated in Korean by Jaehwa Park [email protected]

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

Embed Size (px)

DESCRIPTION

레드햇의 Etsuji Nakai 씨의 "OpenStack: Inside Out" 한글 번역본입니다. 다시 한번 좋은 문서를 공유해주신 Etsuji Nakai 씨에게 감사를 드립니다. http://www.slideshare.net/enakai/open-stack-insideoutv10

Citation preview

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

1

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

OpenStack: Inside Out

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

Etsuji NakaiSenior Solution Architect

Red Hat

Ver1.0 2014/02/22

Translated in Korean by Jaehwa [email protected]

Page 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 LinuxDeploy and Manage by yourself

Professional Linux SystemsDeployment and Management

Professional Linux SystemsNetwork Management

■ Etsuji Nakai- Senior solution architect

and Cloud evangelist at Red Hat.

Professional Linux SystemsTechnology for Next Decade

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

3

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

목차■ 오픈스택 개요■ 오픈스택 주요 컴포넌트■ Nova와 Cinder 내부 아키텍처■ Neutron 아키텍처 개요■ LinuxBridge 플러그인 내부 아키텍처■ Open vSwitch 플러그인 내부 아키텍처■ 가상 네트워크 구성 단계

참고: 본 문서에서는 RDO(Grizzly) 사용을 가정한다.

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

4

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

오픈스택 개요

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

5

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

오픈스택 클라우드의 컴퓨팅 자원■ 오픈스택의 최종 사용자는 웹 콘솔이나 API 등을 통해서 사용자의

프라이빗 테넌트(private tenants)에서 다음의 컴퓨팅 자원들을 생성하고 설정할 수 있다.- 가상 네트워크- VM 인스턴트- 블록 볼륨

사용자 데이터 블록 볼륨

가상 라우터

가상 스위치

외부 네트워크

프로젝트 환경

오픈스택 사용자

OS

■ 각 사용자들은 어떤 프로젝트들에 속한다.- 동일 프로젝트 내의 사용자들은 프로젝트

환경의 공통 컴퓨팅 자원들을 공유한다.- 각 프로젝트는 다른 프로젝트와 독립된

(가상의) 컴퓨팅 자원들을 소유한다.

VM 인스턴스

Page 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에서 사용

지원하는 템플릿 이미지 포맷

Page 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

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

8

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

SSH 접속을 위한 키 쌍 인증■ 사용자는 사전에 공개 키를 등록한다. 새로운 인스턴스가 시작될 때 게스트 OS에 입력된다.

- 각 사용자에 대해 키 쌍이 등록된다. 이 키 쌍들은 여러 사용자들과 공유하지 않는다.

사용자 정보 데이터베이스

VM 인스턴스

(2) 게스트 OS에 공개 키 입력됨

비밀 키

공개 키

(1) 사전에 공개 키 등록

(3) 비밀 키로 인증

Page 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로 접속

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

10

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

인스턴스 유형과 해당 디스크 영역■ 다음은 기본으로 생성되는 인스턴스 유형이다.

- root 디스크는 템플릿 이미지에서 복사된 후 지정된 크기로 확장된다.(m1.tiny 제외)

■ 관리자는 새 인스턴스 유형을 정의할 수 있다.

- 다음은 temp 디스크와 swap 디스크를 사용한 예이다.

- 인스턴스가 소멸될 때 이들 디스크가 삭제되기 때문에 영구 데이터는 다른 장소(일반적으로 블록 볼륨들)에 저장된다.

인스턴스 유형 (flavor) vCPU Memory rootdisk

tempdisk

swapdisk

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 MOUNTPOINTvda 252:0 0 20G 0 disk └─vda1 252:1 0 20G 0 part /vdb 252:16 0 5G 0 disk /mntvdc 252:32 0 1G 0 disk [SWAP] swap disk

root disktemp disk

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

11

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

VM 인스턴스의 스냅샷■ 실행 중인 인스턴스의 스냅샷을 만들어서 root 디스크를 복사할 수 있고, 템플릿 이미지로 다시

사용할 수 있다.

OS

템플릿 이미지

템플릿 이미지로부터 인스턴스 시작

인스턴스 스냅샷

OS

root 디스크의 복사본인 스냅샷 생성

스냅샷으로부터인스턴스 시작

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

12

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

블록 볼륨에서 부팅하기

블록 볼륨으로부터직접 인스턴스 부팅

OS

스냅샷 생성

OS

복제

■ 부팅 블록 볼륨을 생성하기 위해 템플릿 이미지를 새로운 블록 볼륨에 복사할 수 있다.

- 블록 볼륨에서 부팅할 때, 인스턴스가 제거된 경우에도 게스트 OS의 내용이 삭제되지 않고 남아 있다.

- 부팅 볼륨의 스냅샷을 생성하고, 새 인스턴스를 시작할 때 새로운 부팅 볼륨을 생성할 수 있다.

OS

템플릿 이미지로부터블록 볼륨 생성

OS템플릿 이미지

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

13

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

영구 데이터 저장소, 블록 볼륨

사용자 데이터

(3) 스냅샷 생성

(4) 스냅샷으로부터 새로운 블록 볼륨을 생성

(2) 실행 중인 인스턴스에 사용자 데이터를 저장하기 위해 연결

사용자 데이터

다른 인스턴스에 다시 연결할 수 있음

(1) 새로운 블록 볼륨 생성

OS OS

■ 블록 볼륨은 VM 인스턴스를 제거해도 삭제되지 않고 남아 있다. 영구 데이터 저장소로 사용할 수 있다.

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

14

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

오픈스택의 주요 컴포넌트

Page 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: 웹 기반의 셀프 서비스 포털

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

16

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

모듈은 REST API를 통해 함께 동작

VM 템플릿이미지

Nova

ComputeNova

ComputeGlance Horizon Nova

Scheduler Neutron관리용네트워크

디스크이미지

가상 네트워크 생성

가상 머신 시작

가상 디스크 볼륨 연결(iSCSI)

인증 서비스

템플릿 이미지 검색

QPID /MySQL

NetworkNode

NovaCompute

CinderKeystone

Swift

메시지 큐와벡엔드 RDB

공용 네트워크클라이언트 PC

가상 머신 생성

■ 모듈들은 REST API 호출과 메시지 큐를 통해 같이 동작한다.

- 조작(운영)은 REST API를 통한 외부 프로그램으로 자동화할 수 있다.

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

17

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

API 요청 호출■ API 요청이 호출되는 경우는 두 가지가 있다.

- 최종 사용자가 Horizon 대시보드를 통하거나 직접 요청 호출을 보낼 때

- 일부 컴포넌트가 다른 컴포넌트에게 요청 호출을 보낼 때

DatabaseMySQL

MessagingQPID

인프라스트럭처데이터

에이전트로메시지 전달

Horizon(대시보드)

Keystone(사용자 인증)

Neutron(가상 네트워크)

Cinder(블록 볼륨)

Nova(VM 인스턴스)

Glance(VM 템플릿)

템플릿 이미지 다운로드블록 볼륨 연결가상 스위치에 연결

API 호출 Web 액세스

Page 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 템플릿)

Page 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를 확인하고클라이언트의 역할을 점검

Page 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=adminexport OS_TENANT_NAME=adminexport OS_PASSWORD=714f1ab569a64a3bexport 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 | [email protected] || 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을 사용함

Page 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”의 상세 내용 표시

Page 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에서 사용할 수

있다.

Page 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_userexport OS_TENANT_NAME=demoexport OS_PASSWORD=passw0rdexport 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을 사용함

이 파일은 직접 만들어야 함

Page 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 템플릿)

Page 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 템플릿)

템플릿 이미지 다운로드가상 스위치에 연결

Page 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를 통해서네트워크 목록을 얻음

Page 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 |+--------------------------------------+------+--------+-------------------------+

Page 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

Page 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

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

30

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

인스턴스를 시작하는 명령 작업 (3)■ 사용자 정의 스크립트(사용자 데이터)를 사용하기 위해서 "--user-data" 옵션으로 파일을 지정할

수 있다.

- 다음은 사용자 정의 스크립트를 사용하여 인스턴스를 시작하고 유동 IP를 추가하는 예이다.

# cat hello.txt #!/bin/shecho '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 [email protected] 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 ~]$

Page 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와 함께 작동한다.

블록 볼륨 연결

Page 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에서 본 장치 이름임

Page 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)

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

34

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

Nova와 Cinder 내부 서비스

Page 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

Page 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・・

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

37

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

qcow2 디스크 이미지의 기능■ qcow2는 다음과 같은 기능을 가진 가상 머신을 위해 설계된 디스크 이미지 형식이다.

■ 동적 블록 할당

- 실제(물리적) 파일 크기는 논리 이미지 크기보다 작다. 데이터가 추가될 때 파일이 커진다. 논리적 크기를 확장하는 것도 가능하다.

■ 오버레이 메커니즘

- 백업 이미지의 상단에 오버레이 파일을 추가할 수 있다. 오버레이 파일은 백업 이미지에서 추가 변경 사항만 담고 있다.

- 백업 이미지는 여러 오버레이 파일들과 함께 공유될 수 있다. 동일한 템플릿 이미지의 가상 머신이 많이 실행되는 환경에서 물리적 디스크 사용량을 줄이는 데 유용하다.

■ 여러 스냅샷

- 이미지의 스냅샷을 생성함으로써, 이미지의 이전 내용을 재현하거나 스냅샷으로부터 새로운 이미지를 생성할 수 있다.

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

38

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

# qemu-img create -f qcow2 baseimage.qcow2 5GFormatting 'baseimage.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off

# qemu-img create -f qcow2 -b baseimage.qcow2 layerimage.qcow2Formatting '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.qcow2file format: qcow2virtual size: 5.0G (5368709120 bytes)disk size: 196Kcluster_size: 65536backing file: baseimage.qcow2

# qemu-img snapshot -c snap01 layerimage.qcow2 # qemu-img snapshot -l layerimage.qcow2 Snapshot list:ID TAG VM SIZE DATE VM CLOCK1 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에 오버레이 파일 생성

스냅샷 생성

스냅샷으로부터새로운 이미지 생성

Page 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-keyssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA5W2IynhVezp+DpN11xdsY/8NOqeF8r7eYqVteeWZSBfnYhKn8D85JmByBQnJ7HrJIrdMvfTYwWxi+swfFlryG3A+oSll0tT71FLAWnAYz26ML3HccyJ7E2bD66BSditbDITKH3V66oN9c3rIEXZYQ3A+GEiA1cFD++R0FNKxyBOkjduycvksB5Nl9xb3k6z4uoZ7JQD5J14qnooM55Blmn2CC2/2KlapxMi0tgSdkdfnSSxbYvlBztGiF3M4ey7kyuWwhE2iPBwkV/OhANl3nwHidcNdBrAGC3u78aTtUEwZtNUqrevVKM/yUfRRyPRNivuGOkvjTDUL/9BGquBX9Q== enakai@kakinoha

메타 데이터로부터 공개 키를 가져오는 중.

Page 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

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

41

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

Nova와 Cinder가 함께 작동하는 방법

Nova ComputeCinder

VM 인스턴스

/dev/vdb 가상 디스크

Linux KVM

/dev/sdX iSCSI LUN

외장 스토리지

LUN 생성

iSCSI SWInitiator

iSCSI Target

■ 일반적인 구성에서 블록 볼륨은 iSCSI 스토리지의 LUN으로 생성된다. Cinder는 해당 드라이버를 통해 스토리지의 관리 인터페이스에서 작동한다.

■ Nova Compute는 소프트웨어 초기화 프로그램을 사용해 호스트 리눅스에 연결한다. 그런 다음 KVM 하이퍼바이저를 통해 VM 인스턴스에 연결한다.

Page 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 APIREST API 제공

Database

볼륨 정보

외장 스토리지

메시징 서버를 통한 통신

Page 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 SWTarget (tgtd)

VG: cinder-volumes

LV

논리 볼륨 생성 및iSCSI LUN으로 내보내기

iSCSI SWInitiator

가상 디스크

Page 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

Page 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

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

46

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

Neutron 아키텍처 개요

Page 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

Page 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 스위치 생성

메시징 서버를 통한 통신

Page 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 AgentVM

L2 Agent

VM

eth0 eth1

VM

L2 Agent

VM

가상 라우터 기능 제공

仮想スイッチ作成가상 L2 스위치 생성사설 네트워크를 위한DHCP 기능 제공

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

50

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

LinuxBridge 플러그인 내부 아키텍처

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

51

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

LinuxBridge 플러그인 내부 아키텍처■ 여기서는 LinuxBridge 플러그인이 가상 네트워크를 구현하는 방법에 대해 구체적인 예를 들어

설명한다.

가상 라우터

가상 L2 스위치private01

vm01 vm02 vm03

외부 네트워크

가상 L2 스위치private02

Page 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

eth0IP

VLAN101

VLAN102

사설 네트워크에 대한물리 L2 스위치

vm02

eth0IP

eth1IP

vm03

eth0IP

L2 Agent에 의해 구성

Nova Compute에 의해 구성

네트워크 노드에서dnsmasq로부터 IP가 할당됨

각 가상 L2 스위치에 대한VLAN이 생성됨

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

53

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

네트워크 노드 내부 구성

qr-YYYIP

qr-WWWIP

To/From 사설 네트워크

To/From 공용 네트워크

eth1

brqxxxx

brqxxxx

eth1.101 eth1.102

brqyyy

eth2

private01 private02

L2 Agent에 의해 구성

ns-XXX

dnsmasq

ns-ZZZ

dnsmasq

qg-VVVIP외부 GW IP

내부 GW IP

NAT와 필터링은iptables로 처리

L3 Agent에 의해 구성개념적으로 이곳에

가상 라우터가 존재함

■ 가상 라우터는 리눅스의 패킷 포워딩 기능을 사용하여 구현한다.

■ dnsmasq는 각 서브넷에 대한 사설 IP 주소를 제공하는 DHCP 서버로 사용된다.

- 할당된 IP 주소는 가상 NIC의 MAC 주소에 대응한다.

IP IP

DHCP Agent에 의해 구성

각 서브넷에 대해dnsmasq가 시작됨

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

54

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

Open vSwitch 플러그인 내부 아키텍처

Page 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/)

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

56

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

OpenFlow는 무엇인가?■ OpenFlow는 외부 컨트롤러에서 패킷 포워딩의 제밀한 제어를 제공하는 프로토콜이다.

- OpenFlow 스위치는 수신된 패킷을 처리하는 방법에 대해 외부 컨트롤러를 쿼리한다.

- 컨트롤러 소프트웨어의 프로그래밍이 패킷 조작의 유연성을 제공하기 때문에 멀티 테넌트 가상 네트워크 생성에 적합하다. 예를 들어, 헤더에 VLAN 태그를 수정하여 소스/목적지 MAC 주소에 따라 포트 포워딩을 결정할 수 있다.

OpenFlow 컨트롤러

OpenFlow 스위치

컨트롤러는 패킷이 OpenFlow 프로토콜을통해 처리되는 방법을 지시함

Page 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

Page 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

eth0IP

qvoYYY

포트 VLAN tag:1qvoZZZ qvoWWW

포트 VLAN tag:2

vm04

eth0IP

VLAN101

VLAN102Open vSwitch

vm03

eth0IP

Nova Compute에 의해 구성

L2 Agent에 의해 구성

"내부"와 "외부" VLAN 간의 변환- 내부 VLAN1<->외부l VLAN101- 내부VLAN2<->외부 VLAN102

각 가상 L2 스위치에 "내부 VLAN"이 할당됨

Page 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로 이루어진다.

Page 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-VVVIP

L3 Agent에 의해 구성

■ 두 개의 가상 라우터가 구성되어 있기 때문에 패킷 전달의 두 가지 경로가 있다.

DHCP Agent에 의해 구성

NAT와 필터링은iptables로 처리

Page 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를 사용하지 않도록 구성할 수 있지만, 이 경우 중복 서브넷 사용은 비활성화 되어야 한다.

Page 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로 처리됨

Page 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주소로부터 패킷 전송하는 인스턴스를 결정하고, 요청된 메타데이터를 포함한 해당 메시지를 반송한다.

Page 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 listqrouter-b35f6433-c3e7-489a-b505-c3be5606a643qdhcp-1a4f4b41-3fbb-48a6-bb12-9621077a4f92qrouter-86654720-d4ff-41eb-89db-aaabd4b13a35qdhcp-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 9697root 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

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

65

Copyright of the original (c) 2014 Etsuji Nakai (Red Hat), All Rights Reserved.

가상 네트워크 구성 단계

Page 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")

Page 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_routerquantum 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-privtenant_network_type=vlannetwork_vlan_ranges=physnet1,physnet2:100:199

플러그인 구성 파일(/etc/quantum/plugin.ini)에 Open vSwitch에 대한 alias 설정

Alias와 실제 Open vSwitch 이름 사이의 매핑각 Open vSwitch에 대한 VLAN ID 범위(VLAN은 physnet1에 사용되지 않음)

Page 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/24quantum router-interface-add demo_router private01-subnet